Prometheus를 사용하여 구성 동기화 모니터링

구성 동기화는 Prometheus를 사용하여 프로세스와 관련된 측정항목을 수집하고 표시합니다.

Prometheus에서 커스텀 측정항목을 가져오도록 Cloud Monitoring을 구성할 수도 있습니다. 그러면 Prometheus와 Monitoring 모두에서 커스텀 측정항목을 확인할 수 있습니다. 자세한 내용은 Prometheus 사용을 참조하세요.

구성 동기화의 여러 저장소에서 동기화하는 경우 Prometheus 사용 외에 리소스를 모니터링할 수 있는 더 많은 방법이 있습니다. 자세한 내용은 다중 저장소 모드에서 구성 동기화 모니터링을 참조하세요.

측정항목 스크랩

모든 Prometheus 측정항목을 포트 8675에서 스크랩할 수 있습니다. 측정항목을 스크랩하기 전에 다음 두 가지 방법 중 하나로 Prometheus용 클러스터를 구성해야 합니다.

  • Prometheus 문서를 따라 스크랩용 클러스터를 구성합니다. 또는

  • Prometheus Operator를 다음 매니페스트와 함께 사용합니다. 그러면 모든 Anthos Config Management 측정항목이 10초마다 스크랩됩니다.

    1. 매니페스트 파일을 저장할 임시 디렉터리를 만듭니다.

      mkdir acm-monitor
      cd acm-monitor
      
    2. curl 명령어를 사용하여 CoreOS 저장소에서 Prometheus Operator 매니페스트를 다운로드합니다.

      curl -o bundle.yaml https://raw.githubusercontent.com/coreos/prometheus-operator/master/bundle.yaml
      

      이 매니페스트는 권장되지 않는 default 네임스페이스를 사용하도록 구성됩니다. 다음 단계에서는 대신 monitoring 네임스페이스를 사용하도록 구성을 수정합니다. 다른 네임스페이스를 사용하려면 네임스페이스를 나머지 단계에서 표시되는 monitoring으로 대체합니다.

    3. 파일을 만들어 위 번들에 있는 ClusterRoleBinding의 네임스페이스를 업데이트합니다.

      # patch-crb.yaml
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: prometheus-operator
      subjects:
      - kind: ServiceAccount
        name: prometheus-operator
        namespace: monitoring # we are patching from default namespace
      
    4. 패치를 적용하고 매니페스트에서 다른 리소스의 네임스페이스를 수정하는 kustomization.yaml 파일을 만듭니다.

      # kustomization.yaml
      resources:
      - bundle.yaml
      
      namespace: monitoring
      
      patchesStrategicMerge:
      - patch-crb.yaml
      
    5. monitoring 네임스페이스를 만듭니다. 네임스페이스에 다른 이름을 사용할 수 있지만 이 경우 이전 단계의 YAML 매니페스트에서 namespace 값도 변경합니다.

      kubectl create namespace monitoring
      
    6. 다음 명령어를 사용하여 kustomized 매니페스트를 적용합니다.

      kubectl apply -k .
      
      until kubectl get customresourcedefinitions servicemonitors.monitoring.coreos.com ; \
      do date; sleep 1; echo ""; done

      두 번째 명령어는 클러스터에서 CRD를 사용할 수 있을 때까지 차단됩니다.

    7. Anthos Config Management에서 측정항목을 스크랩하는 Prometheus 서버를 구성하는 데 필요한 리소스의 매니페스트를 만듭니다.

      # acm.yaml
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: prometheus-acm
        namespace: monitoring
      ---
      apiVersion: rbac.authorization.k8s.io/v1beta1
      kind: ClusterRole
      metadata:
        name: prometheus-acm
      rules:
      - apiGroups: [""]
        resources:
        - nodes
        - services
        - endpoints
        - pods
        verbs: ["get", "list", "watch"]
      - apiGroups: [""]
        resources:
        - configmaps
        verbs: ["get"]
      - nonResourceURLs: ["/metrics"]
        verbs: ["get"]
      ---
      apiVersion: rbac.authorization.k8s.io/v1beta1
      kind: ClusterRoleBinding
      metadata:
        name: prometheus-acm
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: prometheus-acm
      subjects:
      - kind: ServiceAccount
        name: prometheus-acm
        namespace: monitoring
      ---
      apiVersion: monitoring.coreos.com/v1
      kind: Prometheus
      metadata:
        name: acm
        namespace: monitoring
        labels:
          prometheus: acm
      spec:
        replicas: 2
        serviceAccountName: prometheus-acm
        serviceMonitorSelector:
          matchLabels:
            prometheus: config-management
        podMonitorSelector:
          matchLabels:
            prometheus: config-management
        alerting:
          alertmanagers:
          - namespace: default
            name: alertmanager
            port: web
        resources:
          requests:
            memory: 400Mi
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: prometheus-acm
        namespace: monitoring
        labels:
          prometheus: acm
      spec:
        type: NodePort
        ports:
        - name: web
          nodePort: 31900
          port: 9190
          protocol: TCP
          targetPort: web
        selector:
          app: prometheus
          prometheus: acm
      ---
      apiVersion: monitoring.coreos.com/v1
      kind: ServiceMonitor
      metadata:
        name: acm-service
        namespace: monitoring
        labels:
          prometheus: config-management
      spec:
        selector:
          matchLabels:
            monitored: "true"
        namespaceSelector:
          matchNames:
          # If you are using multi-repo mode, change
          # config-management-system to config-management-monitoring
          - config-management-system
        endpoints:
        - port: metrics
          interval: 10s
      
    8. 다음 명령어를 사용하여 매니페스트를 적용합니다.

      kubectl apply -f acm.yaml
      
      until kubectl rollout status statefulset/prometheus-acm -n monitoring; \
      do sleep 1; done
      

      두 번째 명령어는 pod가 실행될 때까지 차단됩니다.

    9. Prometheus 서버의 웹 포트를 로컬 머신에 전달하여 설치를 확인할 수 있습니다.

      kubectl -n monitoring port-forward svc/prometheus-acm 9190
      

      이제 http://localhost:9190에서 Prometheus 웹 UI에 액세스할 수 있습니다.

    10. 임시 디렉터리를 삭제합니다.

      cd ..
      rm -rf acm-monitor
      

사용 가능한 측정항목

구성 동기화는 다음과 같은 측정항목을 수집하여 Prometheus에 제공합니다. 라벨 열에는 각 측정항목에 적용 가능한 모든 라벨이 표시됩니다. 라벨이 없는 측정항목은 시간이 지남에 따라 단일 측정을 나타내는 반면 라벨이 있는 측정항목은 라벨 값의 각 조합에 대해 하나씩 여러 측정을 나타냅니다.

이 테이블이 동기화되지 않으면 Prometheus 사용자 인터페이스의 프리픽스로 측정항목을 필터링할 수 있으며 모든 해당 측정항목은 gkeconfig_ 프리픽스로 시작합니다.

이름 유형 라벨 설명
gkeconfig_importer_cycle_duration_seconds_bucket 히스토그램 status 임포터가 구성을 클러스터로 가져 오려고 시도한 주기 수(각 주기 동안 버킷으로 분배)
gkeconfig_importer_cycle_duration_seconds_count 히스토그램 status 임포터가 구성을 클러스터로 가져 오려고 시도한 주기 수(지속 시간 무시)
gkeconfig_importer_cycle_duration_seconds_sum 히스토그램 status 임포터가 구성을 클러스터로 가져 오려고 시도한 모든 주기 지속 시간의 합계
gkeconfig_importer_namespace_configs 게이지 현재 상태의 네임스페이스 구성 수
gkeconfig_monitor_errors 게이지 component 구성 저장소에서 오류가 발생한 구성 요소별로 그룹화된 오류 수
gkeconfig_monitor_configs 게이지 state 동기화 상태별로 그룹화된 구성(클러스터 및 네임스페이스) 수
gkeconfig_monitor_last_import_timestamp 게이지 최근 가져오기의 타임스탬프입니다.
gkeconfig_monitor_last_sync_timestamp 게이지 최근 동기화의 타임스탬프입니다.
gkeconfig_monitor_sync_latency_seconds_bucket 히스토그램 가져온 동기화로 가져오기 측정 수(두 항목 사이의 대기 시간에 따라 버킷에 분산됨)
gkeconfig_monitor_sync_latency_seconds_count 히스토그램 가져온 동기화로 가져오기 측정 수(둘 사이의 지연 시간 무시)
gkeconfig_monitor_sync_latency_seconds_sum 히스토그램 가져온 모든 가져오기 동기 측정의 지연 시간 합계
gkeconfig_syncer_api_duration_seconds_bucket 히스토그램 operation, type, status 동기화 프로그램이 API 서버에 대해 수행한 호출 수(각 호출 기간에 따라 버킷으로 분배)
gkeconfig_syncer_api_duration_seconds_count 히스토그램 operation, type, status 임포터가 API 서버에 호출한 횟수(지속 시간 무시)
gkeconfig_syncer_api_duration_seconds_sum 히스토그램 operation, type, status 동기화 프로그램이 API 서버에 대해 수행한 모든 호출 지속 시간의 합계
gkeconfig_syncer_controller_restarts_total 카운터 source 네임스페이스 및 클러스터 구성 컨트롤러에 대한 총 재시작 횟수
gkeconfig_syncer_operations_total 카운터 operation, type, status 리소스를 구성에 동기화하기 위해 수행된 총 작업 수
gkeconfig_syncer_reconcile_duration_seconds_bucket 히스토그램 type, status 동기화 프로그램에서 처리한 조정 이벤트 수(기간별로 버킷으로 분배)
gkeconfig_syncer_reconcile_duration_seconds_count 히스토그램 type, status 동기화 프로그램에서 처리한 조정 이벤트 수(지속 시간 무시)
gkeconfig_syncer_reconcile_duration_seconds_sum 히스토그램 type, status 동기화 프로그램에서 처리한 모든 조정 이벤트 기간의 합계
gkeconfig_syncer_reconcile_event_timestamps 게이지 type 동기화 조정 이벤트가 발생했을 때의 타임스탬프

디버깅 절차 예시

다음 예시는 Prometheus 측정항목, 객체 상태 필드, 객체 주석을 사용하여 구성 동기화와 관련된 문제를 감지하고 진단하는 몇 가지 패턴을 보여줍니다. 이러한 예시는 문제를 발견한 상위 수준 모니터링에서 시작한 다음 점진적으로 상세 검색을 통해 문제의 근본 원인을 파악하는 방법을 보여줍니다.

상태별 구성 쿼리

monitor 프로세스는 클러스터에서 구성 동기화가 작동하는 방식에 대한 전반적인 정보를 제공하는 높은 수준의 측정항목을 제공합니다. 오류가 발생했는지 여부를 알 수 있으며 경고를 설정할 수도 있습니다.

gkeconfig_monitor_errors

조정자로 측정항목 쿼리

다중 저장소 모드에서 구성 동기화를 사용하는 경우 RootSync 및 RepoSync 객체를 모니터링할 수 있습니다. RootSync 및 RepoSync 객체는 구성 동기화가 클러스터에서 작동하는 방식에 대한 유용한 정보를 제공하는 상위 수준 측정항목으로 계측됩니다. 거의 모든 측정항목에 조정자 이름이 태그로 지정되므로 오류가 발생했는지 확인하고 이에 대한 알림을 Prometheus에서 설정할 수 있습니다.

조정자는 Git 저장소의 매니페스트를 클러스터에 동기화하는 Pod입니다. RootSync 객체를 만들 때 구성 동기화는 root-reconciler라는 조정자를 만듭니다. RepoSync 객체를 만들 때 구성 동기화는 ns-reconciler-NAMESPACE라는 조정자를 만듭니다. 여기서 NAMESPACE는 RepoSync 객체를 만든 네임스페이스입니다.

Prometheus에서 조정자에 다음 필터를 사용할 수 있습니다.

# Querying Root reconciler
config_sync_reconciler_errors{root_reconciler="root-reconciler"}

# Querying Namespace reconciler for a namespace called retail
config_sync_reconciler_errors{ns_reconciler_retail="ns-reconciler-retail"}

nomos status를 사용하여 오류 표시

Prometheus 측정항목을 사용하여 클러스터의 구성 동기화 상태를 모니터링하는 것 외에 명령줄에서 모든 클러스터의 오류를 출력하는 nomos status 명령어를 사용할 수도 있습니다.

상태별 가져오기 및 동기화 작업 쿼리

구성 동기화는 2단계 프로세스를 사용하여 저장소의 구성을 클러스터에 적용합니다. gkeconfig_monitor_errors 측정항목에 구성요소별로 라벨이 지정되므로 오류가 발생한 위치를 확인할 수 있습니다.

gkeconfig_monitor_errors{component="importer"}
gkeconfig_monitor_errors{component="syncer"}

또한 importer 및 syncer 프로세스 자체의 측정항목을 확인할 수도 있습니다.

gkeconfig_importer_cycle_duration_seconds_count{status="error"}
gkeconfig_syncer_reconcile_duration_seconds_count{status="error"}

구성 동기화의 다중 저장소 모드에서는 조정자가 Git 저장소에서 가져오기 및 소싱과 클러스터 동기화를 처리합니다. reconciler_errors 측정항목에 구성요소별로 라벨이 지정되므로 오류가 발생한 위치를 확인할 수 있습니다.

Prometheus에서 다음 쿼리를 사용할 수 있습니다.

# Check for errors that occurred when sourcing configs from the Git repository.
config_sync_reconciler_errors{component="source"}

# Check for errors that occurred when syncing configs to the cluster.
config_sync_reconciler_errors{component="sync"}

소스 및 동기화 프로세스 자체의 측정항목도 확인할 수 있습니다.

config_sync_parse_duration_seconds{status="error"}
config_sync_apply_duration_seconds{status="error"}
config_sync_remediate_duration_seconds{status="error"}

구성 객체 상태 확인

구성 동기화는 ClusterConfig와 NamespaceConfig, 두 가지 커스텀 Kubernetes 객체를 정의합니다. 이러한 객체는 구성에 마지막으로 적용된 변경과 발생한 오류에 대한 정보가 포함된 상태 필드를 정의합니다. 예를 들어 shipping-dev 네임스페이스에 오류가 있으면 해당 NamespaceConfig의 상태를 확인할 수 있습니다.

kubectl get namespaceconfig shipping-dev -o yaml

객체의 token 주석 확인

구성 동기화를 통해 관리형 Kubernetes 객체가 마지막으로 업데이트된 시기를 알고자 할 수 있습니다. 각 관리형 객체에는 최종 수정 시 Git 커밋의 해시와 수정 사항이 포함된 구성의 경로가 주석으로 지정됩니다.

kubectl get clusterrolebinding namespace-readers
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  annotations:
    configmanagement.gke.io/source-path: cluster/namespace-reader-clusterrolebinding.yaml
    configmanagement.gke.io/token: bbb6a1e2f3db692b17201da028daff0d38797771
  name: namespace-readers
...

자세한 내용은 라벨 및 주석을 참조하세요.

다음 단계