Настройка расширенного сетевого наблюдения для Служба 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)
Связывание Azure Monitor и Grafana с кластером AKS
Используйте 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.
Убедитесь, что модули 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
Мы создали примеры панелей мониторинга. Их можно найти в папке "Панели мониторинга > 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
Убедитесь, что модули 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
Перенаправляющий ретранслятор Hubble через порт с помощью
kubectl port-forward
команды.kubectl port-forward -n kube-system svc/hubble-relay --address 127.0.0.1 4245:443
Взаимное 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
Убедитесь, что секреты были созданы с помощью следующей
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
Убедитесь, что модуль pod Hubble Relay выполняется с помощью
hubble observe
команды.hubble observe --pod hubble-relay-7ddd887cdb-h6khj
Визуализация с помощью пользовательского интерфейса Hubble
Чтобы использовать пользовательский интерфейс 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
Применение манифеста hubble-ui.yaml к кластеру с помощью следующей команды
kubectl apply -f hubble-ui.yaml
Настройте перенаправление портов для пользовательского интерфейса Hubble с помощью
kubectl port-forward
команды.kubectl -n kube-system port-forward svc/hubble-ui 12000:80
Доступ к пользовательскому интерфейсу Hubble путем ввода
http://localhost:12000/
в веб-браузер.
Очистка ресурсов
Если вы не планируете использовать это приложение, удалите другие ресурсы, созданные в этой статье, с помощью az group delete
команды.
az group delete --name $RESOURCE_GROUP
Следующие шаги
Из этой статьи вы узнали, как установить и включить расширенное сетевое наблюдение для кластера AKS.
Дополнительные сведения о расширенных сетевых службах контейнеров для Служба Azure Kubernetes (AKS) см. в статье "Дополнительные сетевые службы контейнеров" для Служба Azure Kubernetes (AKS)?.
Сведения о создании расширенного сетевого наблюдения — BYO Prometheus и Grafana см. в разделе "Настройка расширенного сетевого наблюдения" для Служба Azure Kubernetes (AKS) — BYO Prometheus и Grafana.
Azure Kubernetes Service