次の方法で共有


高度な Container Networking Services を使用してコンテナー ネットワーク ログを設定する

このドキュメントは、Advanced Container Networking Services を使用してコンテナー ネットワーク ログ機能を構成および利用するための明確な手順を提供するように設計されています。 これらのログは、コンテナー化された環境内の可視性を高めるために調整された永続的なネットワーク フロー監視を提供します。 コンテナー ネットワーク ログをキャプチャすることで、ネットワーク トラフィックを効果的に追跡し、異常を検出し、パフォーマンスを最適化し、確立されたポリシーに確実に準拠できます。 提供されている詳細な手順に従って、システムのコンテナー ネットワーク ログを設定して統合します。 コンテナー ネットワーク ログ機能の詳細については、「コンテナー ネットワーク ログの概要」を参照してください。

[前提条件]

  • アクティブなサブスクリプションを持つ Azure アカウント。 アカウントをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の概要」を参照してください。

  • CLI 参照コマンドをローカルで実行する場合は、Azure CLI を インストール します。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、「 Azure CLI を使用した Azure への認証」を参照してください。

    • メッセージが表示されたら、最初に使用するときに Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、「Azure CLI で拡張機能を使用および管理する」を参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

  • この記事の手順に必要な Azure CLI の最小バージョンは 2.73.0 です。 バージョンを見つけるには、 az --version を実行します。 インストールまたはアップグレードが必要な場合は、Azure CLI のインストールを参照してください。

  • 格納されたログ モードのコンテナー ネットワーク ログは、Cilium データ プレーンに対してのみ機能します。

  • オンデマンド モードの Container Network ログは、Cilium データ プレーンと非 Cilium データ プレーンの両方で機能します。

  • 既存のクラスターが <= 1.32 の場合は、クラスターを使用可能な最新の Kubernetes バージョンにアップグレードします。

aks-preview Azure CLI 拡張機能をインストールする

az extension add または az extension update コマンドを使用して、Azure CLI プレビュー拡張機能をインストールまたは更新します。

aks-preview Azure CLI 拡張機能の最小バージョンは 18.0.0b2

# 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

コンテナー ネットワーク ログに対する格納ログ モードの構成

"AdvancedNetworkingFlowLogsPreview" 機能フラグを登録する

AdvancedNetworkingFlowLogsPreview コマンドを使用して、az feature register 機能フラグを登録します。

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

az feature show コマンドを使用して、登録が成功したことを確認します。 登録が完了するまでに数分かかります。

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

機能にRegisteredが表示されたら、Microsoft.ContainerService コマンドを使用して、az provider register リソース プロバイダーの登録を更新します。

新しいクラスターで高度なコンテナー ネットワーク サービスを有効にする

az aks create コマンドにアドバンスト コンテナー ネットワークサービスのフラグ --enable-acns を指定すると、アドバンスト コンテナー ネットワークサービスのすべての機能を備えた新しい AKS クラスターが作成されます。 これらの機能には以下が含まれます。

  • コンテナー ネットワークの監視: トラフィックに関する分析情報を提供します。 詳細については、コンテナー ネットワークの監視に関するページを参照してください。

  • Container Network Security: 完全修飾ドメイン フィルタリング (FQDN) などのセキュリティ機能を提供します。 詳細については、コンテナー ネットワークのセキュリティに関するページを参照してください。

# 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>"
export RESOURCE_GROUP="<aks-resource-group>"

# Create an AKS cluster
az aks create \
    --name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP \
    --generate-ssh-keys \
    --location uksouth \
    --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.32 \
    --enable-acns

ログ フィルター処理用のカスタム リソースの構成

格納されたログ モードでコンテナー ネットワーク ログを構成するには、ログ収集のフィルターを設定する特定のカスタム リソースを定義する必要があります。 少なくとも 1 つのカスタム リソースが定義されると、ログが収集され、ホスト ノードの "/var/log/acns/hubble/events.log" に格納されます。 ログ記録を構成するには、名前空間、ポッド、サービス、ポート、プロトコル、または判定などのフィルターを指定して、"RetinaNetworkFlowLog" 型のカスタム リソースを定義して適用する必要があります。 クラスター内に複数のカスタム リソースを同時に存在させることができます。 空でないフィルターでカスタム リソースが定義されていない場合、指定された場所にログは保存されません。 カスタム リソースのこのサンプル定義では、Retina ネットワーク フロー ログを構成する方法を示します。

RetinaNetworkFlowLog テンプレート

apiVersion: acn.azure.com/v1alpha1
kind: RetinaNetworkFlowLog
metadata:
  name: sample-retinanetworkflowlog # Cluster scoped
spec:
  includefilters: # List of filters
    - name: sample-filter # Filter name
      from:
        namespacedPod: # List of source namespace/pods. Prepend namespace with /
          - sample-namespace/sample-pod
        labelSelector: # Standard k8s label selector
          matchLabels:
            app: frontend
            k8s.io/namespace: sample-namespace
          matchExpressions:
            - key: environment
              operator: In
              values:
                - production
                - staging
        ip: # List of source IPs; can be CIDR
          - "192.168.1.10"
          - "10.0.0.1"
      to:
        namespacedPod:
          - sample-namespace2/sample-pod2
        labelSelector:
          matchLabels:
            app: backend
            k8s.io/namespace: sample-namespace2
          matchExpressions:
            - key: tier
              operator: NotIn
              values:
                - dev
        ip:
          - "192.168.1.20"
          - "10.0.1.1"
      protocol: # List of protocols; can be tcp, udp, dns
        - tcp
        - udp
        - dns
      verdict: # List of verdicts; can be forwarded, dropped
        - forwarded
        - dropped

このカスタム リソース定義のフィールドの説明を次に示します。

フィールド タイプ 説明 必須
includefilters []フィルター 含めるネットワーク フローを定義するフィルターの一覧。 各フィルターは、ソース、宛先、プロトコル、およびその他の一致条件を指定します。 include フィルターは空にすることはできないため、少なくとも 1 つのフィルターを含める必要があります。 必須
filters.name フィルターの名前。 オプション
filters.protocol []string このフィルターに一致するプロトコル。 有効な値は、tcpudp、および dnsです。 これは省略可能なパラメーターであるため、指定されていない場合は、すべてのプロトコルを含むログが含まれます。 オプション
filters.verdict []string 一致するフローの判定。 有効値は forwarded または dropped です。 これは省略可能なパラメーターであるため、指定されていない場合は、すべての判定を含むログが含まれます。 オプション
filters.from エンドポイント ネットワーク フローのソースを指定します。 IP アドレス、ラベル セレクター、または名前空間とポッドのペアを含めることができます。 オプション
Endpoint.ip []string 単一の IP または CIDR を指定できます。 オプション
Endpoint.labelSelector オブジェクト ラベル セレクターは、ラベルに基づいてリソースをフィルター処理してクエリを実行するメカニズムであり、ユーザーはリソースの特定のサブセットを識別できます。ラベル セレクターには、matchLabels と matchExpressions という 2 つのコンポーネントを含めることができます。 キーと値のペア (例: {"app": "frontend"}) を指定して簡単に一致するには、matchLabels を使用します。 より高度な条件の場合は、matchExpressions を使用します。ここで、ラベル キー、演算子 (In、NotIn、Exists、DoesNotExist など)、およびオプションの値のリストを定義します。 論理的に ANDed であるため、matchLabels と matchExpressions の両方の条件が満たされていることを確認します。 条件が指定されていない場合、セレクターはすべてのリソースと一致します。 一致しない場合は、セレクターを null のままにします。 適切なリソース セットをターゲットにするようにラベル セレクターを慎重に定義します。 オプション
Endpoint.namespacedPod []string ソースを照合するための名前空間とポッドのペア ( namespace/podとして書式設定) の一覧。 name は正規表現パターン ^.+$ と一致する必要があります オプション
filters.to エンドポイント ネットワーク フローの宛先を指定します。 IP アドレス、ラベル セレクター、または名前空間とポッドのペアを含めることができます。 オプション
Endpoint.ip []string 単一の IP または CIDR を指定できます。 オプション
Endpoint.labelSelector オブジェクト ラベルに基づいてリソースを照合するラベル セレクター。 オプション
Endpoint.namespacedPod []string 宛先と一致するための名前空間とポッドのペア ( namespace/pod形式) の一覧。 オプション
  • 次のコマンドを使用して、RetinaNetworkFlowLog CR を適用してクラスターでのログ収集を有効にします。
kubectl apply -f <crd.yaml>

ホスト ノード自体は永続的なストレージ ソリューションではないので、ホスト ノードにローカルに格納されたログは一時的なものです。 さらに、ホスト ノードのログは、サイズが 50 MB に達するとローテーションされます。 長期的なストレージと分析を行う場合は、ログを収集して Log Analytics ワークスペースに保持するようにクラスター上の Azure Monitor エージェントを構成することをお勧めします。 または、OpenTelemetry コレクターをサードパーティのログ サービスに統合して、追加のログ管理オプションを使用することもできます。

新しいクラスター (マネージド ストレージ) の Azure Log Analytics ワークスペースのログをスクレイピングするように Azure Monitor エージェントを構成する

# 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>"
  export RESOURCE_GROUP="<aks-resource-group>"

# Enable azure monitor with high log scale mode
    ### Use default Log Analytics workspace
    az aks enable-addons -a monitoring --enable-high-log-scale-mode -g $RESOURCE_GROUP -n $CLUSTER_NAME 
    ### Use existing Log Analytics workspace
    az aks enable-addons -a monitoring --enable-high-log-scale-mode -g $RESOURCE_GROUP -n $CLUSTER_NAME --workspace-resource-id <workspace-resource-id>

# Update the aks cluster with enable retina flow log flag. 
  az aks update --enable-acns \
    --enable-retina-flow-logs \
    -g $RESOURCE_GROUP \
    -n $CLUSTER_NAME

有効にすると、カスタム リソースの RetinaNetworkFlowLog が適用されると、コンテナー ネットワーク フロー ログが "/var/log/acns/hubble/events.log" に書き込まれます。 Log Analytics 統合が後で有効になっている場合、Azure Monitor エージェント (AMA) はその時点からログの収集を開始します。 2 分より前のログは取り込まれません。ログ分析ワークスペースでは、監視の開始後に追加された新しいエントリのみが収集されます。

Azure Log Analytics ワークスペースにログを格納するための既存のクラスターの構成

既存のクラスターでコンテナー ネットワーク ログを有効にするには、次の手順に従います。

  1. 次のコマンドを使用して、そのクラスターでアドオンの監視が既に有効になっているかどうかを確認します。

     az aks addon list -g $RESOURCE_GROUP -n $CLUSTER_NAME
    
  2. 監視アドオンが既に有効になっている場合は、次のコマンドを使用してアドオンの監視を無効にします。

     az aks disable-addons -a monitoring -g $RESOURCE_GROUP -n $CLUSTER_NAME
    

    無効にする理由は、監視が既に有効になっている可能性がありますが、高スケールではありません。 詳細については、「 ハイ スケール モード」を参照してください。

  3. 高ログ スケール モードで Azure Monitor を有効にします。

     ### Use default Log Analytics workspace
     az aks enable-addons -a monitoring --enable-high-log-scale-mode -g $RESOURCE_GROUP -n $CLUSTER_NAME 
     ### Use existing Log Analytics workspace
     az aks enable-addons -a monitoring --enable-high-log-scale-mode -g $RESOURCE_GROUP -n $CLUSTER_NAME --workspace-resource-id <workspace-resource-id>
    
  4. 網膜フロー ログ フラグを有効にして aks クラスターを更新する

     az aks update --enable-acns \
         --enable-retina-flow-logs \
         -g $RESOURCE_GROUP \
         -n $CLUSTER_NAME
    

クラスターの資格情報を取得する

az aks get-credentials コマンドを使用してクラスターの資格情報を取得します。

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

セットアップを検証する

次のコマンドを使用して、Retina ネットワーク フロー ログ機能が有効になっているかどうかを検証します。

   az aks show -g $RESOURCE_GROUP -n $CLUSTER_NAME

上記のコマンドからの出力は次のとおりです。

"netowrkProfile":{
	"advancedNwtworking": {
	 "enabled": true,
	 "observability":{
	   "enabled": true
	    }
	}
}
----------------------------
"osmagent":{
	"config":{
		"enableRetinaNetworkFlags": "True"
	}
}

RetinaNetworkFlowLog 型の CRD が適用されているかどうかを検証する

   kubectl describe retinanetworkflowlogs <cr-name>

Spec ノードに [フィルターを含める] ノードと [状態] ノードが含まれていることを確認してください。 状態。 状態は 'FAILED' ではなく 'CONFIGURED' にする必要があります

Spec:
  Includefilters:
    From:
      Namespaced Pod:
        namespace/pod-
    Name:  sample-filter
    Protocol:
      tcp
    To:
      Namespaced Pod:
        namespace/pod-
    Verdict:
      dropped
Status:
  State:      CONFIGURED
  Timestamp:  2025-05-01T11:24:48Z

Azure Managed Grafana

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 

grafana インスタンスのデータ ソースを確認する - ユーザーは grafana ダッシュボードのデータ ソースのサブスクリプションを確認できます。次に示すように、grafana インスタンスのデータ ソース タブを確認します。 grafana インスタンスのデータ ソースをチェックするスクリーンショット。

既定では、Azure Managed Grafana (AMG) のマネージド ID には、作成されたサブスクリプションへの読み取りアクセス権があります。 つまり、AMG と Log Analytics ワークスペースの両方が同じサブスクリプション内にある場合、追加の構成は必要ありません。 ただし、サブスクリプションが異なる場合、ユーザーは Log Analytics ワークスペースの Grafana マネージド ID に "監視閲覧者" ロールを手動で割り当てる必要があります。 詳細については、次のリンクを参照してください (アクセス許可を変更する方法)

Grafana ダッシュボードでの視覚化

ユーザーは、2 つの事前構築済みの Grafana ダッシュボードを使用して、分析のために Container Network Flow ログを視覚化できます。 お客様には、これらのダッシュボードにアクセスするためのいくつかのオプションがあります

Azure Managed Grafana を使用した視覚化

  1. kubectl get pods コマンドを使用して、Azure ログ ポッドが実行されていることを確認します。

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

    出力は次の出力例のようになります。

    ama-logs-9bxc6                                   3/3     Running   1 (39m ago)   44m
    ama-logs-fd568                                   3/3     Running   1 (40m ago)   44m
    ama-logs-rs-65bdd98f75-hqnd2                     2/2     Running   1 (43m ago)   22h
    
    
  2. ログの分析を簡略化するために、構成済みの 2 つの Azure Managed Grafana ダッシュボードが用意されています。 次のように見つけることができます。

    • Azure /Insights/コンテナー/ネットワーク/フロー ログ - このダッシュボードでは、ネットワーク要求、応答、ドロップ、エラーなど、Kubernetes ワークロードが相互に通信している視覚化が提供されます。 現在、ユーザーは ID を持つダッシュボードをインポートする必要があります。 (ID: 23155) grafana インスタンス内の Flow ログ用Grafanaダッシュボードのスクリーンショット。

    • Azure / Insights / Containers / Networking / Flow Logs (外部トラフィック) - このダッシュボードは、Kubernetes ワークロードが Kubernetes クラスターの外部から通信を送受信している視覚化を提供します。これには、ネットワーク要求、応答、ドロップ、エラーが含まれます。 (ID: 23156) grafana インスタンスのフロー ログ (外部) Grafana ダッシュボードのスクリーンショット。このダッシュボードの使用方法の詳細については、「コンテナー ネットワーク ログの概要」を参照してください。

Azure portal でのコンテナー ネットワーク ログの視覚化。

ユーザーは、クラスターの Azure Log Analytics ワークスペースで Azure portal のフロー ログを視覚化、クエリ、分析できます。 Azure Log Analytics の Container Network Logs のスクリーンショット。

オンデマンド モードの構成

ネットワーク フローのオンデマンド モードは、Cilium データ プレーンと非 Cilium データ プレーンの両方で動作します。 これ以降の作業では、アドバンスト コンテナー ネットワークサービスが有効になっている AKS クラスターが必要となります。

az aks create コマンドにアドバンスト コンテナー ネットワークサービスのフラグ --enable-acns を指定すると、アドバンスト コンテナー ネットワークサービスのすべての機能を備えた新しい AKS クラスターが作成されます。 これらの機能には以下が含まれます。

  • コンテナー ネットワークの監視: トラフィックに関する分析情報を提供します。 詳細については、コンテナー ネットワークの監視に関するページを参照してください。

  • コンテナー ネットワークのセキュリティ: FQDN フィルタリングなどのセキュリティ機能を提供します。 詳細については、コンテナー ネットワークのセキュリティに関するページを参照してください。

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 クラスターが更新されます。

アドバンスト コンテナー ネットワークサービスのコンテナー ネットワークのセキュリティ機能をサポートしているのは、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

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 フローを視覚化する

  1. 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 
    
  2. kubectl port-forward コマンドを使用して、Hubble リレーをポート フォワードします。

    kubectl port-forward -n kube-system svc/hubble-relay --address 127.0.0.1 4245:443
    
  3. 相互 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
    
  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. hubble observe コマンドを使用して、Hubble リレー ポッドが実行されていることを確認します。

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

Hubble UI を使用して視覚化する

  1. 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:
          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. kubectl port-forward コマンドを使用して、Hubble UI のポート フォワーディングを設定します。

    kubectl -n kube-system port-forward svc/hubble-ui 12000:80
    
  4. Web ブラウザーに http://localhost:12000/ を入力して、Hubble UI にアクセスします。

基本的なトラブルシューティング

  • Advanced Container Networking Services は、AMA ログ収集機能を有効にするための前提条件です。Advanced Container Networking Services を有効にせずに、クラスターでコンテナー ネットワーク フロー ログ機能を有効にしようとしています。

    az aks update -g test-rg -n test-cluster --enable-retina-flow-logs

    次のエラー メッセージが表示されます。

    Flow logs requires '--enable-acns', advanced networking to be enabled, and the monitoring addon to be enabled.

  • クラスター Kubernetes のバージョンが 1.32.0 より前の場合は、'--enable-retina-flow-logs' を有効にしようとしています。

    The specified orchestrator version %s is not valid. Advanced Networking Flow Logs is only supported on Kubernetes version 1.32.0 or later.

    %s がお客様の K8s バージョンに置き換えられる場所

  • 顧客が AFEC フラグが有効になっていないサブスクリプションで "--enable-retina-flow-logs" を有効にしようとした場合:

    Feature Microsoft.ContainerService/AdvancedNetworkingFlowLogsPreview is not enabled. Please see https://aka.ms/aks/previews for how to enable features.

  • お客様が、Advanced Container Networking Services が有効になっていないクラスターに RetinaNetworkFlowLog CR を適用しようとした場合:

    error: resource mapping not found for <....>": no matches for kind "RetinaNetworkFlowLog" in version "acn.azure.com/v1alpha1" ensure CRDs are installed first

コンテナー ネットワーク ログを無効にする: 既存のクラスターに格納されているログ モード

すべての CRD が削除されると、フロー ログの収集は停止します。収集用にフィルターが定義されていないためです。 Azure Monitor エージェントによる網膜フロー ログ収集を無効にするには、次のコマンドを使用します。

 az aks update -n $CLUSTER_NAME -g $RESOURCE_GROUP --disable-retina-flow-logs

リソースをクリーンアップする

このアプリケーションの使用を計画していない場合は、az group delete コマンドを使用して、この記事で作成した他のリソースを削除します。

  az group delete --name $RESOURCE_GROUP

次のステップ

このハウツー記事では、AKS クラスターの Advanced Container Networking Services で Container Network ログを有効にする方法について説明しました。