Menyiapkan Container Network Observability untuk Azure Kubernetes Service (AKS) - Prometheus dan Grafana terkelola Azure
Artikel ini menunjukkan kepada Anda cara menyiapkan Container Network Observability untuk Azure Kubernetes Service (AKS) menggunakan Prometheus Terkelola dan Grafana dan BYO Prometheus dan Grafana dan untuk memvisualisasikan metrik tergores
Anda dapat menggunakan Container Network Observability untuk mengumpulkan data tentang lalu lintas jaringan kluster AKS Anda. Ini memungkinkan platform terpusat untuk memantau aplikasi dan kesehatan jaringan. Saat ini, metrik disimpan di Prometheus dan Grafana dapat digunakan untuk memvisualisasikannya. Container Network Observability juga menawarkan kemampuan untuk mengaktifkan Hubble. Kemampuan ini didukung untuk kluster Cilium dan non-Cilium.
Container Network Observability adalah salah satu fitur Layanan Jaringan Kontainer Tingkat Lanjut. Untuk informasi selengkapnya tentang Layanan Jaringan Kontainer Tingkat Lanjut untuk Azure Kubernetes Service (AKS), lihat Apa itu Layanan Jaringan Kontainer Tingkat Lanjut untuk Azure Kubernetes Service (AKS)?.
Prasyarat
- Akun Azure dengan langganan aktif. Jika Anda tidak memilikinya, buat akun gratis sebelum memulai.
Gunakan lingkungan Bash di Azure Cloud Shell. Untuk informasi selengkapnya, lihat Mulai Cepat untuk Bash di Azure Cloud Shell.
Jika Anda lebih suka menjalankan perintah referensi CLI secara lokal, instal Azure CLI. Jika Anda menjalankan Windows atau macOS, pertimbangkan untuk menjalankan Azure CLI dalam kontainer Docker. Untuk informasi lebih lanjut, lihat Cara menjalankan Azure CLI di kontainer Docker.
Jika Anda menggunakan instalasi lokal, masuk ke Azure CLI dengan menggunakan perintah login az. Untuk menyelesaikan proses autentikasi, ikuti langkah-langkah yang ditampilkan di terminal Anda. Untuk opsi masuk lainnya, lihat Masuk dengan Azure CLI.
Saat Anda diminta, instal ekstensi Azure CLI pada penggunaan pertama. Untuk informasi selengkapnya tentang ekstensi, lihat Menggunakan ekstensi dengan Azure CLI.
Jalankan versi az untuk menemukan versi dan pustaka dependen yang diinstal. Untuk meningkatkan ke versi terbaru, jalankan peningkatan az.
- Versi minimum Azure CLI yang diperlukan untuk langkah-langkah dalam artikel ini adalah 2.56.0. Jalankan
az --version
untuk menemukan versinya. Jika Anda perlu memasang atau meningkatkan, lihat Memasang Azure CLI.
Menginstal ekstensi Azure CLI pratinjau aks
Instal atau perbarui ekstensi pratinjau Azure CLI menggunakan az extension add
perintah atau az extension update
.
# Install the aks-preview extension
az extension add --name aks-preview
# Update the extension to make sure you have the latest version installed
az extension update --name aks-preview
Aktifkan Layanan Jaringan Kontainer Tingkat Lanjut
Untuk melanjutkan, Anda harus mengaktifkan kluster AKS dengan Advanced Container Networking Services .
az aks create
Perintah dengan bendera Layanan Jaringan Kontainer Tingkat Lanjut, --enable-acns
, membuat kluster AKS baru dengan semua fitur Layanan Jaringan Kontainer Tingkat Lanjut. Fitur-fitur ini mencakup:
Observabilitas Jaringan Kontainer: Memberikan wawasan tentang lalu lintas jaringan Anda. Untuk mempelajari lebih lanjut, kunjungi Observabilitas Jaringan Kontainer.
Keamanan Jaringan Kontainer: Menawarkan fitur keamanan seperti pemfilteran FQDN. Untuk mempelajari lebih lanjut, kunjungi Keamanan Jaringan Kontainer.
Catatan
Kluster dengan sarana data Cilium mendukung Container Network Observability dan keamanan Container Network yang dimulai dengan Kubernetes versi 1.29.
# Set an environment variable for the AKS cluster name. Make sure to replace the placeholder with your own value.
export CLUSTER_NAME="<aks-cluster-name>"
# Create an AKS cluster
az aks create \
--name $CLUSTER_NAME \
--resource-group $RESOURCE_GROUP \
--generate-ssh-keys \
--location eastus \
--max-pods 250 \
--network-plugin azure \
--network-plugin-mode overlay \
--network-dataplane cilium \
--node-count 2 \
--pod-cidr 192.168.0.0/16 \
--kubernetes-version 1.29 \
--enable-acns
Mengaktifkan Layanan Jaringan Kontainer Tingkat Lanjut pada kluster yang ada
az aks update
Perintah dengan bendera Layanan Jaringan Kontainer Tingkat Lanjut, --enable-acns
, memperbarui kluster AKS yang ada dengan semua fitur Layanan Jaringan Kontainer Tingkat Lanjut yang mencakup Pengamatan Jaringan Kontainer dan fitur Keamanan Jaringan Kontainer.
Catatan
Hanya kluster dengan sarana data Cilium yang mendukung fitur Keamanan Jaringan Kontainer dari Layanan Jaringan Kontainer Tingkat Lanjut.
az aks update \
--resource-group $RESOURCE_GROUP \
--name $CLUSTER_NAME \
--enable-acns
Mendapatkan kredensial kluster
Setelah Anda memiliki Dapatkan kredensial kluster Anda menggunakan az aks get-credentials
perintah .
az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP
Prometheus dan Grafana terkelola Azure
Lewati Bagian ini jika menggunakan BYO Prometheus dan Grafana
Gunakan contoh berikut untuk menginstal dan mengaktifkan Prometheus dan Grafana untuk kluster AKS Anda.
Buat sumber daya Azure Monitor
#Set an environment variable for the Grafana name. Make sure to replace the placeholder with your own value.
export AZURE_MONITOR_NAME="<azure-monitor-name>"
# Create Azure monitor resource
az resource create \
--resource-group $RESOURCE_GROUP \
--namespace microsoft.monitor \
--resource-type accounts \
--name $AZURE_MONITOR_NAME \
--location eastus \
--properties '{}'
Membuat instans Azure Managed Grafana
Gunakan az grafana create untuk membuat instans Grafana. Nama instans Grafana harus unik.
# Set an environment variable for the Grafana name. Make sure to replace the placeholder with your own value.
export GRAFANA_NAME="<grafana-name>"
# Create Grafana instance
az grafana create \
--name $GRAFANA_NAME \
--resource-group $RESOURCE_GROUP
Tempatkan ID sumber daya Azure Managed Grafana dan Azure Monitor dalam variabel
Gunakan az grafana show untuk menempatkan ID sumber daya Grafana dalam variabel. Gunakan az resource show untuk menempatkan ID sumber daya Azure Monitor dalam variabel. Ganti myGrafana dengan nama instans Grafana Anda.
grafanaId=$(az grafana show \
--name $GRAFANA_NAME \
--resource-group $RESOURCE_GROUP \
--query id \
--output tsv)
azuremonitorId=$(az resource show \
--resource-group $RESOURCE_GROUP \
--name $AZURE_MONITOR_NAME \
--resource-type "Microsoft.Monitor/accounts" \
--query id \
--output tsv)
Menautkan Azure Monitor dan Azure Managed Grafana ke kluster AKS
Gunakan pembaruan az aks untuk menautkan sumber daya Azure Monitor dan Grafana ke kluster AKS Anda.
az aks update \
--name $CLUSTER_NAME \
--resource-group $RESOURCE_GROUP \
--enable-azure-monitor-metrics \
--azure-monitor-workspace-resource-id $azuremonitorId \
--grafana-resource-id $grafanaId
Visualisasi
Visualisasi menggunakan Azure Managed Grafana
Lewati langkah ini jika menggunakan BYO Grafana
Catatan
hubble_flows_processed_total
Metrik tidak diekstraksi secara default karena kardinalitas metrik tinggi dalam kluster skala besar.
Karena itu, dasbor Alur Pod memiliki panel dengan data yang hilang. Untuk mengubah ini, Anda dapat mengubah pengaturan metrik ama untuk disertakan hubble_flows_processed_total
dalam daftar penyimpanan metrik. Untuk mempelajari cara melakukannya, lihat Doumentasi Penyerapan Minimal.
Pastikan pod Azure Monitor berjalan menggunakan
kubectl get pods
perintah .kubectl get pods -o wide -n kube-system | grep ama-
Output Anda akan terlihat mirip dengan contoh output berikut:
ama-metrics-5bc6c6d948-zkgc9 2/2 Running 0 (21h ago) 26h ama-metrics-ksm-556d86b5dc-2ndkv 1/1 Running 0 (26h ago) 26h ama-metrics-node-lbwcj 2/2 Running 0 (21h ago) 26h ama-metrics-node-rzkzn 2/2 Running 0 (21h ago) 26h ama-metrics-win-node-gqnkw 2/2 Running 0 (26h ago) 26h ama-metrics-win-node-tkrm8 2/2 Running 0 (26h ago) 26h
Kami telah membuat dasbor sampel. Mereka dapat ditemukan di bawah folder Dasbor > Azure Managed Prometheus . Mereka memiliki nama seperti "Kubernetes / Networking /
<name>
". Rangkaian dasbor meliputi:- Kluster: menunjukkan metrik tingkat node untuk kluster Anda.
- DNS (Kluster): memperlihatkan metrik DNS pada kluster atau pilihan Simpul.
- DNS (Beban Kerja): menunjukkan metrik DNS untuk beban kerja yang ditentukan (misalnya Pod DaemonSet atau Penyebaran seperti CoreDNS).
- Drop (Beban Kerja): menunjukkan penurunan ke/dari beban kerja yang ditentukan (misalnya Pod dari Deployment atau DaemonSet).
- Aliran Pod (Namespace): menunjukkan alur paket L4/L7 ke/dari namespace yang ditentukan (yaitu Pod di Namespace).
- Alur Pod (Beban Kerja): menunjukkan alur paket L4/L7 ke/dari beban kerja yang ditentukan (misalnya Pod dari Deployment atau DaemonSet).
Visualisasi menggunakan BYO Grafana
Lewati langkah ini jika menggunakan Grafana terkelola Azure
Tambahkan pekerjaan scrape berikut ke konfigurasi Prometheus yang ada dan mulai ulang server Prometheus Anda:
- job_name: networkobservability-hubble kubernetes_sd_configs: - role: pod relabel_configs: - target_label: cluster replacement: myAKSCluster action: replace - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_pod_label_k8s_app] regex: kube-system;(retina|cilium) action: keep - source_labels: [__address__] action: replace regex: ([^:]+)(?::\d+)? replacement: $1:9965 target_label: __address__ - source_labels: [__meta_kubernetes_pod_node_name] target_label: instance action: replace metric_relabel_configs: - source_labels: [__name__] regex: '|hubble_dns_queries_total|hubble_dns_responses_total|hubble_drop_total|hubble_tcp_flags_total' # if desired, add |hubble_flows_processed_total action: keep
Dalam Target Prometheus, verifikasi bahwa ada network-obs-pods .
Masuk ke Grafana dan impor contoh dasbor berikut menggunakan ID berikut:
- Kluster: menunjukkan metrik tingkat node untuk kluster Anda. (ID: 18814)
- DNS (Kluster): memperlihatkan metrik DNS pada kluster atau pemilihan Node.( ID: 20925)
- DNS (Beban Kerja): menunjukkan metrik DNS untuk beban kerja yang ditentukan (misalnya Pod DaemonSet atau Penyebaran seperti CoreDNS). (ID: [20926] https://grafana.com/grafana/dashboards/20926-kubernetes-networking-dns-workload/)
- Drop (Beban Kerja): menunjukkan penurunan ke/dari beban kerja yang ditentukan (misalnya Pod dari Deployment atau DaemonSet).( ID: 20927).
- Aliran Pod (Namespace): menunjukkan alur paket L4/L7 ke/dari namespace yang ditentukan (yaitu Pod di Namespace). (ID: 20928)
- Alur Pod (Beban Kerja): menunjukkan alur paket L4/L7 ke/dari beban kerja yang ditentukan (misalnya Pod dari Deployment atau DaemonSet).( ID: 20929)
Catatan
- Bergantung pada pengaturan instans Prometheus/Grafana Anda, beberapa panel dasbor mungkin memerlukan penyesatan untuk menampilkan semua data.
- Cilium saat ini tidak mendukung metrik/dasbor DNS.
Menginstal Hubble CLI
Instal Hubble CLI untuk mengakses data yang dikumpulkannya menggunakan perintah berikut:
# Set environment variables
export HUBBLE_VERSION=v1.16.3
export HUBBLE_ARCH=amd64
#Install Hubble CLI
if [ "$(uname -m)" = "aarch64" ]; then HUBBLE_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/hubble/releases/download/$HUBBLE_VERSION/hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}
sha256sum --check hubble-linux-${HUBBLE_ARCH}.tar.gz.sha256sum
sudo tar xzvfC hubble-linux-${HUBBLE_ARCH}.tar.gz /usr/local/bin
rm hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}
Memvisualisasikan Alur Hubble
Pastikan pod Hubble berjalan menggunakan
kubectl get pods
perintah .kubectl get pods -o wide -n kube-system -l k8s-app=hubble-relay
Output Anda akan terlihat mirip dengan contoh output berikut:
hubble-relay-7ddd887cdb-h6khj 1/1 Running 0 23h
Port forward Hubble Relay menggunakan
kubectl port-forward
perintah .kubectl port-forward -n kube-system svc/hubble-relay --address 127.0.0.1 4245:443
Mutual TLS (mTLS) memastikan keamanan server Hubble Relay. Untuk mengaktifkan klien Hubble untuk mengambil alur, Anda perlu mendapatkan sertifikat yang sesuai dan mengonfigurasi klien dengannya. Terapkan sertifikat menggunakan perintah berikut:
#!/usr/bin/env bash set -euo pipefail set -x # Directory where certificates will be stored CERT_DIR="$(pwd)/.certs" mkdir -p "$CERT_DIR" declare -A CERT_FILES=( ["tls.crt"]="tls-client-cert-file" ["tls.key"]="tls-client-key-file" ["ca.crt"]="tls-ca-cert-files" ) for FILE in "${!CERT_FILES[@]}"; do KEY="${CERT_FILES[$FILE]}" JSONPATH="{.data['${FILE//./\\.}']}" # Retrieve the secret and decode it kubectl get secret hubble-relay-client-certs -n kube-system \ -o jsonpath="${JSONPATH}" | \ base64 -d > "$CERT_DIR/$FILE" # Set the appropriate hubble CLI config hubble config set "$KEY" "$CERT_DIR/$FILE" done hubble config set tls true hubble config set tls-server-name instance.hubble-relay.cilium.io
Verifikasi bahwa rahasia dihasilkan menggunakan perintah berikut
kubectl get secrets
:kubectl get secrets -n kube-system | grep hubble-
Output Anda akan terlihat mirip dengan contoh output berikut:
kube-system hubble-relay-client-certs kubernetes.io/tls 3 9d kube-system hubble-relay-server-certs kubernetes.io/tls 3 9d kube-system hubble-server-certs kubernetes.io/tls 3 9d
Pastikan pod Hubble Relay berjalan menggunakan
hubble observe
perintah .hubble observe --pod hubble-relay-7ddd887cdb-h6khj
Memvisualisasikan menggunakan Hubble UI
Untuk menggunakan Hubble UI, simpan yang berikut ini ke hubble-ui.yaml
apiVersion: v1 kind: ServiceAccount metadata: name: hubble-ui namespace: kube-system --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: hubble-ui labels: app.kubernetes.io/part-of: retina rules: - apiGroups: - networking.k8s.io resources: - networkpolicies verbs: - get - list - watch - apiGroups: - "" resources: - componentstatuses - endpoints - namespaces - nodes - pods - services verbs: - get - list - watch - apiGroups: - apiextensions.k8s.io resources: - customresourcedefinitions verbs: - get - list - watch - apiGroups: - cilium.io resources: - "*" verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: hubble-ui labels: app.kubernetes.io/part-of: retina roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: hubble-ui subjects: - kind: ServiceAccount name: hubble-ui namespace: kube-system --- apiVersion: v1 kind: ConfigMap metadata: name: hubble-ui-nginx namespace: kube-system data: nginx.conf: | server { listen 8081; server_name localhost; root /app; index index.html; client_max_body_size 1G; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # CORS add_header Access-Control-Allow-Methods "GET, POST, PUT, HEAD, DELETE, OPTIONS"; add_header Access-Control-Allow-Origin *; add_header Access-Control-Max-Age 1728000; add_header Access-Control-Expose-Headers content-length,grpc-status,grpc-message; add_header Access-Control-Allow-Headers range,keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout; if ($request_method = OPTIONS) { return 204; } # /CORS location /api { proxy_http_version 1.1; proxy_pass_request_headers on; proxy_hide_header Access-Control-Allow-Origin; proxy_pass http://127.0.0.1:8090; } location / { try_files $uri $uri/ /index.html /index.html; } # Liveness probe location /healthz { access_log off; add_header Content-Type text/plain; return 200 'ok'; } } } --- kind: Deployment apiVersion: apps/v1 metadata: name: hubble-ui namespace: kube-system labels: k8s-app: hubble-ui app.kubernetes.io/name: hubble-ui app.kubernetes.io/part-of: retina spec: replicas: 1 selector: matchLabels: k8s-app: hubble-ui template: metadata: labels: k8s-app: hubble-ui app.kubernetes.io/name: hubble-ui app.kubernetes.io/part-of: retina spec: serviceAccountName: hubble-ui automountServiceAccountToken: true containers: - name: frontend image: mcr.microsoft.com/oss/cilium/hubble-ui:v0.12.2 imagePullPolicy: Always ports: - name: http containerPort: 8081 livenessProbe: httpGet: path: /healthz port: 8081 readinessProbe: httpGet: path: / port: 8081 resources: {} volumeMounts: - name: hubble-ui-nginx-conf mountPath: /etc/nginx/conf.d/default.conf subPath: nginx.conf - name: tmp-dir mountPath: /tmp terminationMessagePolicy: FallbackToLogsOnError securityContext: {} - name: backend image: mcr.microsoft.com/oss/cilium/hubble-ui-backend:v0.12.2 imagePullPolicy: Always env: - name: EVENTS_SERVER_PORT value: "8090" - name: FLOWS_API_ADDR value: "hubble-relay:443" - name: TLS_TO_RELAY_ENABLED value: "true" - name: TLS_RELAY_SERVER_NAME value: ui.hubble-relay.cilium.io - name: TLS_RELAY_CA_CERT_FILES value: /var/lib/hubble-ui/certs/hubble-relay-ca.crt - name: TLS_RELAY_CLIENT_CERT_FILE value: /var/lib/hubble-ui/certs/client.crt - name: TLS_RELAY_CLIENT_KEY_FILE value: /var/lib/hubble-ui/certs/client.key livenessProbe: httpGet: path: /healthz port: 8090 readinessProbe: httpGet: path: /healthz port: 8090 ports: - name: grpc containerPort: 8090 resources: {} volumeMounts: - name: hubble-ui-client-certs mountPath: /var/lib/hubble-ui/certs readOnly: true terminationMessagePolicy: FallbackToLogsOnError securityContext: {} nodeSelector: kubernetes.io/os: linux volumes: - configMap: defaultMode: 420 name: hubble-ui-nginx name: hubble-ui-nginx-conf - emptyDir: {} name: tmp-dir - name: hubble-ui-client-certs projected: defaultMode: 0400 sources: - secret: name: hubble-relay-client-certs items: - key: tls.crt path: client.crt - key: tls.key path: client.key - key: ca.crt path: hubble-relay-ca.crt --- kind: Service apiVersion: v1 metadata: name: hubble-ui namespace: kube-system labels: k8s-app: hubble-ui app.kubernetes.io/name: hubble-ui app.kubernetes.io/part-of: retina spec: type: ClusterIP selector: k8s-app: hubble-ui ports: - name: http port: 80 targetPort: 8081
Terapkan manifes hubble-ui.yaml ke kluster Anda, menggunakan perintah berikut
kubectl apply -f hubble-ui.yaml
Siapkan penerusan port untuk UI Hubble menggunakan
kubectl port-forward
perintah .kubectl -n kube-system port-forward svc/hubble-ui 12000:80
Akses Hubble UI dengan memasukkan
http://localhost:12000/
ke browser web Anda.
Membersihkan sumber daya
Jika Anda tidak berencana menggunakan aplikasi ini, hapus sumber daya lain yang Anda buat dalam artikel ini menggunakan az group delete
perintah .
az group delete --name $RESOURCE_GROUP
Langkah berikutnya
Dalam artikel panduan ini, Anda mempelajari cara menginstal dan mengaktifkan Container Network Observability untuk kluster AKS Anda.
Untuk informasi selengkapnya tentang Layanan Jaringan Kontainer Tingkat Lanjut untuk Azure Kubernetes Service (AKS), lihat Apa itu Layanan Jaringan Kontainer Tingkat Lanjut untuk Azure Kubernetes Service (AKS)?.
Untuk informasi selengkapnya tentang Keamanan Jaringan Kontainer dan kemampuannya, lihat Apa itu Keamanan Jaringan Kontainer?.
Azure Kubernetes Service