Бөлісу құралы:


Настройка расширенного сетевого наблюдения для Служба Azure Kubernetes (AKS) — Управляемый Prometheus Azure и Grafana (предварительная версия)

В этой статье показано, как настроить расширенное сетевое наблюдение для Служба Azure Kubernetes (AKS) с помощью Управляемого Prometheus и Grafana для визуализации срезированных метрик.

Для сбора данных о сетевом трафике кластеров AKS можно использовать расширенное сетевое наблюдение. Она обеспечивает централизованную платформу для мониторинга работоспособности приложений и сети. В настоящее время метрики хранятся в Prometheus и Grafana можно использовать для их визуализации. Расширенная возможность наблюдения за сетями также обеспечивает возможность включения Hubble. Эти возможности поддерживаются как для кластеров Cilium, так и для кластеров, отличных от Cilium.

Расширенное сетевое наблюдение — это одна из функций расширенных сетевых служб контейнеров. Дополнительные сведения о расширенных сетевых службах контейнеров для Служба Azure Kubernetes (AKS) см. в статье "Дополнительные сетевые службы контейнеров" для Служба Azure Kubernetes (AKS)?.

Внимание

Расширенные возможности наблюдения за сетями в настоящее время находятся в предварительной версии. Юридические условия, применимые к функциям Azure, которые находятся в состоянии бета-версии, предварительной версии или иным образом еще не выпущены в общедоступной версии, см. на странице Дополнительные условия использования предварительных версий в Microsoft Azure.

Необходимые компоненты

  • Учетная запись Azure с активной подпиской. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начать работу.
  • Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см . в кратком руководстве по Bash в Azure Cloud Shell.

  • Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.

    • Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.

    • Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.

    • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

  • Минимальная версия Azure CLI, необходимая для действий, описанных в этой статье, — 2.56.0. Чтобы узнать версию, выполните команду az --version. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.

Установка расширения Azure CLI aks-preview

Установите или обновите расширение предварительной версии Azure CLI с помощью az extension add команды или 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

Регистрация флага компонента AdvancedNetworkingPreview

az feature register --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingPreview" Зарегистрируйте флаг компонента с помощью az feature register команды.

az feature register --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingPreview"

Проверьте успешную az feature show регистрацию с помощью команды. Регистрация занимает несколько минут.

az feature show --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingPreview"

После показа Registeredфункции обновите регистрацию Microsoft.ContainerService поставщика ресурсов с помощью az provider register команды.

Создание или изменение группы ресурсов

Группа ресурсов — это логический контейнер, в котором происходит развертывание ресурсов Azure и управление ими. Создайте группу ресурсов с помощью az group create команды.

# Set environment variables for the resource group name and location. Make sure to replace the placeholders with your own values.
export RESOURCE_GROUP="<resource-group-name>"
export LOCATION="<azure-region>"

# Create a resource group
az group create --name $RESOURCE_GROUP --location $LOCATION

Создание кластера AKS с расширенным сетевым наблюдением

Создайте кластер AKS с расширенным сетевым наблюдением с плоскости данных, отличной от Cilium, с помощью az aks create команды и флага --enable-advanced-networking-observability .

# 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 \
    --network-plugin azure \
    --network-plugin-mode overlay \
    --pod-cidr 192.168.0.0/16 \
    --enable-advanced-network-observability

Включение расширенной сетевой наблюдаемости в существующем кластере

Включите расширенное сетевое наблюдение в существующем кластере az aks update с помощью команды.

Примечание.

Кластеры с плоскостью данных Cilium поддерживают расширенное сетевое наблюдение, начиная с Kubernetes версии 1.29.

az aks update \
    --resource-group $RESOURCE_GROUP \
    --name $CLUSTER_NAME \
    --enable-advanced-network-observability

Получение учетных данных кластера

Получите учетные данные кластера с помощью az aks get-credentials команды.

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

Управляемый Prometheus и Grafana Azure

Используйте следующий пример, чтобы установить и включить Prometheus и Grafana для кластера AKS.

Создание ресурса 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 '{}'

Создание экземпляра Grafana

Используйте az grafana create для создания экземпляра Grafana. Имя экземпляра Grafana должно быть уникальным.

# 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 

Поместите идентификаторы ресурсов Grafana и Azure Monitor в переменные

Используйте az grafana show , чтобы поместить идентификатор ресурса Grafana в переменную. Используйте az resource show , чтобы поместить идентификатор ресурса Azure Monitor в переменную. Замените myGrafana именем экземпляра Grafana.

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)

Используйте az aks update , чтобы связать ресурсы Azure Monitor и Grafana с кластером AKS.

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

Визуализация с помощью Grafana

Примечание.

hubble_flows_processed_total Метрика по умолчанию не удаляется из-за высокой кратности метрик в крупных кластерах. Из-за этого панели мониторинга потоков Pods имеют панели с отсутствующими данными. Чтобы изменить это, можно изменить параметры метрик ama, чтобы включить hubble_flows_processed_total их в список хранения метрик. Чтобы узнать, как это сделать, ознакомьтесь с минимальным приемом Doumentation.

  1. Убедитесь, что модули pod Azure Monitor выполняются с помощью kubectl get pods команды.

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

    Выходные данные должны выглядеть примерно так:

    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. Мы создали примеры панелей мониторинга. Их можно найти в папке "Панели мониторинга > Azure Managed Prometheus ". Они имеют такие имена, как Kubernetes / Networking /<name>. Набор панелей мониторинга включает:

    • Кластеры: отображаются метрики уровня узла для кластеров.
    • DNS (кластер): отображаются метрики DNS в кластере или выборе узлов.
    • DNS (рабочая нагрузка): отображаются метрики DNS для указанной рабочей нагрузки (например, pod для daemonSet или deployment, например CoreDNS).
    • Drops (Рабочая нагрузка): отображает отпадает до указанной рабочей нагрузки (например, pod для развертывания или daemonSet).
    • Потоки pod (пространство имен): отображаются потоки пакетов L4/L7 в указанное пространство имен (т. е. pod в пространстве имен).
    • Потоки pod (рабочая нагрузка): отображаются потоки пакетов L4/L7 в указанную рабочую нагрузку (например, pod для развертывания или daemonSet).

Примечание.

  • Плоскость данных Cilium в настоящее время не поддерживает метрики и панели мониторинга DNS.

Установка cli Hubble

Установите CLI Hubble, чтобы получить доступ к собранным данным с помощью следующих команд:

# 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

  1. Убедитесь, что модули pod Hubble выполняются с помощью kubectl get pods команды.

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

    Выходные данные должны выглядеть примерно так:

    hubble-relay-7ddd887cdb-h6khj     1/1  Running     0       23h 
    
  2. Перенаправляющий ретранслятор Hubble через порт с помощью kubectl port-forward команды.

    kubectl port-forward -n kube-system svc/hubble-relay --address 127.0.0.1 4245:443
    
  3. Взаимное tls (mTLS) обеспечивает безопасность сервера Hubble Relay. Чтобы клиент Hubble мог получать потоки, необходимо получить соответствующие сертификаты и настроить клиент с ними. Примените сертификаты с помощью следующих команд:

    #!/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. Убедитесь, что секреты были созданы с помощью следующей kubectl get secrets команды:

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

    Выходные данные должны выглядеть примерно так:

    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. Убедитесь, что модуль pod Hubble Relay выполняется с помощью hubble observe команды.

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

Визуализация с помощью пользовательского интерфейса Hubble

  1. Чтобы использовать пользовательский интерфейс Hubble, сохраните следующее в 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:
          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. Применение манифеста hubble-ui.yaml к кластеру с помощью следующей команды

    kubectl apply -f hubble-ui.yaml
    
  3. Настройте перенаправление портов для пользовательского интерфейса Hubble с помощью kubectl port-forward команды.

    kubectl -n kube-system port-forward svc/hubble-ui 12000:80
    
  4. Доступ к пользовательскому интерфейсу Hubble путем ввода http://localhost:12000/ в веб-браузер.


Очистка ресурсов

Если вы не планируете использовать это приложение, удалите другие ресурсы, созданные в этой статье, с помощью az group delete команды.

  az group delete --name $RESOURCE_GROUP

Следующие шаги

Из этой статьи вы узнали, как установить и включить расширенное сетевое наблюдение для кластера AKS.