Azure Kubernetes Service (AKS) におけるアドバンスト ネットワーク監視の設定 (プレビュー)
この記事では、Azure Kubernetes Service (AKS) のアドバンスト ネットワーク監視を設定し、Bring Your Own (BYO) の Prometheus および Grafana を使用してメトリックを視覚化する方法について説明します。
アドバンスト ネットワーク監視を使用して、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
コマンドを使用して、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 データ プレーンを持つアドバンスト ネットワーク監視を使用した 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
既存のクラスターでアドバンスト ネットワーク監視を有効にする
az aks update
コマンドを使用して、既存のクラスターで Advanced Network Observability を有効にします。
Note
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
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 をインストールします。
# 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 relay service
コマンドを使用して、Hubble リレー ポッドが実行されていることを確認します。hubble relay service
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
コマンドを使用して、ポート フォワーディングを設定して、サービスを公開します。kubectl 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) のアドバンスト コンテナー ネットワーク サービスの詳細については、「Azure Kubernetes Service (AKS) のアドバンスト コンテナー ネットワーク サービスの概要」を参照してください。
アドバンスト ネットワーク監視と Azure マネージド Prometheus および Grafana を使用して AKS クラスターを作成するには、「Azure Kubernetes Service (AKS) におけるアドバンスト ネットワーク監視の設定 - Azure マネージド Prometheus および Grafana」をご覧ください。
Azure Kubernetes Service