Pendahuluan
Prometheus adalah kerangka instrumentasi sumber terbuka. Prometheus dapat menyerap sejumlah besar data setiap detik, sehingga cocok untuk beban kerja yang kompleks.
Gunakan Prometheus untuk memantau server, VM, database, dan memanfaatkan data tersebut untuk menganalisis kinerja aplikasi dan infrastruktur Anda.
Artikel ini menjelaskan cara menyiapkan pemantauan Prometheus di cluster Kubernetes.
Prasyarat
- Kluster Kubernetes
- Sebuah
kubectl
yang terkonfigurasi sepenuhnya antarmuka baris perintah pada mesin lokal Anda
Memantau Cluster Kubernetes dengan Prometheus
Prometheus adalah sistem berbasis tarikan. Ia mengirimkan permintaan HTTP, yang disebut scrape
, berdasarkan konfigurasi yang ditentukan dalam file penerapan . Tanggapan untuk scrape
. ini permintaan disimpan dan diuraikan dalam penyimpanan bersama dengan metrik untuk pengikisan itu sendiri.
Penyimpanannya adalah database khusus di server Prometheus dan dapat menangani arus data yang sangat besar. Dimungkinkan untuk memantau ribuan mesin secara bersamaan dengan satu server.
Data perlu diekspos dan diformat dengan tepat sehingga Prometheus dapat mengumpulkannya. Prometheus dapat mengakses data langsung dari pustaka klien aplikasi atau dengan menggunakan eksportir.
Eksportir digunakan untuk data yang tidak dapat Anda kendalikan sepenuhnya (misalnya, metrik kernel). Eksportir adalah perangkat lunak yang ditempatkan di sebelah aplikasi Anda. Tujuannya adalah untuk menerima permintaan HTTP dari Prometheus, memastikan data dalam format yang didukung, dan kemudian memberikan data yang diminta ke server Prometheus.
Semua aplikasi Anda sekarang dilengkapi untuk menyediakan data ke Prometheus. Kami masih perlu memberi tahu Prometheus di mana mencari data itu. Prometheus menemukan target untuk dikikis dengan menggunakan Penemuan Layanan .
Cluster Kubernetes Anda sudah memiliki label dan anotasi serta mekanisme yang sangat baik untuk melacak perubahan dan status elemennya. Oleh karena itu, Prometheus menggunakan Kubernetes API untuk menemukan target.
Penemuan layanan Kubernetes yang dapat Anda ekspos ke Prometheus adalah:
- simpul
- titik akhir
- layanan
- pod
- masuk
Prometheus mengambil metrik tingkat mesin secara terpisah dari informasi aplikasi. Satu-satunya cara untuk mengekspos memori, ruang disk, penggunaan CPU, dan metrik bandwidth adalah dengan menggunakan pengekspor simpul . Selain itu, metrik tentang cgroup juga perlu diungkapkan.
Untungnya, eksportir cAdvisor sudah tertanam di level node Kubernetes dan dapat dengan mudah diekspos.
Setelah sistem mengumpulkan data, Anda dapat mengaksesnya dengan menggunakan bahasa kueri PromQL, mengekspornya ke antarmuka grafis seperti Grafana, atau menggunakannya untuk mengirim lansiran dengan Alertmanager.
Instal Prometheus Monitoring di Kubernetes
Pemantauan Prometheus dapat diinstal pada klaster Kubernetes dengan menggunakan sekumpulan file YAML (Yet Another Markup Language). File-file ini berisi konfigurasi, izin, dan layanan yang memungkinkan Prometheus mengakses sumber daya dan menarik informasi dengan menggores elemen cluster Anda.
File YAML mudah dilacak, diedit, dan dapat digunakan kembali tanpa batas. File yang disajikan dalam tutorial ini tersedia dengan mudah dan gratis di repositori online seperti GitHub.
Buat Namespace Pemantauan
Semua resource di Kubernetes dimulai di namespace. Kecuali satu ditentukan, sistem menggunakan namespace default. Untuk memiliki kontrol yang lebih baik atas proses pemantauan cluster, kita akan menentukan namespace pemantauan.
Nama namespace harus berupa label yang kompatibel dengan DNS. Untuk referensi mudah, kita akan memberi nama namespace:monitoring .
Ada dua cara untuk membuat namespace pemantauan untuk mengambil metrik dari Kubernetes API.
Opsi 1:
Masukkan perintah sederhana ini di antarmuka baris perintah Anda dan buat pemantauan namespace di host Anda:
kubectl create namespace monitoring
Opsi 2:
Buat dan terapkan file .yml:
apiVersion: v1
kind: Namespace
metadata:
name: monitoring
Metode ini nyaman karena Anda dapat menerapkan file yang sama di masa mendatang. Terapkan file ke cluster Anda dengan memasukkan perintah berikut di terminal perintah Anda:
kubectl -f apply namespace monitoring.yml
Terlepas dari metode yang digunakan, buat daftar namespace yang ada dengan menggunakan perintah ini:
kubectl get namespaces
Konfigurasikan File Penerapan Prometheus
Bagian berikut berisi elemen-elemen yang diperlukan untuk berhasil menyiapkan scraping Prometheus pada cluster Kubernetes Anda dan elemen-elemennya.
Bagian dapat diimplementasikan sebagai .yml individual file yang dieksekusi secara berurutan. Setelah Anda membuat setiap file, itu dapat diterapkan dengan memasukkan perintah berikut:
kubectl -f apply [name_of_file].yml
Dalam contoh ini, semua elemen ditempatkan ke dalam satu .yml file dan diterapkan secara bersamaan.
prometheus.yml file dalam contoh kita menginstruksikan kubectl untuk mengirimkan permintaan ke server Kubernetes API. Berkasnya berisi:
- Izin yang memungkinkan Prometheus mengakses semua pod dan node.
- Prometheus configMap yang menentukan elemen mana yang harus dihapus.
- Petunjuk penerapan Prometheus.
- Layanan yang memberi Anda akses ke antarmuka pengguna Prometheus.
Peran Klaster, Akun Layanan, dan Pengikatan Peran Klaster
Ruang nama dirancang untuk membatasi izin peran default jika kita ingin mengambil data di seluruh kluster, kita perlu memberi Prometheus akses ke semua sumber daya kluster itu. File .yml Prometheus dasar yang menyediakan akses ke seluruh cluster memiliki elemen berikut:
1. Tentukan Peran Cluster
Kata kerja pada setiap aturan menentukan tindakan yang dapat dilakukan peran tersebut pada apiGroups.
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: prometheus
rules:
- apiGroups: [""]
resources:
- nodes
- services
- endpoints
- pods
verbs: ["get", "list", "watch"]
- apiGroups:
- extensions
resources:
- ingresses
verbs: ["get", "list", "watch"]
2. Buat Akun Layanan
Selain itu, kita perlu membuat akun layanan untuk menerapkan peran ini ke:
apiVersion: v1
kind: ServiceAccount
metadata:
name: prometheus
namespace: monitoring
3. Terapkan ClusterRoleBinding
Terakhir, kita perlu menerapkan ClusterRoleBinding . Tindakan ini akan mengikat Akun Layanan ke Peran Cluster yang dibuat sebelumnya.
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: prometheus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: prometheus
subjects:
- kind: ServiceAccount
name: prometheus
namespace: monitoring
Dengan menambahkan sumber daya ini ke file kami, kami telah memberikan akses ke seluruh cluster Prometheus dari pemantauan ruang nama.
Prometheus ConfigMap
Bagian file ini memberikan instruksi untuk proses pengikisan. Instruksi khusus untuk setiap elemen cluster Kubernetes harus disesuaikan agar sesuai dengan persyaratan pemantauan dan penyiapan cluster Anda.
1. Aturan Gosok Global
apiVersion: v1
data:
prometheus.yml: |
global:
scrape_interval: 10s
2. Mengikis Node
Penemuan layanan ini mengekspos node yang membentuk cluster Kubernetes Anda. Kubelet berjalan di setiap node dan merupakan sumber informasi yang berharga.
2.1 Gosok kubelet
scrape_configs:
- job_name: 'kubelet'
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true # Required with Minikube.
2.2 Scrape cAdvisor (informasi tingkat penampung)
kubelet hanya memberikan informasi tentang dirinya sendiri dan bukan wadahnya. Untuk menerima informasi dari tingkat kontainer, kita perlu menggunakan eksportir. cAdvisor sudah disematkan dan hanya membutuhkan metrik_jalur : /metrics/cadvisor bagi Prometheus untuk mengumpulkan data kontainer:
- job_name: 'cadvisor'
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true # Required with Minikube.
metrics_path: /metrics/cadvisor
3. Mengikis APIServer
Gunakan peran titik akhir untuk menargetkan setiap instance aplikasi. Bagian file ini memungkinkan Anda untuk mengikis server API di cluster Kubernetes Anda.
- job_name: 'k8apiserver'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true # Required if using Minikube.
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
4. Scrape Pods untuk Layanan Kubernetes (tidak termasuk Server API)
Kikis pod yang mendukung semua layanan Kubernetes dan abaikan metrik server API.
- job_name: 'k8services'
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- source_labels:
- __meta_kubernetes_namespace
- __meta_kubernetes_service_name
action: drop
regex: default;kubernetes
- source_labels:
- __meta_kubernetes_namespace
regex: default
action: keep
- source_labels: [__meta_kubernetes_service_name]
target_label: job
5. Peran Pod
Temukan semua port pod dengan metrik nama dengan menggunakan nama container sebagai label tugas.
- job_name: 'k8pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_container_port_name]
regex: metrics
action: keep
- source_labels: [__meta_kubernetes_pod_container_name]
target_label: job
kind: ConfigMap
metadata:
name: prometheus-config
6. Konfigurasikan ReplicaSet
Tentukan jumlah replika yang Anda butuhkan, dan template yang akan diterapkan ke kumpulan pod yang ditentukan.
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: prometheus
spec:
selector:
matchLabels:
app: prometheus
replicas: 1
template:
metadata:
labels:
app: prometheus
spec:
serviceAccountName: prometheus
containers:
- name: prometheus
image: prom/prometheus:v2.1.0
ports:
- containerPort: 9090
name: default
volumeMounts:
- name: config-volume
mountPath: /etc/prometheus
volumes:
- name: config-volume
configMap:
name: prometheus-config
7. Tentukan nodePort
Prometheus saat ini berjalan di cluster. Menambahkan bagian berikut ke prometheus.yml our kami file akan memberi kami akses ke data yang dikumpulkan Prometheus.
kind: Service
apiVersion: v1
metadata:
name: prometheus
spec:
selector:
app: prometheus
type: LoadBalancer
ports:
- protocol: TCP
port: 9090
targetPort: 9090
nodePort: 30909
Terapkan File prometheus.yml
Peta konfigurasi yang ditentukan dalam file memberikan data konfigurasi ke setiap pod pada penerapan:
kubectl apply -f prometheus.yml
Gunakan URL node individual dan nodePort yang ditentukan di prometheus.yml file untuk mengakses Prometheus dari browser Anda. Misalnya:
http://192.153.99.106:30909
Dengan memasukkan URL atau IP node Anda, dan dengan menentukan port dari file yml, Anda telah berhasil mendapatkan akses ke Prometheus Monitoring.
Bagaimana cara Memantau metrik status-kube? (Opsional)
Anda sekarang dapat memantau infrastruktur Kubernetes Anda sepenuhnya, serta instance aplikasi Anda. Namun, ini tidak termasuk metrik pada informasi yang dimiliki Kubernetes tentang resource di cluster Anda.
Metrik status-kube adalah eksportir yang memungkinkan Prometheus untuk mengikis informasi itu juga. Buat file YAML untuk eksportir kube-state-metrics:
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: kube-state-metrics
spec:
selector:
matchLabels:
app: kube-state-metrics
replicas: 1
template:
metadata:
labels:
app: kube-state-metrics
spec:
serviceAccountName: prometheus
containers:
- name: kube-state-metrics
image: quay.io/coreos/kube-state-metrics:v1.2.0
ports:
- containerPort: 8080
name: monitoring
---
kind: Service
apiVersion: v1
metadata:
name: kube-state-metrics
spec:
selector:
app: kube-state-metrics
type: LoadBalancer
ports:
- protocol: TCP
port: 8080
targetPort: 8080
Terapkan file dengan memasukkan perintah berikut:
kubectl apply -f kube-state-metrics.yml
Setelah Anda menerapkan file, akses Prometheus dengan memasukkan IP/URL node dan nodePort yang ditentukan seperti yang ditentukan sebelumnya.