全部产品
Search
文档中心

Container Service for Kubernetes:Gunakan sistem Prometheus yang dikelola sendiri untuk mengumpulkan metrik komponen lapisan kontrol dan mengonfigurasi peringatan

更新时间:Nov 11, 2025

ACK managed cluster Pro mengekspos metrik komponen lapisan kontrol dan menyediakan dasbor komponen. Topik ini menjelaskan cara mengumpulkan metrik komponen inti kluster menggunakan sistem Prometheus yang Anda kelola sendiri serta mengonfigurasi pemantauan dan peringatan berdasarkan metrik tersebut agar terintegrasi dengan sistem pemantauan yang Anda kelola.

Prasyarat

  • Sistem Prometheus yang Anda kelola sendiri harus dapat mengakses ACK managed cluster Pro API Server dan memiliki izin baca pada /metrics.

  • Anda dapat menerapkan sistem Prometheus yang Anda kelola sendiri di dalam atau di luar kluster.

  • ACK managed cluster Pro mengekspos metrik untuk komponen yang dikelola, seperti kube-apiserver, etcd, kube-scheduler, kube-controller-manager, dan cloud-controller-manager. Sebelum menggunakan fitur ini, kami menyarankan Anda meninjau dokumen berikut untuk memahami metrik yang diekspos oleh komponen-komponen tersebut beserta deskripsinya:

    Sebagai alternatif, Anda dapat menggunakan Pemantauan Prometheus Alibaba Cloud di kluster Anda. Prometheus Alibaba Cloud secara otomatis memantau dan mengumpulkan data, menyediakan dasbor Grafana secara real-time, serta memungkinkan Anda membuat peringatan untuk tugas pemantauan. Anda dapat menerima peringatan secara real-time melalui saluran seperti email, pesan teks, dan DingTalk.

Konfigurasikan file pengumpulan Prometheus

Sebelum menggunakan sistem Prometheus yang dikelola sendiri untuk mengumpulkan metrik dari komponen lapisan kontrol, Anda harus mengonfigurasi tugas pengumpulan metrik yang sesuai dalam file konfigurasi Prometheus prometheus.yaml. Dalam contoh file konfigurasi, setiap komponen inti memiliki konfigurasi tugas tersendiri. Untuk informasi lebih lanjut tentang konfigurasi tersebut, lihat dokumen deskripsi metrik untuk komponen inti yang bersangkutan.

Untuk informasi lebih lanjut tentang cara mengonfigurasi prometheus.yaml untuk Prometheus komunitas, lihat Configuration.
global:
  scrape_interval:     15s # Secara default, ambil target setiap 15 detik.

  # Lampirkan label ini ke seri waktu atau peringatan apa pun saat berkomunikasi dengan
  # sistem eksternal (federasi, penyimpanan jarak jauh, Alertmanager).
  external_labels:
    monitor: 'codelab-monitor'

# Konfigurasi pengambilan yang berisi tepat satu titik akhir untuk diambil:
# Di sini adalah Prometheus itu sendiri.
scrape_configs:
  # Nama job ditambahkan sebagai label `job=<job_name>` ke seri waktu apa pun yang diambil dari konfigurasi ini.
  - job_name: ack-api-server
    ......

  - job_name: ack-etcd
    ......

  - job_name: ack-scheduler
    ......
            

Untuk informasi lebih lanjut tentang solusi Prometheus Operator komunitas dan komponen ack-prometheus-operator di pasar ACK, lihat Pemantauan Prometheus open source. Untuk petunjuk tentang cara mengonfigurasi pengumpulan data kustom, lihat dokumentasi Prometheus Operator dari komunitas resmi Prometheus Operator.

Konfigurasikan aturan peringatan Prometheus

Untuk informasi lebih lanjut tentang cara mengonfigurasi peringatan untuk Prometheus sumber terbuka, lihat Alerting_rules.

Pemantauan intra-kluster

Jika sistem Prometheus Anda diterapkan di dalam kluster yang ingin Anda pantau, rujuk bagian berikut untuk mengonfigurasi pemantauan dan pengumpulan data untuk komponen inti kluster.

Kube-apiserver

Untuk daftar metrik yang dapat dikumpulkan, lihat Metrik komponen kube-apiserver.

Untuk kluster versi 1.20 atau lebih baru yang dibuat pada atau setelah Februari 2023, jalur akses untuk layanan Kubernetes di namespace default ditingkatkan dari arsitektur penerusan Classic Load Balancer (CLB) menjadi arsitektur koneksi langsung yang menggunakan elastic network interfaces (ENIs). Untuk informasi lebih lanjut, lihat Kube API Server. Setelah perubahan ini, semua replika kube-apiserver terlihat oleh bidang data. Anda dapat mengonfigurasi tugas pemantauan untuk langsung mengumpulkan metrik kube-apiserver. Hal ini memberikan tautan pengumpulan yang lebih langsung dan cakupan metrik yang lebih komprehensif.

Anda dapat menjalankan perintah kubectl get endpoints kubernetes untuk menentukan jenis tautan backend layanan Kubernetes di kluster.

Klik untuk melihat output yang diharapkan

  • Arsitektur koneksi langsung ENI: Output menampilkan dua alamat IP atau lebih, seperti a.b.c.d:6443,w.x.y.z:6443.

    NAME         ENDPOINTS                               AGE
    kubernetes   a.b.c.d:6443,w.x.y.z:6443               27h
  • Arsitektur penerusan CLB: Output hanya menampilkan satu alamat IP, seperti a.b.c.d:6443. Alamat IP ini merupakan alamat IP internal instans CLB.

    NAME         ENDPOINTS                               AGE
    kubernetes   a.b.c.d:6443                            27h

Pilih konfigurasi pengumpulan Prometheus dan aturan peringatan berdasarkan jenis tautan backend layanan Kubernetes di kluster.

  • Konfigurasi pengumpulan Prometheus

    • Arsitektur koneksi langsung ENI

      - job_name: ack-api-server  
        scrape_interval: 30s
        scrape_timeout: 30s
        metrics_path: /metrics
        scheme: https
        #  scheme: https
        honor_labels: true
        honor_timestamps: true
        kubernetes_sd_configs:
        - role: endpoints
          namespaces:
            names: [default]
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        tls_config:
          insecure_skip_verify: false
          ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
          server_name: kubernetes
        relabel_configs:
        - source_labels: [__meta_kubernetes_service_label_component]
          separator: ;
          regex: apiserver
          replacement: $1
          action: keep
        - source_labels: [__meta_kubernetes_service_label_provider]
          separator: ;
          regex: kubernetes
          replacement: $1
          action: keep
        - source_labels: [__meta_kubernetes_endpoint_port_name]
          separator: ;
          regex: https
          replacement: $1
          action: keep
        - source_labels: [__meta_kubernetes_namespace]
          separator: ;
          regex: (.*)
          target_label: namespace
          replacement: $1
          action: replace
        - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
          separator: ;
          regex: Node;(.*)
          target_label: node
          replacement: ${1}
          action: replace
        - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
          separator: ;
          regex: Pod;(.*)
          target_label: pod
          replacement: ${1}
          action: replace
        - source_labels: [__meta_kubernetes_service_name]
          separator: ;
          regex: (.*)
          target_label: service
          replacement: $1
          action: replace
        - source_labels: [__meta_kubernetes_service_name]
          separator: ;
          regex: (.*)
          target_label: job
          replacement: ${1}
          action: replace
        - source_labels: [__meta_kubernetes_service_label_component]
          separator: ;
          regex: (.+)
          target_label: job
          replacement: ${1}
          action: replace
        - separator: ;
          regex: (.*)
          target_label: endpoint
          replacement: https
          action: replace
    • Arsitektur penerusan CLB

      - job_name: ack-api-server  
        scrape_interval: 30s
        scrape_timeout: 30s
        metrics_path: /metrics
        scheme: https
        #  scheme: https
        honor_labels: true
        honor_timestamps: true
        params:
          hosting: ["true"]
          job: ["apiserver"]
        kubernetes_sd_configs:
        - role: endpoints
          namespaces:
            names: [default]
        authorization:
          credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
        tls_config:
          insecure_skip_verify: false
          ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
          server_name: kubernetes
        relabel_configs:
        - source_labels: [__meta_kubernetes_service_label_component]
          separator: ;
          regex: apiserver
          replacement: $1
          action: keep
        - source_labels: [__meta_kubernetes_service_label_provider]
          separator: ;
          regex: kubernetes
          replacement: $1
          action: keep
        - source_labels: [__meta_kubernetes_endpoint_port_name]
          separator: ;
          regex: https
          replacement: $1
          action: keep
        - source_labels: [__meta_kubernetes_namespace]
          separator: ;
          regex: (.*)
          target_label: namespace
          replacement: $1
          action: replace
        - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
          separator: ;
          regex: Node;(.*)
          target_label: node
          replacement: ${1}
          action: replace
        - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
          separator: ;
          regex: Pod;(.*)
          target_label: pod
          replacement: ${1}
          action: replace
        - source_labels: [__meta_kubernetes_service_name]
          separator: ;
          regex: (.*)
          target_label: service
          replacement: $1
          action: replace
        - source_labels: [__meta_kubernetes_service_name]
          separator: ;
          regex: (.*)
          target_label: job
          replacement: ${1}
          action: replace
        - source_labels: [__meta_kubernetes_service_label_component]
          separator: ;
          regex: (.+)
          target_label: job
          replacement: ${1}
          action: replace
        - separator: ;
          regex: (.*)
          target_label: endpoint
          replacement: https
          action: replace
  • Aturan peringatan Prometheus

    - alert: AckApiServerWarning
      annotations:
        message:  APIServer tidak tersedia dalam 5 menit terakhir. Harap periksa status tugas dan target prometheus.
      expr: |
        (absent(up{job="ack-api-server",pod!=""}) or (count(up{job="ack-api-server",pod!=""}) <= 1)) == 1
      for: 5m
      labels:
        severity: critical

etcd

Untuk daftar metrik yang dapat dikumpulkan, lihat Metrik komponen etcd.
  • Konfigurasi pengumpulan Prometheus

    - job_name: ack-etcd 
      scrape_interval: 30s
      scrape_timeout: 30s
      metrics_path: /metrics
      scheme: https
      #  scheme: https
      honor_labels: true
      honor_timestamps: true
      params:
        hosting: ["true"]
        job: ["etcd"]
      kubernetes_sd_configs:
      - role: endpoints
        namespaces:
          names: [default]
      authorization:
        credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      tls_config:
        insecure_skip_verify: false
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        server_name: kubernetes
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_label_component]
        separator: ;
        regex: apiserver
        replacement: $1
        action: keep
      - source_labels: [__meta_kubernetes_service_label_provider]
        separator: ;
        regex: kubernetes
        replacement: $1
        action: keep
      - source_labels: [__meta_kubernetes_endpoint_port_name]
        separator: ;
        regex: https
        replacement: $1
        action: keep
      - source_labels: [__meta_kubernetes_namespace]
        separator: ;
        regex: (.*)
        target_label: namespace
        replacement: $1
        action: replace
      - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
        separator: ;
        regex: Node;(.*)
        target_label: node
        replacement: ${1}
        action: replace
      - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
        separator: ;
        regex: Pod;(.*)
        target_label: pod
        replacement: ${1}
        action: replace
      - source_labels: [__meta_kubernetes_service_name]
        separator: ;
        regex: (.*)
        target_label: service
        replacement: $1
        action: replace
      - source_labels: [__meta_kubernetes_service_name]
        separator: ;
        regex: (.*)
        target_label: job
        replacement: ${1}
        action: replace
      - source_labels: [__meta_kubernetes_service_label_component]
        separator: ;
        regex: (.+)
        target_label: job
        replacement: ${1}
        action: replace
      - separator: ;
        regex: (.*)
        target_label: endpoint
        replacement: https
        action: replace
  • Aturan peringatan Prometheus

    - alert: AckETCDWarning
      annotations:
        message: Kluster Etcd tidak memiliki pemimpin dalam 5 menit terakhir, silakan periksa apakah kluster kelebihan beban dan hubungi tim ACK.
      expr: |
        sum_over_time(etcd_server_has_leader[5m]) == 0
      for: 5m
      labels:
        severity: critical
    
    
    - alert: AckETCDWarning
      annotations:
        message: Etcd tidak tersedia dalam 5 menit terakhir. Silakan periksa status job dan target prometheus.
      expr: |
        (absent(up{job="ack-etcd",pod!=""}) or (count(up{job="ack-etcd",pod!=""}) <= 2)) == 1
      for: 5m
      labels:
        severity: critical

Kube-scheduler

Untuk daftar metrik yang dapat dikumpulkan, lihat Metrik komponen kube-scheduler.
  • Prometheus collection configuration

    - job_name: ack-scheduler
      scrape_interval: 30s
      scrape_timeout: 30s
      metrics_path: /metrics
      scheme: https
      #  scheme: https
      honor_labels: true
      honor_timestamps: true
      params:
        hosting: ["true"]
        job: ["ack-scheduler"]
      kubernetes_sd_configs:
      - role: endpoints
        namespaces:
          names: [default]
      authorization:
        credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      tls_config:
        insecure_skip_verify: false
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        server_name: kubernetes
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_label_component]
        separator: ;
        regex: apiserver
        replacement: $1
        action: keep
      - source_labels: [__meta_kubernetes_service_label_provider]
        separator: ;
        regex: kubernetes
        replacement: $1
        action: keep
      - source_labels: [__meta_kubernetes_endpoint_port_name]
        separator: ;
        regex: https
        replacement: $1
        action: keep
      - source_labels: [__meta_kubernetes_namespace]
        separator: ;
        regex: (.*)
        target_label: namespace
        replacement: $1
        action: replace
      - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
        separator: ;
        regex: Node;(.*)
        target_label: node
        replacement: ${1}
        action: replace
      - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
        separator: ;
        regex: Pod;(.*)
        target_label: pod
        replacement: ${1}
        action: replace
      - source_labels: [__meta_kubernetes_service_name]
        separator: ;
        regex: (.*)
        target_label: service
        replacement: $1
        action: replace
      - source_labels: [__meta_kubernetes_service_name]
        separator: ;
        regex: (.*)
        target_label: job
        replacement: ${1}
        action: replace
      - source_labels: [__meta_kubernetes_service_label_component]
        separator: ;
        regex: (.+)
        target_label: job
        replacement: ${1}
        action: replace
      - separator: ;
        regex: (.*)
        target_label: endpoint
        replacement: https
        action: replace
  • Prometheus alert rule

    - alert: AckSchedulerWarning
      annotations:
        message: Scheduler tidak tersedia dalam 3 menit terakhir. Silakan periksa status job dan target prometheus.
      expr: |
        (absent(up{job="ack-scheduler",pod!=""}) or (count(up{job="ack-scheduler",pod!=""}) <= 0)) == 1
      for: 3m
      labels:
        severity: critical

Kube-controller-manager

Untuk daftar metrik yang dapat dikumpulkan, lihat Metrik komponen kube-controller-manager.
  • Prometheus collection configuration

    - job_name: ack-kcm
      scrape_interval: 30s
      scrape_timeout: 30s
      metrics_path: /metrics
      scheme: https
      #  scheme: https
      honor_labels: true
      honor_timestamps: true
      params:
        hosting: ["true"]
        job: ["ack-kube-controller-manager"]
      kubernetes_sd_configs:
      - role: endpoints
        namespaces:
          names: [default]
      authorization:
        credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      tls_config:
        insecure_skip_verify: false
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        server_name: kubernetes
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_label_component]
        separator: ;
        regex: apiserver
        replacement: $1
        action: keep
      - source_labels: [__meta_kubernetes_service_label_provider]
        separator: ;
        regex: kubernetes
        replacement: $1
        action: keep
      - source_labels: [__meta_kubernetes_endpoint_port_name]
        separator: ;
        regex: https
        replacement: $1
        action: keep
      - source_labels: [__meta_kubernetes_namespace]
        separator: ;
        regex: (.*)
        target_label: namespace
        replacement: $1
        action: replace
      - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
        separator: ;
        regex: Node;(.*)
        target_label: node
        replacement: ${1}
        action: replace
      - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
        separator: ;
        regex: Pod;(.*)
        target_label: pod
        replacement: ${1}
        action: replace
      - source_labels: [__meta_kubernetes_service_name]
        separator: ;
        regex: (.*)
        target_label: service
        replacement: $1
        action: replace
      - source_labels: [__meta_kubernetes_service_name]
        separator: ;
        regex: (.*)
        target_label: job
        replacement: ${1}
        action: replace
      - source_labels: [__meta_kubernetes_service_label_component]
        separator: ;
        regex: (.+)
        target_label: job
        replacement: ${1}
        action: replace
      - separator: ;
        regex: (.*)
        target_label: endpoint
        replacement: https
        action: replace
  • Prometheus alert rule

    - alert: AckKCMWarning
      annotations:
        message: KCM tidak tersedia dalam 3 menit terakhir. Silakan periksa status job dan target prometheus.
      expr: |
        (absent(up{job="ack-kcm",pod!=""})or(count(up{job="ack-kcm",pod!=""})<=0))>=1
      for: 3m
      labels:
        severity: critical

Cloud-controller-manager

Untuk daftar metrik yang dapat dikumpulkan, lihat Metrik komponen cloud-controller-manager.
  • Prometheus collection configuration

    - job_name: ack-cloud-controller-manager
      scrape_interval: 30s
      scrape_timeout: 30s
      metrics_path: /metrics
      scheme: https
      #  scheme: https
      honor_labels: true
      honor_timestamps: true
      params:
        hosting: ["true"]
        job: ["ack-cloud-controller-manager"]
      kubernetes_sd_configs:
      - role: endpoints
        namespaces:
          names: [default]
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      tls_config: {ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt, server_name: kubernetes,
                   insecure_skip_verify: false}
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_label_component]
        separator: ;
        regex: apiserver
        replacement: $1
        action: keep
      - source_labels: [__meta_kubernetes_service_label_provider]
        separator: ;
        regex: kubernetes
        replacement: $1
        action: keep
      - source_labels: [__meta_kubernetes_endpoint_port_name]
        separator: ;
        regex: https
        replacement: $1
        action: keep
      - source_labels: [__meta_kubernetes_namespace]
        separator: ;
        regex: (.*)
        target_label: namespace
        replacement: $1
        action: replace
      - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
        separator: ;
        regex: Node;(.*)
        target_label: node
        replacement: ${1}
        action: replace
      - source_labels: [__meta_kubernetes_endpoint_address_target_kind, __meta_kubernetes_endpoint_address_target_name]
        separator: ;
        regex: Pod;(.*)
        target_label: pod
        replacement: ${1}
        action: replace
      - source_labels: [__meta_kubernetes_service_name]
        separator: ;
        regex: (.*)
        target_label: service
        replacement: $1
        action: replace
      - source_labels: [__meta_kubernetes_service_name]
        separator: ;
        regex: (.*)
        target_label: job
        replacement: ${1}
        action: replace
      - source_labels: [__meta_kubernetes_service_label_component]
        separator: ;
        regex: (.+)
        target_label: job
        replacement: ${1}
        action: replace
      - separator: ;
        regex: (.*)
        target_label: endpoint
        replacement: https
        action: replace
  • Prometheus alert rule

    - alert: AckCCMWarning
      annotations:
        message: CCM tidak tersedia dalam 3 menit terakhir. Silakan periksa status job dan target prometheus.
      expr: |
        (absent(up{job="ack-cloud-controller-manager",pod!=""}) or (count(up{job="ack-cloud-controller-manager",pod!=""}) <= 0)) == 1
      for: 3m
      labels:
        severity: critical

Pemantauan kluster eksternal

Jika sistem Prometheus Anda diterapkan di luar kluster yang ingin Anda pantau, rujuk Configuration dan Monitoring kubernetes with prometheus from outside of k8s cluster untuk mengonfigurasi pemantauan dan pengumpulan data untuk komponen inti kluster. Konfigurasi utamanya adalah sebagai berikut:

  - job_name: 'out-of-k8s-scrape-job'
    scheme: https
    tls_config:
      ca_file: /etc/prometheus/kubernetes-ca.crt
    bearer_token: '<SERVICE ACCOUNT BEARER TOKEN>'

    kubernetes_sd_configs:
      - api_server: 'https://<KUBERNETES URL>'
        role: node
        tls_config:
          ca_file: /etc/prometheus/kubernetes-ca.crt
        bearer_token: '<SERVICE ACCOUNT BEARER TOKEN>'
            

Verifikasi hasil

  1. Masuk ke konsol sistem Prometheus yang Anda kelola sendiri dan buka halaman Graph.

  2. Masukkan up dan periksa apakah data untuk semua komponen lapisan kontrol ditampilkan sebagaimana diharapkan.

    up

    Output yang Diharapkan:

    自定义

    • up{instance="XX.XX.XX.XX:6443", job="ack-api-server"}: Status endpoint proxy. XX.XX.XX.XX adalah alamat IP layanan Kubernetes di namespace default kluster. Alamat IP ini berbeda-beda tergantung kluster.

    • up{instance="controlplane-xyz", job="ack-api-server", pod="controlplane-xyz"}: Status pod lapisan kontrol. Metrik up ini dapat digunakan untuk Pemeriksaan kelangsungan hidup pod lapisan kontrol.

  3. Masukkan metrik berikut dan periksa apakah ditampilkan sebagaimana diharapkan.

    apiserver_request_total{job="ack-api-server"}

    Output yang Diharapkan:

    显示2

    Jika metrik dan data yang ditanyakan ditampilkan di halaman, sistem Prometheus yang Anda kelola sendiri dapat mengumpulkan metrik komponen inti.