Azure Kubernetes Service (AKS) için Kapsayıcı Ağ Gözlemlenebilirliğini ayarlama - Azure tarafından yönetilen Prometheus ve Grafana

Bu makalede, Yönetilen Prometheus ve Grafana ile BYO Prometheus ve Grafana kullanarak Azure Kubernetes Service (AKS) için Kapsayıcı Ağ Gözlemlenebilirliğini ayarlama ve kazınmış ölçümleri görselleştirme adımları gösterilmektedir

AKS kümelerinizin ağ trafiği hakkında veri toplamak için Kapsayıcı Ağ Gözlemlenebilirliği'ni kullanabilirsiniz. Uygulama ve ağ durumunu izlemek için merkezi bir platform sağlar. Şu anda ölçümler Prometheus'ta depolanır ve Grafana bunları görselleştirmek için kullanılabilir. Kapsayıcı Ağ Gözlemlenebilirliği, Hubble'ı etkinleştirme olanağı da sunar. Bu özellikler hem Cilium hem de Cilium olmayan kümeler için desteklenir.

Kapsayıcı Ağı Gözlemlenebilirliği, Gelişmiş Kapsayıcı Ağ Hizmetleri'nin özelliklerinden biridir. Azure Kubernetes Service (AKS) için Gelişmiş Kapsayıcı Ağ Hizmetleri hakkında daha fazla bilgi için bkz . Azure Kubernetes Service (AKS) için Gelişmiş Kapsayıcı Ağ Hizmetleri nedir?.

Önkoşullar

  • Azure Cloud Shell'de Bash ortamını kullanın. Daha fazla bilgi için bkz . Azure Cloud Shell'de Bash için hızlı başlangıç.

  • CLI başvuru komutlarını yerel olarak çalıştırmayı tercih ediyorsanız Azure CLI'yı yükleyin . Windows veya macOS üzerinde çalışıyorsanız Azure CLI’yi bir Docker kapsayıcısında çalıştırmayı değerlendirin. Daha fazla bilgi için bkz . Docker kapsayıcısında Azure CLI'yi çalıştırma.

    • Yerel yükleme kullanıyorsanız az login komutunu kullanarak Azure CLI ile oturum açın. Kimlik doğrulama işlemini tamamlamak için terminalinizde görüntülenen adımları izleyin. Diğer oturum açma seçenekleri için bkz . Azure CLI ile oturum açma.

    • İstendiğinde, ilk kullanımda Azure CLI uzantısını yükleyin. Uzantılar hakkında daha fazla bilgi için bkz. Azure CLI ile uzantıları kullanma.

    • Yüklü sürümü ve bağımlı kitaplıkları bulmak için az version komutunu çalıştırın. En son sürüme yükseltmek için az upgrade komutunu çalıştırın.

  • Bu makaledeki adımlar için gereken en düşük Azure CLI sürümü 2.56.0'dır. Sürümü bulmak için az --version komutunu çalıştırın. Yüklemeniz veya yükseltmeniz gerekirse, bkz. Azure CLI yükleme.

aks-preview Azure CLI uzantısını yükleme

veya komutunu kullanarak Azure CLI önizleme uzantısını yükleyin veya az extension update güncelleştirinaz extension add.

# 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

Gelişmiş Kapsayıcı Ağ Hizmetlerini Etkinleştirme

Devam etmek için Gelişmiş Kapsayıcı Ağ Hizmetleri'nin etkinleştirildiği bir AKS kümeniz olmalıdır.

az aks create Gelişmiş Kapsayıcı Ağ Hizmetleri bayrağına sahip komut, --enable-acnstüm Gelişmiş Kapsayıcı Ağ Hizmetleri özellikleriyle yeni bir AKS kümesi oluşturur. Bu özellikler şunları kapsar:

Not

Cilium veri düzlemi olan kümeler, Kubernetes sürüm 1.29'dan başlayarak Kapsayıcı Ağı Gözlemlenebilirliği ve Kapsayıcı Ağı güvenliğini destekler.

# 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

Mevcut bir kümede Gelişmiş Kapsayıcı Ağ Hizmetlerini etkinleştirme

az aks update Gelişmiş Kapsayıcı Ağ Hizmetleri bayrağı olan komutu, --enable-acnsmevcut aks kümesini Kapsayıcı Ağı Gözlemlenebilirliği ve Kapsayıcı Ağ Güvenliği özelliğini içeren tüm Gelişmiş Kapsayıcı Ağ Hizmetleri özellikleriyle güncelleştirir.

Not

Yalnızca Cilium veri düzlemi olan kümeler, Gelişmiş Kapsayıcı Ağ Hizmetleri'nin Kapsayıcı Ağı Güvenliği özelliklerini destekler.

az aks update \
    --resource-group $RESOURCE_GROUP \
    --name $CLUSTER_NAME \
    --enable-acns

Küme kimlik bilgilerini alma

Komutunu kullanarak küme kimlik bilgilerinizi alın'a az aks get-credentials sahip olduktan sonra.

az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP

Azure tarafından yönetilen Prometheus ve Grafana

BYO Prometheus ve Grafana kullanıyorsanız bu Bölümü atlayın

AKS kümeniz için Prometheus ve Grafana'yı yüklemek ve etkinleştirmek için aşağıdaki örneği kullanın.

Azure İzleyici kaynağı oluşturma

#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 Yönetilen Grafana örneği oluşturma

Grafana örneği oluşturmak için az grafana create komutunu kullanın. Grafana örneğinin adı benzersiz olmalıdır.

# 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 

Azure Yönetilen Grafana ve Azure İzleyici kaynak kimliklerini değişkenlere yerleştirme

Az grafana show komutunu kullanarak Grafana kaynak kimliğini bir değişkene yerleştirin. Azure İzleyici kaynak kimliğini bir değişkene yerleştirmek için az resource show komutunu kullanın. myGrafana değerini Grafana örneğinizin adıyla değiştirin.

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 İzleyici ve Grafana kaynaklarını AKS kümenize bağlamak için az aks update komutunu kullanın.

az aks update \
    --name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP \
    --enable-azure-monitor-metrics \
    --azure-monitor-workspace-resource-id $azuremonitorId \
    --grafana-resource-id $grafanaId

Görselleştirme

Azure Yönetilen Grafana kullanarak görselleştirme

BYO Grafana kullanıyorsanız bu adımı atlayın

Not

Büyük hubble_flows_processed_total ölçekli kümelerdeki yüksek ölçüm kardinalitesi nedeniyle ölçüm varsayılan olarak kazınmaz. Bu nedenle Pod Akışları panolarında eksik veri içeren paneller bulunur. Bunu değiştirmek için ama ölçüm ayarlarını ölçüm saklama listesine eklenecek hubble_flows_processed_total şekilde değiştirebilirsiniz. Bunun nasıl yapılacağını öğrenmek için bkz . En Az Alım Doumentation.

  1. komutunu kullanarak Azure İzleyici podlarının çalıştığından kubectl get pods emin olun.

    kubectl get pods -o wide -n kube-system | grep ama-
    

    Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır:

    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
    
  2. Örnek panolar oluşturduk. Panolar > Azure Yönetilen Prometheus klasöründe bulunabilir. "Kubernetes / Networking / <name>" gibi adları vardır. Pano paketi şunları içerir:

    • Kümeler: Kümeleriniz için Düğüm düzeyinde ölçümleri gösterir.
    • DNS (Küme): Bir kümedeki DNS ölçümlerini veya Düğümlerin seçimini gösterir.
    • DNS (İş Yükü): Belirtilen iş yükü için DNS ölçümlerini gösterir (örneğin, DaemonSet podları veya CoreDNS gibi Dağıtım).
    • Bırakmalar (İş Yükü): Belirtilen iş yüküne/iş yükünden gelen düşüşleri gösterir (örneğin, Dağıtım podları veya DaemonSet).
    • Pod Akışları (Ad Alanı): Belirtilen ad alanına/ad alanından (ad alanında podlar gibi) L4/L7 paket akışlarını gösterir.
    • Pod Akışları (İş Yükü): Belirtilen iş yüküne /iş yükünden L4/L7 paket akışlarını gösterir (örneğin, Dağıtım podları veya DaemonSet).

BYO Grafana kullanarak görselleştirme

Azure tarafından yönetilen Grafana kullanılıyorsa bu adımı atlayın

  1. Mevcut Prometheus yapılandırmanıza aşağıdaki kazıma işini ekleyin ve Prometheus sunucunuzu yeniden başlatın:

    - 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
    
  2. Prometheus Hedefleri bölümünde network-obs-pod'ların mevcut olduğunu doğrulayın.

  3. Grafana'da oturum açın ve aşağıdaki kimlikleri kullanarak aşağıdaki örnek panoları içeri aktarın:

    • Kümeler: Kümeleriniz için Düğüm düzeyinde ölçümleri gösterir. (Kimlik: 18814)
    • DNS (Küme): Bir kümedeki DNS ölçümlerini veya Düğümlerin seçimini gösterir.( Kimlik: 20925)
    • DNS (İş Yükü): Belirtilen iş yükü için DNS ölçümlerini gösterir (örneğin, DaemonSet podları veya CoreDNS gibi Dağıtım). (Kimlik: [20926] https://grafana.com/grafana/dashboards/20926-kubernetes-networking-dns-workload/)
    • Bırakmalar (İş Yükü): Belirtilen iş yüküne/iş yükünden gelen düşüşleri gösterir (örneğin, Dağıtım veya DaemonSet podları).( Kimlik: 20927).
    • Pod Akışları (Ad Alanı): Belirtilen ad alanına/ad alanından (ad alanında podlar gibi) L4/L7 paket akışlarını gösterir. (Kimlik: 20928)
    • Pod Akışları (İş Yükü): Belirtilen iş yüküne /iş yükünden L4/L7 paket akışlarını gösterir (örneğin, Dağıtım podları veya DaemonSet).( Kimlik: 20929)

    Not

    • Prometheus/Grafana örneklerinizin ayarlarına bağlı olarak, bazı pano panellerinde tüm verilerin görüntülenmesi için ince ayarlar gerekebilir.
    • Cilium şu anda DNS ölçümlerini/panolarını desteklememektedir.

Hubble CLI'yi yükleme

Aşağıdaki komutları kullanarak topladığı verilere erişmek için Hubble CLI'yi yükleyin:

# Set environment variables
export HUBBLE_VERSION=v0.11.0
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}

Hubble Akışlarını Görselleştirme

  1. Hubble podlarının komutunu kullanarak çalıştığından kubectl get pods emin olun.

    kubectl get pods -o wide -n kube-system -l k8s-app=hubble-relay
    

    Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır:

    hubble-relay-7ddd887cdb-h6khj     1/1  Running     0       23h 
    
  2. komutunu kullanarak kubectl port-forward bağlantı noktası iletme Hubble Geçişi.

    kubectl port-forward -n kube-system svc/hubble-relay --address 127.0.0.1 4245:443
    
  3. Karşılıklı TLS (mTLS), Hubble Relay sunucusunun güvenliğini sağlar. Hubble istemcisinin akışları almasını sağlamak için uygun sertifikaları almanız ve istemciyi onlarla yapılandırmanız gerekir. Aşağıdaki komutları kullanarak sertifikaları uygulayın:

    #!/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
    
  4. Aşağıdaki kubectl get secrets komutu kullanarak gizli dizilerin oluşturulduğunu doğrulayın:

    kubectl get secrets -n kube-system | grep hubble-
    

    Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır:

    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    
    
  5. Hubble Relay podunun komutunu kullanarak çalıştığından hubble observe emin olun.

    hubble observe --pod hubble-relay-7ddd887cdb-h6khj
    

Hubble kullanıcı arabirimini kullanarak görselleştirme

  1. Hubble kullanıcı arabirimini kullanmak için aşağıdakileri hubble-ui.yaml dosyasına kaydedin

    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:
          serviceAccount: hibble-ui
          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
    
  2. Aşağıdaki komutu kullanarak hubble-ui.yaml bildirimini kümenize uygulayın

    kubectl apply -f hubble-ui.yaml
    
  3. komutunu kullanarak Hubble kullanıcı arabirimi için bağlantı noktası iletmeyi kubectl port-forward ayarlayın.

    kubectl -n kube-system port-forward svc/hubble-ui 12000:80
    
  4. Web tarayıcınıza girerek http://localhost:12000/ Hubble kullanıcı arabirimine erişin.


Kaynakları temizleme

Bu uygulamayı kullanmayı planlamıyorsanız komutunu kullanarak az group delete bu makalede oluşturduğunuz diğer kaynakları silin.

  az group delete --name $RESOURCE_GROUP

Sonraki adımlar

Bu nasıl yapılır makalesinde AKS kümeniz için Container Network Observability'ı yüklemeyi ve etkinleştirmeyi öğrendiniz.