이 항목에서는 Prometheus용 TKG 확장 v1.3.1을 배포하는 방법을 설명합니다. Prometheus는 시스템 및 서비스 모니터링 시스템입니다. 구성된 대상에서 일정 간격으로 메트릭을 수집하고, 규칙 표현식을 평가하고, 결과를 표시하며, 일부 조건이 true로 확인되면 경고를 트리거할 수 있습니다. Alertmanager는 Prometheus에서 생성된 경고를 처리하고 수신 끝점으로 라우팅합니다. Prometheus용 TKG 확장을 배포하여 Tanzu Kubernetes 클러스터에 대한 메트릭을 수집하고 볼 수 있습니다.

확장 사전 요구 사항

클러스터 모니터링을 위해 Alertmanager와 함께 Prometheus용 TKG 확장 v1.3.1을 배포하기 전에 다음 요구 사항을 준수합니다. 일반 요구 사항 외에도 Prometheus 모니터링에는 기본 영구 스토리지 클래스가 필요합니다. 기본 영구 스토리지 클래스를 사용하여 클러스터를 생성하거나 확장을 배포할 때 Prometheus 구성 파일에서 클러스터를 지정할 수 있습니다. TKG 확장에 대한 영구 스토리지 요구 사항 검토의 내용을 참조하십시오.

Prometheus 확장 배포

Prometheus용 TKG 확장은 여러 컨테이너를 설치합니다. 자세한 내용은 https://prometheus.io/의 내용을 참조하십시오.
컨테이너 리소스 유형 복제 설명
prometheus-alertmanager 배포 1 Prometheus 서버와 같은 클라이언트 애플리케이션에서 보낸 경고를 처리합니다.
prometheus-cadvisor DaemonSet 5 실행 중인 컨테이너의 리소스 사용량 및 성능 데이터를 분석하고 노출합니다.
prometheus-kube-state-metrics 배포 1 노드 상태 및 용량, 복제 세트 규정 준수, 포드, 작업 및 cronjob 상태, 리소스 요청 및 제한을 모니터링합니다.
prometheus-node-exporter DaemonSet 5 커널에 의해 노출되는 하드웨어 및 OS 메트릭용 내보내기입니다.
prometheus-pushgateway 배포 1 스크레이핑할 수 없는 작업에서 메트릭을 푸시할 수 있는 서비스입니다.
prometheus-server 배포 1 스크레이핑, 규칙 처리 및 경고를 비롯한 핵심 기능을 제공합니다.
확장은 VMware 공용 레지스트리( https://projects.registry.vmware.com/)에서 컨테이너를 가져오도록 구성됩니다. 개인 레지스트리를 사용하는 경우 데이터 값 및 확장 구성에서 끝점 URL이 일치하도록 변경합니다. Prometheus 확장 구성의 내용을 참조하십시오.
  1. 각각의 확장 사전 요구 사항을 완료했는지 확인합니다. 확장 사전 요구 사항의 내용을 참조하십시오.
  2. 디렉토리를 Prometheus 확장으로 변경합니다.
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/monitoring/prometheus
  3. tanzu-system-monitoring 네임스페이스와 Prometheus 서비스 계정 및 역할 개체를 생성합니다.
    kubectl apply -f namespace-role.yaml
  4. Prometheus 데이터 값 파일을 생성합니다.

    예제 데이터 값 파일은 최소 구성을 제공합니다.

    cp prometheus-data-values.yaml.example prometheus-data-values.yaml
  5. prometheus-data-values.yaml을 업데이트하여 Prometheus 확장을 구성합니다. Prometheus 확장 구성에서 필드 및 옵션에 대한 설명을 참조하십시오.
    클러스터가 기본 영구 스토리지 클래스로 프로비저닝되지 않은 경우 데이터 값 파일에서 지정할 수 있습니다. 네임스페이스에 영구 볼륨 할당을 위한 충분한 스토리지가 있는지도 확인합니다.
    monitoring:
      prometheus_server:
        image:
          repository: projects.registry.vmware.com/tkg/prometheus
        pvc:
          storage_class: vwt-storage-policy
          storage: "8Gi"
      alertmanager:
        image:
          repository: projects.registry.vmware.com/tkg/prometheus
        pvc:
          storage_class: vwt-storage-policy
          storage: "8Gi"
    ...      
    
  6. prometheus-data-values 파일을 사용하여 Prometheus 암호를 생성합니다.
    kubectl create secret generic prometheus-data-values --from-file=values.yaml=prometheus-data-values.yaml -n tanzu-system-monitoring
    

    tanzu-system-monitoring 네임스페이스에 prometheus-data-values 암호가 생성됩니다. kubectl get secrets -n tanzu-system-monitoring을 사용하여 확인합니다.

  7. Prometheus 확장을 배포합니다.
    kubectl apply -f prometheus-extension.yaml

    성공하면 Prometheus 애플리케이션이 생성됩니다(app.kappctrl.k14s.io/prometheus created).

  8. Prometheus 애플리케이션의 상태를 확인합니다.
    kubectl get app prometheus -n tanzu-system-monitoring
    상태가 Reconciling에서 Reconcile succeeded로 변경되어야 합니다. 상태가 Reconcile failed인 경우 문제 해결을 참조하십시오.
  9. Prometheus 애플리케이션에 대한 자세한 정보를 봅니다.
    kubectl get app prometheus -n tanzu-system-monitoring -o yaml
  10. Prometheus DaemonSets를 확인합니다.
    kubectl get daemonsets -n tanzu-system-monitoring
  11. Prometheus 배포를 확인합니다.
    kubectl get deployments -n tanzu-system-monitoring

Prometheus 배포 문제 해결

배포 또는 조정이 실패하면 kubectl get pods -A를 실행하여 포드의 상태를 봅니다. 정상적인 조건에서는 포드가 Running으로 표시되어야 합니다. 상태가 ImagePullBackOff 또는 ImageCrashLoopBackOff이면 저장소에서 컨테이너 이미지를 끌어올 수 없습니다. 데이터 값 및 확장 YAML 파일에서 URL을 확인하고 정확한지 확인합니다.

컨테이너 로그를 확인합니다. 여기서 name-XXXXkubectl get pods -A를 실행할 때 고유한 포드 이름입니다.
kubectl logs pod/prometheus-alertmanager-XXXXX -c prometheus-alertmanager -n tanzu-system-monitoring
kubectl logs pod/prometheus-server-XXXXX -c prometheus-server -n tanzu-system-monitoring

Prometheus 확장 업데이트

Tanzu Kubernetes 클러스터에 배포된 Prometheus 확장에 대한 구성을 업데이트합니다.

  1. 암호에서 Prometheus 데이터 값을 얻습니다.
    kubectl get secret prometheus-data-values -n tanzu-system-monitoring -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > prometheus-data-values.yaml
    
  2. Prometheus 데이터 값 암호를 업데이트합니다.
    kubectl create secret generic prometheus-data-values --from-file=values.yaml=prometheus-data-values.yaml -n tanzu-system-monitoring -o yaml --dry-run | kubectl replace -f-
    
    Prometheus 확장이 업데이트된 데이터 값으로 조정됩니다.
    참고: 기본적으로 kapp-controller는 5분마다 애플리케이션을 동기화합니다. 업데이트는 5분 이내에 적용됩니다. 업데이트를 즉시 적용하려면 prometheus-extension.yamlsyncPeriod를 더 작은 값으로 변경하고 kubectl apply -f prometheus-extension.yaml을 사용하여 Fluent Bit 확장을 적용합니다.
  3. 확장의 상태를 확인합니다.
    kubectl get app prometheus -n tanzu-system-monitoring

    Prometheus가 업데이트되면 상태가 Reconcile Succeeded로 변경됩니다.

  4. 자세한 상태를 살펴보고 문제를 해결합니다.
    kubectl get app prometheus -n tanzu-system-monitoring -o yaml

Prometheus 확장 삭제

Tanzu Kubernetes 클러스터에서 Prometheus 확장을 삭제합니다.
참고: 순서대로 단계를 완료하십시오. Prometheus 애플리케이션이 완전히 삭제되기 전에 네임스페이스, 서비스 계정 및 역할 개체를 삭제하지 마십시오. 그러면 시스템 오류가 발생할 수 있습니다.
경고: Prometheus와 Grafana는 모두 동일한 네임스페이스를 사용합니다. 네임스페이스를 삭제하면 거기에 배포된 확장에 방해가 됩니다. Grafana가 배포된 경우 Grafana를 삭제하기 전에 네임스페이스를 삭제하지 마십시오.
  1. 디렉토리를 Prometheus 확장으로 변경합니다.
    cd /extensions/monitoring/prometheus/
  2. Prometheus 애플리케이션을 삭제합니다.
    kubectl delete app prometheus -n tanzu-system-monitoring

    예상 결과: app.kappctrl.k14s.io "prometheus" deleted.

  3. Prometheus 애플리케이션이 삭제되었는지 확인합니다.
    kubectl get app prometheus -n tanzu-system-monitoring

    예상 결과: apps.kappctrl.k14s.io "prometheus" not found.

  4. tanzu-system-monitoring 네임스페이스와 Prometheus 서비스 계정 및 역할 개체를 삭제합니다.
    경고: Grafana가 배포된 경우에는 이 단계를 수행하지 마십시오.
    kubectl delete -f namespace-role.yaml
  5. Prometheus를 다시 배포하려면 암호 prometheus-data-values를 제거합니다.
    kubectl delete secret prometheus-data-values -n tanzu-system-monitoring

    예상 결과: secret "prometheus-data-values" deleted.

Prometheus 확장 업그레이드

기존 Prometheus 확장이 배포된 경우 최신 버전으로 업그레이드할 수 있습니다.
  1. Prometheus configmap을 내보내서 백업으로 저장합니다.
    kubectl get configmap prometheus -n tanzu-system-monitoring -o 'go-template={{ index .data "prometheus.yaml" }}' > prometheus-configmap.yaml
    
  2. 기존 Prometheus 배포를 삭제합니다. Prometheus 확장 삭제의 내용을 참조하십시오.
  3. Prometheus 확장을 배포합니다. Prometheus 확장 배포의 내용을 참조하십시오.

Prometheus 확장 구성

Prometheus 구성은 /extensions/monitoring/prometheus/prometheus-data-values.yaml에서 설정됩니다.
표 1. Prometheus 구성 매개 변수
매개 변수 설명 유형 기본값
monitoring.namespace Prometheus가 배포될 네임스페이스 문자열 tanzu-system-monitoring
monitoring.create_namespace 이 플래그는 monitoring.namespace를 통해 지정된 네임스페이스를 생성할지 여부를 나타냅니다. 부울 false
monitoring.prometheus_server.config.prometheus_yaml Prometheus에 전달할 Kubernetes 클러스터 모니터링 구성 세부 정보 yaml 파일 prometheus.yaml
monitoring.prometheus_server.config.alerting_rules_yaml Prometheus에 정의된 자세한 경고 규칙 yaml 파일 alerting_rules.yaml
monitoring.prometheus_server.config.recording_rules_yaml Prometheus에 정의된 자세한 기록 규칙 yaml 파일 recording_rules.yaml
monitoring.prometheus_server.service.type Prometheus를 노출할 서비스 유형. 지원되는 값: ClusterIP 문자열 ClusterIP
monitoring.prometheus_server.enable_alerts.kubernetes_api Prometheus의 Kubernetes API에 대해 SLO 경고 사용 부울 true
monitoring.prometheus_server.sc.aws_type AWS의 storageclass에 대해 정의된 AWS 유형 문자열 gp2
monitoring.prometheus_server.sc.aws_fsType AWS의 storageclass에 대해 정의된 AWS 파일 시스템 유형 문자열 ext4
monitoring.prometheus_server.sc.allowVolumeExpansion AWS의 storageclass에 대해 볼륨 확장이 허용되는지 정의 부울 true
monitoring.prometheus_server.pvc.annotations 스토리지 클래스 주석 {}
monitoring.prometheus_server.pvc.storage_class 영구 볼륨 할당에 사용할 스토리지 클래스. 기본값은 null이고 기본 프로비저너가 사용됩니다. 문자열 null
monitoring.prometheus_server.pvc.accessMode 영구 볼륨 할당에 대한 액세스 모드 정의. 지원되는 값: ReadWriteOnce, ReadOnlyMany, ReadWriteMany 문자열 ReadWriteOnce
monitoring.prometheus_server.pvc.storage 영구 볼륨 할당에 대한 스토리지 크기 정의 문자열 8Gi
monitoring.prometheus_server.deployment.replicas Prometheus 복제본 수 정수 1
monitoring.prometheus_server.image.repository Prometheus 이미지가 있는 저장소의 위치입니다. 기본값은 공용 VMware 레지스트리입니다. 비공개 저장소(예: 에어갭 환경)를 사용하는 경우 이 값을 변경합니다. 문자열 projects.registry.vmware.com/tkg/prometheus
monitoring.prometheus_server.image.name Prometheus 이미지의 이름 문자열 prometheus
monitoring.prometheus_server.image.tag Prometheus 이미지 태그. 버전을 업그레이드하는 경우 이 값을 업데이트해야 할 수 있습니다. 문자열 v2.17.1_vmware.1
monitoring.prometheus_server.image.pullPolicy Prometheus 이미지 Pull 정책 문자열 IfNotPresent
monitoring.alertmanager.config.slack_demo Alertmanager에 대한 Slack 알림 구성 문자열
slack_demo:
  name: slack_demo
  slack_configs:
  - api_url: https://hooks.slack.com
    channel: '#alertmanager-test'
monitoring.alertmanager.config.email_receiver Alertmanager에 대한 이메일 알림 구성 문자열
email_receiver:
  name: email-receiver
  email_configs:
  - to: [email protected]
    send_resolved: false
    from: [email protected]
    smarthost: smtp.eample.com:25
    require_tls: false
monitoring.alertmanager.service.type Alertmanager를 노출할 서비스 유형. 지원되는 값: ClusterIP 문자열 ClusterIP
monitoring.alertmanager.image.repository Alertmanager 이미지가 있는 저장소의 위치입니다. 기본값은 공용 VMware 레지스트리입니다. 비공개 저장소(예: 에어갭 환경)를 사용하는 경우 이 값을 변경합니다. 문자열 projects.registry.vmware.com/tkg/prometheus
monitoring.alertmanager.image.name Alertmanager 이미지의 이름 문자열 alertmanager
monitoring.alertmanager.image.tag Alertmanager 이미지 태그. 버전을 업그레이드하는 경우 이 값을 업데이트해야 할 수 있습니다. 문자열 v0.20.0_vmware.1
monitoring.alertmanager.image.pullPolicy Alertmanager 이미지 Pull 정책 문자열 IfNotPresent
monitoring.alertmanager.pvc.annotations 스토리지 클래스 주석 {}
monitoring.alertmanager.pvc.storage_class 영구 볼륨 할당에 사용할 스토리지 클래스. 기본값은 null이고 기본 프로비저너가 사용됩니다. 문자열 null
monitoring.alertmanager.pvc.accessMode 영구 볼륨 할당에 대한 액세스 모드 정의. 지원되는 값: ReadWriteOnce, ReadOnlyMany, ReadWriteMany 문자열 ReadWriteOnce
monitoring.alertmanager.pvc.storage 영구 볼륨 할당에 대한 스토리지 크기 정의 문자열 2Gi
monitoring.alertmanager.deployment.replicas Alertmanager 복제본 수 정수 1
monitoring.kube_state_metrics.image.repository kube-state-metircs 이미지가 포함된 저장소. 기본값은 공용 VMware 레지스트리입니다. 비공개 저장소(예: 에어갭 환경)를 사용하는 경우 이 값을 변경합니다. 문자열 projects.registry.vmware.com/tkg/prometheus
monitoring.kube_state_metrics.image.name kube-state-metircs 이미지의 이름 문자열 kube-state-metrics
monitoring.kube_state_metrics.image.tag kube-state-metircs 이미지 태그. 버전을 업그레이드하는 경우 이 값을 업데이트해야 할 수 있습니다. 문자열 v1.9.5_vmware.1
monitoring.kube_state_metrics.image.pullPolicy kube-state-metircs 이미지 Pull 정책 문자열 IfNotPresent
monitoring.kube_state_metrics.deployment.replicas kube-state-metrics 복제본 수 정수 1
monitoring.node_exporter.image.repository node-exporter 이미지가 포함된 저장소. 기본값은 공용 VMware 레지스트리입니다. 비공개 저장소(예: 에어갭 환경)를 사용하는 경우 이 값을 변경합니다. 문자열 projects.registry.vmware.com/tkg/prometheus
monitoring.node_exporter.image.name node-exporter 이미지의 이름 문자열 node-exporter
monitoring.node_exporter.image.tag node-exporter 이미지 태그. 버전을 업그레이드하는 경우 이 값을 업데이트해야 할 수 있습니다. 문자열 v0.18.1_vmware.1
monitoring.node_exporter.image.pullPolicy node-exporter 이미지 Pull 정책 문자열 IfNotPresent
monitoring.node_exporter.hostNetwork hostNetwork: true로 설정된 경우 포드는 노드의 네트워크 네임스페이스 및 네트워크 리소스를 사용할 수 있습니다. 부울 false
monitoring.node_exporter.deployment.replicas node-exporter 복제본 수 정수 1
monitoring.pushgateway.image.repository pushgateway 이미지가 포함된 저장소. 기본값은 공용 VMware 레지스트리입니다. 비공개 저장소(예: 에어갭 환경)를 사용하는 경우 이 값을 변경합니다. 문자열 projects.registry.vmware.com/tkg/prometheus
monitoring.pushgateway.image.name pushgateway 이미지의 이름 문자열 pushgateway
monitoring.pushgateway.image.tag pushgateway 이미지 태그. 버전을 업그레이드하는 경우 이 값을 업데이트해야 할 수 있습니다. 문자열 v1.2.0_vmware.1
monitoring.pushgateway.image.pullPolicy pushgateway 이미지 Pull 정책 문자열 IfNotPresent
monitoring.pushgateway.deployment.replicas pushgateway 복제본 수 정수 1
monitoring.cadvisor.image.repository cadvisor 이미지가 포함된 저장소. 기본값은 공용 VMware 레지스트리입니다. 비공개 저장소(예: 에어갭 환경)를 사용하는 경우 이 값을 변경합니다. 문자열 projects.registry.vmware.com/tkg/prometheus
monitoring.cadvisor.image.name cadvisor 이미지의 이름 문자열 cadvisor
monitoring.cadvisor.image.tag cadvisor 이미지 태그. 버전을 업그레이드하는 경우 이 값을 업데이트해야 할 수 있습니다. 문자열 v0.36.0_vmware.1
monitoring.cadvisor.image.pullPolicy cadvisor 이미지 풀 정책 문자열 IfNotPresent
monitoring.cadvisor.deployment.replicas cadvisor 복제본 수 정수 1
monitoring.ingress.enabled Prometheus 및 Alertmanager에 수신 사용/사용 안 함 부울

false

수신을 사용하려면 이 필드를 true로 설정하고 Contour를 배포합니다. Prometheus에 액세스하려면 prometheus.system.tanzu를 작업자 노드 IP 주소에 매핑하는 항목으로 로컬 /etc/hosts를 업데이트합니다.

monitoring.ingress.virtual_host_fqdn Prometheus 및 Alertmanager에 액세스하기 위한 호스트 이름 문자열 prometheus.system.tanzu
monitoring.ingress.prometheus_prefix Prometheus의 경로 접두사 문자열 /
monitoring.ingress.alertmanager_prefix Alertmanager의 경로 접두사 문자열 /alertmanager/
monitoring.ingress.tlsCertificate.tls.crt 자체 TLS 인증서를 사용하려는 경우 수신을 위한 선택적 인증서. 자체 서명된 인증서가 기본적으로 생성됨 문자열 생성된 인증서
monitoring.ingress.tlsCertificate.tls.key 자체 TLS 인증서를 사용하려는 경우, 수신을 위한 선택적 인증서 개인 키. 문자열 생성된 인증서 키
표 2. Prometheus_Server Configmap에 대한 구성 가능 필드
매개 변수 설명 유형 기본값
evaluation_interval 규칙을 평가하는 빈도 지속 시간 1m
scrape_interval 대상을 스크레이핑하는 빈도 지속 시간 1m
scrape_timeout 스크레이핑 요청 시간이 초과될 때까지 걸리는 시간 지속 시간 10s
rule_files 규칙 파일은 glob 목록을 지정함. 일치하는 모든 파일에서 규칙 및 경고를 읽음 yaml 파일
scrape_configs 스크레이핑 구성 목록. 목록
job_name 스크레이핑된 메트릭에 기본적으로 할당되는 작업 이름 문자열
kubernetes_sd_configs Kubernetes 서비스 검색 구성 목록. 목록
relabel_configs 대상 레이블 재지정 구성 목록. 목록
작업 regex 매칭을 기반으로 수행할 작업. 문자열
regex 추출된 값을 매칭할 정규식. 문자열
source_labels 소스 레이블은 기존 레이블에서 값을 선택합니다. 문자열
scheme 요청에 사용되는 프로토콜 체계를 구성합니다. 문자열
tls_config 스크레이핑 요청의 TLS 설정을 구성합니다. 문자열
ca_file API 서버 인증서의 유효성을 검사하는 데 사용할 CA 인증서. filename
insecure_skip_verify 서버 인증서의 유효성 검사를 사용하지 않도록 설정. 부울
bearer_token_file 보유자 토큰 파일 인증 정보(선택 사항). filename
replacement 정규식이 일치하는 경우 정규식 대체를 수행할 대체 값. 문자열
target_label 대체 작업에서 결과 값이 써지는 레이블. 문자열
표 3. Alertmanager Configmap에 대한 구성 가능 필드
매개 변수 설명 유형 기본값
resolve_timeout ResolveTimeout은 경고에 EndsAt가 포함되지 않은 경우 Alertmanager에서 사용하는 기본값임 지속 시간 5m
smtp_smarthost 이메일 전송에 사용되는 SMTP 호스트. 지속 시간 1m
slack_api_url Slack webhook URL. 문자열 global.slack_api_url
pagerduty_url API 요청을 보낼 pagerduty URL. 문자열 global.pagerduty_url
템플릿 사용자 지정 알림 템플릿 정의를 읽을 파일 파일 경로
group_by 경고를 레이블로 그룹화 문자열
group_interval 그룹에 추가된 새 경고에 대한 알림을 보내기 전에 대기할 시간 설정 지속 시간 5m
group_wait 경고 그룹에 대한 알림을 보내기 위해 초기에 대기하는 시간 지속 시간 30s
repeat_interval 경고에 대한 알림이 이미 전송된 경우 알림을 다시 보내기 전에 대기할 시간 지속 시간 4h
receivers 알림 수신기 목록. 목록
severity 인시던트의 심각도. 문자열
channel 알림을 보낼 대상 채널 또는 사용자. 문자열
html 이메일 알림의 HTML 본문. 문자열
text 이메일 알림의 텍스트 본문. 문자열
send_resolved 해결된 경고에 대해 알릴지 여부. filename
email_configs 이메일 통합 구성 부울
포드에 대한 주석을 사용하면 스크레이핑 프로세스를 세밀하게 제어할 수 있습니다. 이러한 주석은 포드 메타데이터의 일부여야 합니다. Services 또는 DaemonSets와 같은 다른 개체에 설정하면 효과가 없습니다.
표 4. Prometheus 포드 주석
포드 주석 설명
prometheus.io/scrape 기본 구성은 모든 포드를 스크레이핑하며 false로 설정하면 이 주석이 스크레이핑 프로세스에서 포드를 제외합니다.
prometheus.io/path 메트릭 경로가 /metrics가 아니면 이 주석을 사용하여 정의합니다.
prometheus.io/port 포드의 선언된 포트 대신 지정한 포트에서 포드를 스크레이핑합니다(아무것도 선언되지 않은 경우 기본값은 포트 없는 대상임).
아래의 DaemonSet 매니페스트는 Prometheus가 포트 9102에서 모든 포드를 스크레이핑하도록 지시합니다.
apiVersion: apps/v1beta2 # for versions before 1.8.0 use extensions/v1beta1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: weave
  labels:
    app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
      annotations:
        prometheus.io/scrape: 'true'
        prometheus.io/port: '9102'
    spec:
      containers:
      - name: fluentd-elasticsearch
        image: gcr.io/google-containers/fluentd-elasticsearch:1.20