텔레메트리 애드온 원격 접근

텔레메트리 애드온 원격 접근 (Remotely Accessing Telemetry Addons)

Istio 텔레메트리 애드온을 클러스터 밖에서 노출하고 접근하도록 설정하는 방법을 알려드려요.

출처: Istio 문서

본문

이 작업은 Istio를 설정해서 텔레메트리 애드온을 클러스터 밖에서 노출하고 접근하는 방법을 보여줘요.

원격 접근 설정

텔레메트리 애드온에 대한 원격 접근은 여러 가지 방법으로 설정할 수 있어요. 이 작업은 두 가지 기본 접근 방법을 다뤄요: 보안(HTTPS) 방법과 비보안(HTTP) 방법. 보안 방법은 프로덕션이나 민감한 환경에서는 강력히 권장돼요. 비보안 접근은 설정하기 더 간단하지만, 클러스터 밖으로 전송되는 자격 증명이나 데이터를 보호하지 못해요.

두 옵션 모두 먼저 다음 단계를 따라요:

  1. 클러스터에 Istio를 설치해요.

텔레메트리 애드온을 추가로 설치하려면 integrations 문서를 따라요. 2. 애드온을 노출할 도메인을 설정해요. 이 예시에서는 각 애드온을 grafana.example.com 같은 하위 도메인에 노출해요.

istio-ingressgateway의 외부 IP 주소를 가리키는 기존 도메인이 있다면(예: example.com):

$ export INGRESS_DOMAIN="example.com"

도메인이 없다면, 제공된 IP 주소로 자동으로 해석되는 nip.io를 사용할 수 있어요. 프로덕션 사용에는 권장되지 않아요.

$ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
$ export INGRESS_DOMAIN=${INGRESS_HOST}.nip.io

옵션 1: 보안 접근 (HTTPS)

보안 접근에는 서버 인증서가 필요해요. 다음 단계에 따라 자신이 제어하는 도메인용 서버 인증서를 설치하고 설정해요.

이 예시는 프로덕션 사용에는 적합하지 않을 수 있는 자체 서명 인증서를 사용해요. 이런 경우 cert-manager나 다른 도구를 사용해서 인증서를 프로비저닝하는 것을 고려하세요. 게이트웨이에서 HTTPS를 사용하는 일반적인 정보는 HTTPS로 게이트웨이 보안 설정 작업을 방문할 수도 있어요.

  1. 인증서를 설정해요. 이 예시는 openssl을 사용해서 자체 서명합니다.
$ CERT_DIR=/tmp/certs
$ mkdir -p ${CERT_DIR}
$ openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj "/O=example Inc./CN=*.${INGRESS_DOMAIN}" -keyout ${CERT_DIR}/ca.key -out ${CERT_DIR}/ca.crt
$ openssl req -out ${CERT_DIR}/cert.csr -newkey rsa:2048 -nodes -keyout ${CERT_DIR}/tls.key -subj "/CN=*.${INGRESS_DOMAIN}/O=example organization"
$ openssl x509 -req -sha256 -days 365 -CA ${CERT_DIR}/ca.crt -CAkey ${CERT_DIR}/ca.key -set_serial 0 -in ${CERT_DIR}/cert.csr -out ${CERT_DIR}/tls.crt
$ kubectl create -n istio-system secret tls telemetry-gw-cert --key=${CERT_DIR}/tls.key --cert=${CERT_DIR}/tls.crt
  1. 텔레메트리 애드온용 네트워킹 구성을 적용해요.

Grafana를 노출하도록 다음 구성을 적용해요:`$ cat <<EOF | kubectl apply -f - apiVersion: networking.istio.io/v1 kind: Gateway metadata: name: grafana-gateway namespace: istio-system spec: selector: istio: ingressgateway servers:

  • port: number: 443 name: https-grafana protocol: HTTPS tls: mode: SIMPLE credentialName: telemetry-gw-cert hosts:
    • "grafana.${INGRESS_DOMAIN}"

apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: grafana-vs namespace: istio-system spec: hosts:

  • "grafana.${INGRESS_DOMAIN}" gateways:
  • grafana-gateway http:
  • route:
    • destination: host: grafana port: number: 3000

apiVersion: networking.istio.io/v1 kind: DestinationRule metadata: name: grafana namespace: istio-system spec: host: grafana trafficPolicy: tls: mode: DISABLE

EOF gateway.networking.istio.io/grafana-gateway created virtualservice.networking.istio.io/grafana-vs created destinationrule.networking.istio.io/grafana createdKiali를 노출하도록 다음 구성을 적용해요:$ cat <<EOF | kubectl apply -f - apiVersion: networking.istio.io/v1 kind: Gateway metadata: name: kiali-gateway namespace: istio-system spec: selector: istio: ingressgateway servers:

  • port: number: 443 name: https-kiali protocol: HTTPS tls: mode: SIMPLE credentialName: telemetry-gw-cert hosts:
    • "kiali.${INGRESS_DOMAIN}"

apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: kiali-vs namespace: istio-system spec: hosts:

  • "kiali.${INGRESS_DOMAIN}" gateways:
  • kiali-gateway http:
  • route:
    • destination: host: kiali port: number: 20001

apiVersion: networking.istio.io/v1 kind: DestinationRule metadata: name: kiali namespace: istio-system spec: host: kiali trafficPolicy: tls: mode: DISABLE

EOF gateway.networking.istio.io/kiali-gateway created virtualservice.networking.istio.io/kiali-vs created destinationrule.networking.istio.io/kiali createdPrometheus를 노출하도록 다음 구성을 적용해요:$ cat <<EOF | kubectl apply -f - apiVersion: networking.istio.io/v1 kind: Gateway metadata: name: prometheus-gateway namespace: istio-system spec: selector: istio: ingressgateway servers:

  • port: number: 443 name: https-prom protocol: HTTPS tls: mode: SIMPLE credentialName: telemetry-gw-cert hosts:
    • "prometheus.${INGRESS_DOMAIN}"

apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: prometheus-vs namespace: istio-system spec: hosts:

  • "prometheus.${INGRESS_DOMAIN}" gateways:
  • prometheus-gateway http:
  • route:
    • destination: host: prometheus port: number: 9090

apiVersion: networking.istio.io/v1 kind: DestinationRule metadata: name: prometheus namespace: istio-system spec: host: prometheus trafficPolicy: tls: mode: DISABLE

EOF gateway.networking.istio.io/prometheus-gateway created virtualservice.networking.istio.io/prometheus-vs created destinationrule.networking.istio.io/prometheus createdtracing 서비스를 노출하도록 다음 구성을 적용해요:$ cat <<EOF | kubectl apply -f - apiVersion: networking.istio.io/v1 kind: Gateway metadata: name: tracing-gateway namespace: istio-system spec: selector: istio: ingressgateway servers:

  • port: number: 443 name: https-tracing protocol: HTTPS tls: mode: SIMPLE credentialName: telemetry-gw-cert hosts:
    • "tracing.${INGRESS_DOMAIN}"

apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: tracing-vs namespace: istio-system spec: hosts:

  • "tracing.${INGRESS_DOMAIN}" gateways:
  • tracing-gateway http:
  • route:
    • destination: host: tracing port: number: 80

apiVersion: networking.istio.io/v1 kind: DestinationRule metadata: name: tracing namespace: istio-system spec: host: tracing trafficPolicy: tls: mode: DISABLE

EOF gateway.networking.istio.io/tracing-gateway created virtualservice.networking.istio.io/tracing-vs created destinationrule.networking.istio.io/tracing created` 3. 브라우저로 텔레메트리 애드온을 방문해요.

Kiali: https://kiali.${INGRESS_DOMAIN}Prometheus: https://prometheus.${INGRESS_DOMAIN}Grafana: https://grafana.${INGRESS_DOMAIN}Tracing: https://tracing.${INGRESS_DOMAIN}

옵션 2: 비보안 접근 (HTTP)

  1. 텔레메트리 애드온용 네트워킹 구성을 적용해요.

Grafana를 노출하도록 다음 구성을 적용해요:`$ cat <<EOF | kubectl apply -f - apiVersion: networking.istio.io/v1 kind: Gateway metadata: name: grafana-gateway namespace: istio-system spec: selector: istio: ingressgateway servers:

  • port: number: 80 name: http-grafana protocol: HTTP hosts:
    • "grafana.${INGRESS_DOMAIN}"

apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: grafana-vs namespace: istio-system spec: hosts:

  • "grafana.${INGRESS_DOMAIN}" gateways:
  • grafana-gateway http:
  • route:
    • destination: host: grafana port: number: 3000

apiVersion: networking.istio.io/v1 kind: DestinationRule metadata: name: grafana namespace: istio-system spec: host: grafana trafficPolicy: tls: mode: DISABLE

EOF gateway.networking.istio.io/grafana-gateway created virtualservice.networking.istio.io/grafana-vs created destinationrule.networking.istio.io/grafana createdKiali를 노출하도록 다음 구성을 적용해요:$ cat <<EOF | kubectl apply -f - apiVersion: networking.istio.io/v1 kind: Gateway metadata: name: kiali-gateway namespace: istio-system spec: selector: istio: ingressgateway servers:

  • port: number: 80 name: http-kiali protocol: HTTP hosts:
    • "kiali.${INGRESS_DOMAIN}"

apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: kiali-vs namespace: istio-system spec: hosts:

  • "kiali.${INGRESS_DOMAIN}" gateways:
  • kiali-gateway http:
  • route:
    • destination: host: kiali port: number: 20001

apiVersion: networking.istio.io/v1 kind: DestinationRule metadata: name: kiali namespace: istio-system spec: host: kiali trafficPolicy: tls: mode: DISABLE

EOF gateway.networking.istio.io/kiali-gateway created virtualservice.networking.istio.io/kiali-vs created destinationrule.networking.istio.io/kiali createdPrometheus를 노출하도록 다음 구성을 적용해요:$ cat <<EOF | kubectl apply -f - apiVersion: networking.istio.io/v1 kind: Gateway metadata: name: prometheus-gateway namespace: istio-system spec: selector: istio: ingressgateway servers:

  • port: number: 80 name: http-prom protocol: HTTP hosts:
    • "prometheus.${INGRESS_DOMAIN}"

apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: prometheus-vs namespace: istio-system spec: hosts:

  • "prometheus.${INGRESS_DOMAIN}" gateways:
  • prometheus-gateway http:
  • route:
    • destination: host: prometheus port: number: 9090

apiVersion: networking.istio.io/v1 kind: DestinationRule metadata: name: prometheus namespace: istio-system spec: host: prometheus trafficPolicy: tls: mode: DISABLE

EOF gateway.networking.istio.io/prometheus-gateway created virtualservice.networking.istio.io/prometheus-vs created destinationrule.networking.istio.io/prometheus createdtracing 서비스를 노출하도록 다음 구성을 적용해요:$ cat <<EOF | kubectl apply -f - apiVersion: networking.istio.io/v1 kind: Gateway metadata: name: tracing-gateway namespace: istio-system spec: selector: istio: ingressgateway servers:

  • port: number: 80 name: http-tracing protocol: HTTP hosts:
    • "tracing.${INGRESS_DOMAIN}"

apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: tracing-vs namespace: istio-system spec: hosts:

  • "tracing.${INGRESS_DOMAIN}" gateways:
  • tracing-gateway http:
  • route:
    • destination: host: tracing port: number: 80

apiVersion: networking.istio.io/v1 kind: DestinationRule metadata: name: tracing namespace: istio-system spec: host: tracing trafficPolicy: tls: mode: DISABLE

EOF gateway.networking.istio.io/tracing-gateway created virtualservice.networking.istio.io/tracing-vs created destinationrule.networking.istio.io/tracing created` 2. 브라우저로 텔레메트리 애드온을 방문해요.

Kiali: http://kiali.${INGRESS_DOMAIN}Prometheus: http://prometheus.${INGRESS_DOMAIN}Grafana: http://grafana.${INGRESS_DOMAIN}Tracing: http://tracing.${INGRESS_DOMAIN}

정리

  • 관련된 모든 게이트웨이를 제거해요:
$ kubectl -n istio-system delete gateway grafana-gateway kiali-gateway prometheus-gateway tracing-gateway
gateway.networking.istio.io "grafana-gateway" deleted from istio-system namespace
gateway.networking.istio.io "kiali-gateway" deleted from istio-system namespace
gateway.networking.istio.io "prometheus-gateway" deleted from istio-system namespace
gateway.networking.istio.io "tracing-gateway" deleted from istio-system namespace
  • 관련된 모든 VirtualService를 제거해요:
$ kubectl -n istio-system delete virtualservice grafana-vs kiali-vs prometheus-vs tracing-vs
virtualservice.networking.istio.io "grafana-vs" deleted from istio-system namespace
virtualservice.networking.istio.io "kiali-vs" deleted from istio-system namespace
virtualservice.networking.istio.io "prometheus-vs" deleted from istio-system namespace
virtualservice.networking.istio.io "tracing-vs" deleted from istio-system namespace
  • 관련된 모든 DestinationRule을 제거해요:
$ kubectl -n istio-system delete destinationrule grafana kiali prometheus tracing
destinationrule.networking.istio.io "grafana" deleted from istio-system namespace
destinationrule.networking.istio.io "kiali" deleted from istio-system namespace
destinationrule.networking.istio.io "prometheus" deleted from istio-system namespace
destinationrule.networking.istio.io "tracing" deleted from istio-system namespace

더 알아보기 (Learn more)