텔레메트리 애드온 원격 접근
텔레메트리 애드온 원격 접근 (Remotely Accessing Telemetry Addons)
Istio 텔레메트리 애드온을 클러스터 밖에서 노출하고 접근하도록 설정하는 방법을 알려드려요.
출처: Istio 문서
본문
이 작업은 Istio를 설정해서 텔레메트리 애드온을 클러스터 밖에서 노출하고 접근하는 방법을 보여줘요.
원격 접근 설정
텔레메트리 애드온에 대한 원격 접근은 여러 가지 방법으로 설정할 수 있어요. 이 작업은 두 가지 기본 접근 방법을 다뤄요: 보안(HTTPS) 방법과 비보안(HTTP) 방법. 보안 방법은 프로덕션이나 민감한 환경에서는 강력히 권장돼요. 비보안 접근은 설정하기 더 간단하지만, 클러스터 밖으로 전송되는 자격 증명이나 데이터를 보호하지 못해요.
두 옵션 모두 먼저 다음 단계를 따라요:
- 클러스터에 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로 게이트웨이 보안 설정 작업을 방문할 수도 있어요.
- 인증서를 설정해요. 이 예시는
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
- 텔레메트리 애드온용 네트워킹 구성을 적용해요.
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)
- 텔레메트리 애드온용 네트워킹 구성을 적용해요.
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