Azure Kubernetes Service (AKS) における Advanced Network Observability のセットアップ - Azure Managed Prometheus と Grafana (プレビュー)
この記事では、Managed Prometheus と Grafana を使用して Azure Kubernetes Service (AKS) の Advanced Network Observability をセットアップして、スクレイピングされたメトリックを視覚化する方法について説明します。
Advanced Network Observability を使用して、AKS クラスターのネットワーク トラフィックに関するデータを収集できます。 アプリケーションとネットワークの正常性を監視する一元化されたプラットフォームが実現します。 現時点では、メトリックは Prometheus に格納されており、Grafana を使用してそれらを視覚化できます。 Advanced Network Observability は、Hubble を有効にする機能も提供します。 これらの機能は、Cilium クラスターと非 Cilium クラスターの両方でサポートされています。
Advanced Network Observability は、アドバンスト コンテナー ネットワークサービスの機能の 1 つです。 Azure Kubernetes Service (AKS) の Advanced Container Networking Services の詳細については、Azure Kubernetes Service (AKS) の Advanced Container Networking Services の概要に関する記事を参照してください。
重要
Advanced Network Observability は現在プレビューの段階です。 ベータ版、プレビュー版、または一般提供としてまだリリースされていない Azure の機能に適用される法律条項については、「Microsoft Azure プレビューの追加使用条件」を参照してください。
前提条件
- アクティブなサブスクリプションが含まれる Azure アカウント。 お持ちでない場合は、開始する前に無料アカウントを作成してください。
Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。
CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。
ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。
初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。
az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。
- この記事の手順に必要な Azure CLI の最小バージョンは 2.56.0 です。 バージョンを確認するには、
az --version
を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。
aks-preview
Azure CLI 拡張機能をインストールする
az extension add
または az extension update
コマンドを使用して、Azure CLI プレビュー拡張機能をインストールまたは更新します。
# 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
コマンドを使用して、az feature register --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingPreview"
機能フラグを登録します。
az feature register --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingPreview"
az feature show
コマンドを使用して、登録が成功したことを確認します。 登録が完了するまでに数分かかります。
az feature show --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingPreview"
機能に Registered
が表示されたら、az provider register
コマンドを使用して、Microsoft.ContainerService
リソース プロバイダーの登録を更新します。
リソース グループを作成する
リソース グループとは、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
Advanced Network Observability を使用して AKS クラスターを作成する
az aks create
コマンドと --enable-advanced-networking-observability
フラグを使用して、非 Cilium データ プレーンを持つ Advanced Network Observability を使用した AKS クラスターを作成します。
# 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
既存のクラスターで Advanced Network Observability を有効にする
az aks update
コマンドを使用して、既存のクラスターで Advanced Network Observability を有効にします。
Note
Cilium データ プレーンを持つクラスターでは、Kubernetes バージョン 1.29 以降の Advanced Network Observability がサポートされています。
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
Azure Managed Prometheus と Grafana
次の例を参考にして、AKS クラスターに対して Prometheus と Grafana をインストールして有効にします。
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 のリソース ID を変数に設定する
az grafana show を使用して、Grafana リソース ID を変数に設定します。 az resource show を使用して、Azure Monitor リソース ID を変数に設定します。 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 を使用した視覚化
Note
大規模クラスターではメトリックのカーディナリティが高いため、hubble_flows_processed_total
メトリックは既定ではスクレイピングされません。
このため、ポッド フロー ダッシュボードには、不足しているデータを含むパネルがあります。 これを変更するには、hubble_flows_processed_total
をメトリック保持リストに含める ama メトリック設定を変更します。 これを行う方法については、最小インジェストに関するドキュメントを参照してください。
kubectl get pods
コマンドを使用して、Azure Monitor ポッドが実行されていることを確認します。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
サンプル ダッシュボードを作成しました。 これらは、Dashboards > Azure Managed Prometheus フォルダーの下にあります。 これらには、"Kubernetes / Networking /
<name>
" のような名前が付いています。 ダッシュボードのスイートには、次のものが含まれます。- クラスター: クラスターのノード レベルのメトリックを示します。
- DNS (クラスター): クラスターの DNS メトリックまたはノードの選択を示します。
- DNS (ワークロード): 指定されたワークロード (DaemonSet のポッドや CoreDNS などのデプロイ) の DNS メトリックを示します。
- ドロップ (ワークロード): 指定されたワークロード (デプロイのポッドや DaemonSet など) との間のドロップを示します。
- ポッド フロー (名前空間): 指定された名前空間 (つまり、名前空間内のポッド) との間の L4/L7 パケット フローを示します。
- ポッド フロー (ワークロード): 指定されたワークロードとの間の L4/L7 パケット フロー (デプロイのポッドまたは DaemonSet など) を示します。
Note
- Cilium データ プレーンは現在、DNS メトリック/ダッシュボードをサポートしていません。
Hubble CLI のインストール
次のコマンドを使用して収集したデータにアクセスするには、Hubble CLI をインストールします。
# 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 フローを視覚化する
kubectl get pods
コマンドを使用して、Hubble ポッドが実行されていることを確認します。kubectl get pods -o wide -n kube-system -l k8s-app=hubble-relay
出力は次の出力例のようになります。
hubble-relay-7ddd887cdb-h6khj 1/1 Running 0 23h
kubectl port-forward
コマンドを使用して、Hubble リレーをポート フォワードします。kubectl port-forward -n kube-system svc/hubble-relay --address 127.0.0.1 4245:443
相互 TLS (mTLS) により、Hubble リレー サーバーのセキュリティが確保されます。 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
hubble observe
コマンドを使用して、Hubble リレー ポッドが実行されていることを確認します。hubble observe --pod hubble-relay-7ddd887cdb-h6khj
Hubble UI を使用して視覚化する
Hubble UI を使用するには、次を 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
kubectl port-forward
コマンドを使用して、Hubble UI のポート フォワーディングを設定します。kubectl -n kube-system port-forward svc/hubble-ui 12000:80
Web ブラウザーに
http://localhost:12000/
を入力して、Hubble UI にアクセスします。
リソースをクリーンアップする
このアプリケーションの使用を計画していない場合は、az group delete
コマンドを使用して、この記事で作成した他のリソースを削除します。
az group delete --name $RESOURCE_GROUP
次のステップ
このハウツー記事では、AKS クラスターに Advanced Network Observability をインストールして有効にする方法について説明しました。
Azure Kubernetes Service (AKS) の Advanced Container Networking Services の詳細については、Azure Kubernetes Service (AKS) の Advanced Container Networking Services の概要に関する記事を参照してください。
Advanced Network Observability - BYO Prometheus と Grafana を作成するには、「Azure Kubernetes Service (AKS) における Advanced Network Observability のセットアップ - BYO Prometheus と Grafana」をご覧ください。
Azure Kubernetes Service