Prometheus로 멀티클러스터 Istio 모니터링하기
Prometheus로 멀티클러스터 Istio 모니터링하기 (Monitoring Multicluster Istio with Prometheus)
두 개 이상의 쿠버네티스 클러스터로 구성된 Istio 메시의 모니터링을 구성하는 방법에 대한 운영 가이드예요. Prometheus의 계층적 페더레이션을 기반으로 한 접근 방식을 배워요.
출처: Istio 문서
본문
개요
이 가이드는 두 개 이상의 개별 쿠버네티스 클러스터로 구성된 Istio 메시의 모니터링 구성을 위한 운영 지침을 제공하기 위한 것이에요. 유일한 가능한 경로를 확립하기 위한 것이 아니라, Prometheus로 멀티클러스터 텔레메트리를 구성하는 실용적인 접근 방식을 보여주기 위한 것이에요.
Prometheus로 Istio의 멀티클러스터 모니터링에 대한 우리의 권장 사항은 Prometheus 계층적 페더레이션(hierarchical federation)의 기반 위에 세워져 있어요. 각 클러스터에 Istio가 로컬로 배포한 Prometheus 인스턴스가 초기 수집기로 작동한 다음, 프로덕션 메시 전체 Prometheus 인스턴스로 페더레이션돼요. 그 메시 전체 Prometheus는 메시 외부(외부)에 있거나 메시 내부의 클러스터 중 하나에 있을 수 있어요.
멀티클러스터 Istio 설정
지원되는 멀티클러스터 배포 모델 중 하나로 Istio 클러스터를 설정하려면 멀티클러스터 설치 섹션을 따르세요. 이 가이드의 목적상 그 중 어떤 접근 방식이든 다음 주의사항과 함께 작동해요.
각 클러스터에 클러스터 로컬 Istio Prometheus 인스턴스가 설치되어 있는지 확인하세요.
각 클러스터에 개별 Istio Prometheus 배포가 있어야 외부에서 실행되거나 클러스터 중 하나에서 실행되는 프로덕션급 Prometheus 인스턴스로의 페더레이션을 통해 크로스클러스터 모니터링의 기반을 형성할 수 있어요.
각 클러스터에 Prometheus 인스턴스가 실행 중인지 검증하세요.
$ kubectl -n istio-system get services prometheus
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus ClusterIP 10.8.4.109 <none> 9090/TCP 20h
Prometheus 페더레이션 구성
외부 프로덕션 Prometheus
Istio 배포 외부에서 Prometheus 인스턴스를 실행하고 싶은 이유는 여러 가지가 있을 수 있어요. 모니터링되는 클러스터와 분리된 장기 모니터링을 원할 수도 있고, 여러 개별 메시를 한 곳에서 모니터링하고 싶을 수도 있으며, 다른 동기가 있을 수도 있어요. 이유가 무엇이든, 모든 게 작동하게 하려면 몇 가지 특별한 구성이 필요해요.
Istio는 Gateways를 통해 클러스터 서비스를 외부로 노출하는 방법을 제공해요. 클러스터 로컬 Prometheus용 ingress gateway를 구성해서 클러스터 내 Prometheus 엔드포인트에 외부 연결을 제공할 수 있어요.
각 클러스터에 대해 Remotely Accessing Telemetry Addons 작업의 적절한 지침을 따르세요. 또한 보안(HTTPS) 접근을 설정하는 것이 좋습니다.
다음으로, 외부 Prometheus 인스턴스가 다음과 같은 구성을 사용해 클러스터 로컬 Prometheus 인스턴스에 접근하도록 구성하세요(ingress 도메인과 클러스터 이름을 바꾸세요).
scrape_configs:
- job_name: 'federate-{{CLUSTER_NAME}}'
scrape_interval: 15s
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{job="kubernetes-pods"}'
static_configs:
- targets:
- 'prometheus.{{INGRESS_DOMAIN}}'
labels:
cluster: '{{CLUSTER_NAME}}'
참고:
- CLUSTER_NAME은 클러스터를 만들 때 사용한 값과 동일하게 설정해야 해요(values.global.multiCluster.clusterName으로 설정).
- Prometheus 엔드포인트에 대한 인증이 제공되지 않아요. 이는 누구나 클러스터 로컬 Prometheus 인스턴스를 쿼리할 수 있다는 뜻이에요. 바람직하지 않을 수 있어요.
- 게이트웨이의 적절한 HTTPS 구성이 없으면 모든 것이 평문으로 전송돼요. 바람직하지 않을 수 있어요.
인메시 클러스터의 프로덕션 Prometheus
프로덕션 Prometheus를 클러스터 중 하나에서 실행하는 것을 선호한다면, 그 클러스터에서 메시의 다른 클러스터 로컬 Prometheus 인스턴스들로의 연결을 설정해야 해요.
이것은 사실상 외부 페더레이션 구성의 변형일 뿐이에요. 이 경우 프로덕션 Prometheus를 실행하는 클러스터의 구성이 원격 클러스터 Prometheus 스크래핑 구성과 달라요.
프로덕션 Prometheus가 로컬 및 원격 Prometheus 인스턴스 모두에 접근하도록 구성하세요.
먼저 다음 명령을 실행하세요.
$ kubectl -n istio-system edit cm prometheus -o yaml
그런 다음 원격 클러스터들에 대한 구성(각 클러스터의 ingress 도메인과 클러스터 이름으로 대체)을 추가하고, 로컬 클러스터에 대한 구성 하나를 추가하세요.
scrape_configs:
- job_name: 'federate-{{REMOTE_CLUSTER_NAME}}'
scrape_interval: 15s
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{job="kubernetes-pods"}'
static_configs:
- targets:
- 'prometheus.{{REMOTE_INGRESS_DOMAIN}}'
labels:
cluster: '{{REMOTE_CLUSTER_NAME}}'
- job_name: 'federate-local'
honor_labels: true
metrics_path: '/federate'
metric_relabel_configs:
- replacement: '{{CLUSTER_NAME}}'
target_label: cluster
kubernetes_sd_configs:
- role: pod
namespaces:
names: ['istio-system']
params:
'match[]':
- '{__name__=~"istio_(.*)"}'
- '{__name__=~"pilot(.*)"}'