Waarneembaarheid van containernetwerk instellen voor Azure Kubernetes Service (AKS) - Door Azure beheerde Prometheus en Grafana
In dit artikel leest u hoe u Container Network Observability instelt voor Azure Kubernetes Service (AKS) met managed Prometheus en Grafana en BYO Prometheus en Grafana en om de geroote metrische gegevens te visualiseren
U kunt Container Network Observability gebruiken om gegevens te verzamelen over het netwerkverkeer van uw AKS-clusters. Het maakt een gecentraliseerd platform mogelijk voor het bewaken van de toepassing en netwerkstatus. Op dit moment worden metrische gegevens opgeslagen in Prometheus en Grafana om ze te visualiseren. Container Network Observability biedt ook de mogelijkheid om Hubble in te schakelen. Deze mogelijkheden worden ondersteund voor zowel Cilium- als niet-Cilium-clusters.
Container Network Observability is een van de functies van Advanced Container Networking Services. Zie Wat is Advanced Container Networking Services (AKS) voor Azure Kubernetes Service (AKS) voor meer informatie over Advanced Container Networking Services (AKS)?
Vereisten
- Een Azure-account met een actief abonnement. Als u nog geen abonnement hebt, maakt u een gratis account voordat u begint.
Gebruik de Bash-omgeving in Azure Cloud Shell. Zie quickstart voor Bash in Azure Cloud Shell voor meer informatie.
Installeer de Azure CLI, indien gewenst, om CLI-referentieopdrachten uit te voeren. Als u in Windows of macOS werkt, kunt u Azure CLI uitvoeren in een Docker-container. Zie De Azure CLI uitvoeren in een Docker-container voor meer informatie.
Als u een lokale installatie gebruikt, meldt u zich aan bij Azure CLI met behulp van de opdracht az login. Volg de stappen die worden weergegeven in de terminal, om het verificatieproces te voltooien. Raadpleeg Aanmelden bij Azure CLI voor aanvullende aanmeldingsopties.
Installeer de Azure CLI-extensie bij het eerste gebruik, wanneer u hierom wordt gevraagd. Raadpleeg Extensies gebruiken met Azure CLI voor meer informatie over extensies.
Voer az version uit om de geïnstalleerde versie en afhankelijke bibliotheken te vinden. Voer az upgrade uit om te upgraden naar de nieuwste versie.
- De minimale versie van Azure CLI die is vereist voor de stappen in dit artikel is 2.56.0. Voer
az --version
uit om de versie te bekijken. Als u Azure CLI 2.0 wilt installeren of upgraden, raadpleegt u Azure CLI 2.0 installeren.
De Azure CLI-extensie aks-preview installeren
Installeer of werk de Preview-extensie van Azure CLI bij met behulp van de az extension add
of az extension update
opdracht.
# 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
Geavanceerde containernetwerkservices inschakelen
Als u wilt doorgaan, moet u een AKS-cluster hebben waarvoor Advanced Container Networking Services is ingeschakeld.
Met az aks create
de opdracht met de vlag Advanced Container Networking Services maakt --enable-acns
u een nieuw AKS-cluster met alle functies van Advanced Container Networking Services. Deze functies omvatten:
Waarneembaarheid van containernetwerk: biedt inzicht in uw netwerkverkeer. Ga naar Container Network Observability voor meer informatie.
Containernetwerkbeveiliging: biedt beveiligingsfuncties zoals FQDN-filtering. Ga naar Container Network Security voor meer informatie.
Notitie
Clusters met het Cilium-gegevensvlak ondersteunen Container Network Observability en Container Network Security vanaf Kubernetes versie 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
Advanced Container Networking Services inschakelen op een bestaand cluster
Met az aks update
de opdracht met de vlag Advanced Container Networking Services wordt --enable-acns
een bestaand AKS-cluster bijgewerkt met alle functies van Advanced Container Networking Services, waaronder Waarneembaarheid van containernetwerk en de functie Container Network Security .
Notitie
Alleen clusters met het Cilium-gegevensvlak ondersteunen containernetwerkbeveiligingsfuncties van Advanced Container Networking Services.
az aks update \
--resource-group $RESOURCE_GROUP \
--name $CLUSTER_NAME \
--enable-acns
Clusterreferenties ophalen
Zodra u de clusterreferenties hebt opgehaald met behulp van de az aks get-credentials
opdracht.
az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP
Door Azure beheerde Prometheus en Grafana
Sla deze sectie over als u BYO Prometheus en Grafana gebruikt
Gebruik het volgende voorbeeld om Prometheus en Grafana te installeren en in te schakelen voor uw AKS-cluster.
Azure Monitor-resource maken
#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 '{}'
Azure Managed Grafana-exemplaar maken
Gebruik az grafana create om een Grafana-exemplaar te maken. De naam van het Grafana-exemplaar moet uniek zijn.
# 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
De resource-id's van Azure Managed Grafana en Azure Monitor in variabelen plaatsen
Gebruik az grafana show om de Grafana-resource-id in een variabele te plaatsen. Gebruik az resource show om de Azure Monitor-resource-id in een variabele te plaatsen. Vervang myGrafana door de naam van uw Grafana-exemplaar.
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)
Azure Monitor en Azure Managed Grafana koppelen aan het AKS-cluster
Gebruik az aks update om de Azure Monitor- en Grafana-resources te koppelen aan uw AKS-cluster.
az aks update \
--name $CLUSTER_NAME \
--resource-group $RESOURCE_GROUP \
--enable-azure-monitor-metrics \
--azure-monitor-workspace-resource-id $azuremonitorId \
--grafana-resource-id $grafanaId
Visualisatie
Visualisatie met Azure Managed Grafana
Sla deze stap over als u BYO Grafana gebruikt
Notitie
De hubble_flows_processed_total
metrische waarde wordt niet standaard afgeschraapt vanwege een hoge metrische kardinaliteit in grootschalige clusters.
Hierdoor bevatten de Pods Flows-dashboards deelvensters met ontbrekende gegevens. Als u dit wilt wijzigen, kunt u de instellingen voor metrische gegevens van ama wijzigen zodat deze worden opgenomen hubble_flows_processed_total
in de lijst met metrische gegevens. Als u wilt weten hoe u dit doet, raadpleegt u de minimale opname-verdubbeling.
Zorg ervoor dat de Azure Monitor-pods worden uitgevoerd met behulp van de
kubectl get pods
opdracht.kubectl get pods -o wide -n kube-system | grep ama-
De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:
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
We hebben voorbeelddashboards gemaakt. Ze zijn te vinden in de map Dashboards > Azure Managed Prometheus . Ze hebben namen zoals 'Kubernetes / Netwerken /
<name>
'. De suite met dashboards omvat:- Clusters: toont metrische gegevens op knooppuntniveau voor uw clusters.
- DNS (Cluster): toont metrische DNS-gegevens in een cluster of selectie van knooppunten.
- DNS (workload): toont metrische DNS-gegevens voor de opgegeven workload (bijvoorbeeld pods van een DaemonSet of implementatie, zoals CoreDNS).
- Druppels (workload): toont dalingen naar/van de opgegeven werkbelasting (bijvoorbeeld pods van een implementatie of DaemonSet).
- Pod-stromen (naamruimte): toont L4/L7-pakketstromen naar/van de opgegeven naamruimte (dat wil bijvoorbeeld Pods in de naamruimte).
- Pod-stromen (workload): toont L4/L7-pakketstromen naar/van de opgegeven workload (bijvoorbeeld Pods van een implementatie of DaemonSet).
Visualisatie met BYO Grafana
Sla deze stap over als u azure managed Grafana gebruikt
Voeg de volgende scrape-taak toe aan uw bestaande Prometheus-configuratie en start de Prometheus-server opnieuw op:
- 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
Controleer in Doelen van Prometheus of de netwerk-obs-pods aanwezig zijn.
Meld u aan bij Grafana en importeer de volgende voorbeelddashboards met behulp van de volgende id's:
- Clusters: toont metrische gegevens op knooppuntniveau voor uw clusters. (Id: 18814)
- DNS (Cluster): toont metrische DNS-gegevens op een cluster of selectie van knooppunten.( Id: 20925)
- DNS (workload): toont metrische DNS-gegevens voor de opgegeven workload (bijvoorbeeld pods van een DaemonSet of implementatie, zoals CoreDNS). (Id: [20926] https://grafana.com/grafana/dashboards/20926-kubernetes-networking-dns-workload/)
- Druppels (workload): toont dalingen naar/van de opgegeven werkbelasting (bijvoorbeeld pods van een implementatie of DaemonSet).( Id: 20927).
- Pod-stromen (naamruimte): toont L4/L7-pakketstromen naar/van de opgegeven naamruimte (dat wil bijvoorbeeld Pods in de naamruimte). (Id: 20928)
- Pod-stromen (workload): toont L4/L7-pakketstromen naar/van de opgegeven workload (bijvoorbeeld Pods van een implementatie of DaemonSet).( Id: 20929)
Notitie
- Afhankelijk van de instellingen van uw Prometheus-/Grafana-exemplaren zijn voor sommige dashboardpanelen mogelijk aanpassingen vereist om alle gegevens weer te geven.
- Cilium biedt momenteel geen ondersteuning voor DNS-metrische gegevens/dashboards.
Hubble CLI installeren
Installeer de Hubble CLI voor toegang tot de gegevens die worden verzameld met behulp van de volgende opdrachten:
# 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}
De Hubble-stromen visualiseren
Zorg ervoor dat de Hubble-pods worden uitgevoerd met behulp van de
kubectl get pods
opdracht.kubectl get pods -o wide -n kube-system -l k8s-app=hubble-relay
De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:
hubble-relay-7ddd887cdb-h6khj 1/1 Running 0 23h
Port forward Hubble Relay met behulp van de
kubectl port-forward
opdracht.kubectl port-forward -n kube-system svc/hubble-relay --address 127.0.0.1 4245:443
Wederzijdse TLS (mTLS) zorgt voor de beveiliging van de Hubble Relay-server. Als u wilt dat de Hubble-client stromen kan ophalen, moet u de juiste certificaten ophalen en de client ermee configureren. Pas de certificaten toe met behulp van de volgende opdrachten:
#!/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
Controleer of de geheimen zijn gegenereerd met behulp van de volgende
kubectl get secrets
opdracht:kubectl get secrets -n kube-system | grep hubble-
De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:
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
Zorg ervoor dat de Hubble Relay-pod wordt uitgevoerd met behulp van de
hubble observe
opdracht.hubble observe --pod hubble-relay-7ddd887cdb-h6khj
Visualiseren met behulp van Hubble UI
Als u de Hubble-gebruikersinterface wilt gebruiken, slaat u het volgende op in 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
Pas het hubble-ui.yaml-manifest toe op uw cluster met behulp van de volgende opdracht
kubectl apply -f hubble-ui.yaml
Stel port forwarding in voor de Hubble-gebruikersinterface met behulp van de
kubectl port-forward
opdracht.kubectl -n kube-system port-forward svc/hubble-ui 12000:80
Access Hubble UI door in uw webbrowser in te voeren
http://localhost:12000/
.
Resources opschonen
Als u van plan bent om deze toepassing te gebruiken, verwijdert u de andere resources die u in dit artikel hebt gemaakt met behulp van de az group delete
opdracht.
az group delete --name $RESOURCE_GROUP
Volgende stappen
In dit artikel hebt u geleerd hoe u Container Network Observability voor uw AKS-cluster installeert en inschakelt.
Zie Wat is Advanced Container Networking Services (AKS) voor Azure Kubernetes Service (AKS) voor meer informatie over Advanced Container Networking Services (AKS)?
Zie Wat is Container Network Security?voor meer informatie over Container Network Security en de mogelijkheden ervan.
Azure Kubernetes Service