Azure Kubernetes Service (AKS) のコンテナー ネットワークの監視を設定する - Azure Managed Prometheus と Grafana
この記事では、Managed Prometheus と Grafana、および BYO Prometheus と Grafana を使用して Azure Kubernetes Service (AKS) のコンテナー ネットワークの監視を設定し、スクレイピングされたメトリックを視覚化する方法を説明します
コンテナー ネットワークの監視を使用すると、AKS クラスターのトラフィックに関するデータを収集できます。 アプリケーションとネットワークの正常性を監視する一元化されたプラットフォームが実現します。 現時点では、メトリックは Prometheus に格納されており、Grafana を使用してそれらを視覚化できます。 コンテナー ネットワークの監視には、Hubble を有効にする機能も用意されています。 これらの機能は、Cilium クラスターと非 Cilium クラスターの両方でサポートされています。
コンテナー ネットワークの監視は、アドバンスト コンテナー ネットワークサービスの機能の 1 つです。 Azure Kubernetes Service (AKS) 用のアドバンスト コンテナー ネットワークサービスの詳細については、Azure Kubernetes Service (AKS) 用のアドバンスト コンテナー ネットワークサービスとは何かに関するページを参照してください。
前提条件
- アクティブなサブスクリプションが含まれる 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プレビューの 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
アドバンスト コンテナー ネットワークサービスを有効にする
これ以降の作業では、アドバンスト コンテナー ネットワークサービスが有効になっている AKS クラスターが必要となります。
az aks create
コマンドにアドバンスト コンテナー ネットワークサービスのフラグ --enable-acns
を指定すると、アドバンスト コンテナー ネットワークサービスのすべての機能を備えた新しい AKS クラスターが作成されます。 これらの機能には以下が含まれます。
コンテナー ネットワークの監視: トラフィックに関する分析情報を提供します。 詳細については、コンテナー ネットワークの監視に関するページを参照してください。
コンテナー ネットワークのセキュリティ: FQDN フィルタリングなどのセキュリティ機能を提供します。 詳細については、コンテナー ネットワークのセキュリティに関するページを参照してください。
Note
Cilium データ プレーンを備えたクラスターでは、Kubernetes バージョン 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
アドバンスト コンテナー ネットワークサービスを既存のクラスターに対して有効にする
az aks update
コマンドにアドバンスト コンテナー ネットワークサービスのフラグ --enable-acns
を指定すると、コンテナー ネットワークの監視とコンテナー ネットワークのセキュリティの機能を含むすべてのアドバンスト コンテナー ネットワークサービス機能で既存の AKS クラスターが更新されます。
Note
アドバンスト コンテナー ネットワークサービスのコンテナー ネットワークのセキュリティ機能をサポートしているのは、Cilium データ プレーンを備えたクラスターだけです。
az aks update \
--resource-group $RESOURCE_GROUP \
--name $CLUSTER_NAME \
--enable-acns
クラスターの資格情報を取得する
az aks get-credentials
コマンドを使用してクラスターの資格情報を取得します。
az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP
Azure Managed Prometheus と Grafana
BYO 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 '{}'
Azure Managed 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
Azure Managed 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 と Azure Managed 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
ビジュアル化
Azure Managed Grafana を使用した視覚化
BYO 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 など) を示します。
BYO Grafana を使用した視覚化
Azure Managed Grafana を使用する場合はこの手順をスキップしてください
既存の Prometheus 構成に次のスクレイピング ジョブを追加し、Prometheus サーバーを再起動します。
- 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
Prometheus のターゲットに、network-obs-pods が存在することを確認します。
Grafana にサインインし、次の ID を使用して次のダッシュボード例をインポートします。
- クラスター: クラスターのノードレベルのメトリックを示します。 (ID: 18814)
- DNS (クラスター): クラスターの DNS メトリックまたはノードの選択を示します。(ID: 20925)
- DNS (ワークロード): 指定されたワークロード (CoreDNS などのデーモンセットまたはデプロイのポッドなど) の DNS メトリックを示します。 (ID: [20926] https://grafana.com/grafana/dashboards/20926-kubernetes-networking-dns-workload/)
- ドロップ (ワークロード): 指定されたワークロード (デプロイまたはデーモンセットのポッドなど) との間のドロップを示します。(ID: 20927)。
- ポッド フロー (名前空間): 指定された名前空間 (つまり、名前空間内のポッド) との間の L4/L7 パケット フローを示します。 (ID: 20928)
- ポッド フロー (ワークロード): 指定されたワークロードとの間の L4/L7 パケット フロー (デプロイまたはデーモンセットのポッドなど) を示します。(ID: 20929)
Note
- Prometheus/Grafana インスタンスの設定によっては、一部のダッシュボード パネルですべてのデータを表示するために調整が必要になる場合があります。
- Ciliumは現在、DNS メトリック/ダッシュボードをサポートしていません。
Hubble CLI のインストール
次のコマンドを使用して収集したデータにアクセスするには、Hubble CLI をインストールします。
# 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}
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 クラスターにコンテナー ネットワークの監視をインストールして有効にする方法について説明しました。
Azure Kubernetes Service (AKS) 用のアドバンスト コンテナー ネットワークサービスの詳細については、Azure Kubernetes Service (AKS) 用のアドバンスト コンテナー ネットワークサービスとは何かに関するページを参照してください。
コンテナー ネットワークのセキュリティとその機能の詳細については、「コンテナー ネットワーク セキュリティとは」を参照してください。
Azure Kubernetes Service