ノード内の可視化

このページでは、Google Kubernetes Engine クラスタでノード内の可視化を設定して、クラスタ内のネットワーク トラフィックのすべてを Google Cloud ネットワークから見えるようにする方法について説明します。これは、同じノード上のポッド間のトラフィックを含め、ポッド間のすべてのトラフィックのフローログが確認できることを意味します。また、ノード内の可視化によって、ポッド間の(同じノード上のポッドも含めて)すべてのトラフィックに適用されるファイアウォール ルールを作成することも可能になります。

ポッドから同じノードの別のポッドにパケットを送信すると、パケットはノードを離れて Google Cloud ネットワークで処理されます。その後、パケットはすぐに同じノードに戻され、宛先ポッドに転送されます。

現在、ノード内の可視化はデフォルトで無効になっています。

ノード内の可視化は、GKE v1.11.x 以降で利用できます。

注意点

ログ容量の増加

ノード内の可視化が有効になると、VPC によって多くのトラフィックがキャプチャされ、フローログ容量が増加することがあります。ロギング設定を調整することで、フローロギングに付随する費用を管理できます。

ポッド間のトラフィックはすべてファイアウォールの対象

ノード内の可視性を有効にすると、名前ノードにデプロイされたポッドを含めて、ポッド間のすべてのトラフィックが VPC から見えるようになります。ノード内の可視性を有効にすることで、以前は制限されていなかったトラフィックがファイアウォールの対象となる可能性があります。正規のトラフィックが妨げられないようにするため、ノードレベルのファイアウォールを評価してください。

始める前に

このタスクの準備として、次の手順を行います。

概要

このトピックで行う手順の概要は次のとおりです。

  1. us-central1 リージョンのデフォルト サブネットのフローログを有効にします。

  2. ノードが 1 つあるクラスタを us-central1-a ゾーンに作成します。

  3. クラスタにポッドを 2 つ作成します。

  4. 一方のポッドからもう一方のポッドに HTTP リクエストを送信します。

  5. ポッドからポッドへのリクエストのフローログ エントリを表示します。

サブネットのフローログを有効にする

gcloud

us-central1 リージョンのデフォルト サブネットのフローログを有効にします。

gcloud compute networks subnets update default --region us-central1 --enable-flow-logs

サブネットでフローログが有効になっていることを確認します。

gcloud compute networks subnets describe default --region us-central1

フローログが有効になったことは、次の出力からわかります。

...
enableFlowLogs: true
...
ipCidrRange: 10.128.0.0/20
region: https://www.googleapis.com/compute/v1/projects/abc-712099/regions/us-central1

Console

us-central1 リージョンのデフォルト サブネットのフローログを有効にする手順は、次のとおりです。

  1. Cloud Console の Google Kubernetes Engine VPC ネットワークのページにアクセスします。

    [VPC ネットワーク] ページに移動

  2. us-central1 の行で、[デフォルト] をクリックします。

  3. [編集] をクリックします。

  4. [フローログ] で [オン] を選択します。

  5. [保存] をクリックします。

クラスタの作成

ノードが 1 つあるクラスタを作成します。

gcloud

gcloud container clusters create [CLUSTER_NAME] \
    --zone us-central1-a \
    --num-nodes 1 \
    --enable-intra-node-visibility

Console

  1. Cloud Console で [Kubernetes クラスタの作成] ページに移動します。

    Kubernetes クラスタページに移動

  2. [名前] に「CLUSTER_NAME」と入力します。

  3. [ゾーン] で [us-central1-a] を選択します。

  4. [ノード数] に「1」と入力します。

  5. ページの下部にある [詳細オプション] をクリックします。

  6. [ノード内の可視化を有効にする] を選択します。

  7. [作成] をクリックします。

クラスタの認証情報の取得

新しいクラスタの認証情報を取得するには、次のコマンドを入力します。

gcloud container clusters get-credentials [CLUSTER_NAME] \
    --zone us-central1-a

認証情報は kubeconfig ファイル(通常は $HOME/.kube/config にある)に保存されます。

2 つのポッドの作成

ポッドのマニフェストは次のとおりです。

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
spec:
  containers:
  - name: container-1
    image: gcr.io/google-samples/hello-app:2.0

マニフェストを pod-1.yaml という名前のファイルに保存し、ポッドを作成します。

kubectl apply -f pod-1.yaml

2 つ目のポッドのマニフェストは次のとおりです。

apiVersion: v1
kind: Pod
metadata:
  name: pod-2
spec:
  containers:
  - name: container-2
    image: gcr.io/google-samples/node-hello:1.0

マニフェストを pod-2.yaml という名前のファイルに保存し、ポッドを作成します。

kubectl apply -f pod-2.yaml

ポッドを確認します。

kubectl get pod pod-1 pod-2 --output wide

出力には、ポッドの IP アドレスが表示されます。このアドレスを書き留めます。

NAME      READY     STATUS    RESTARTS   AGE       IP           ...
pod-1     1/1       Running   0          1d        10.52.0.13   ...
pod-2     1/1       Running   0          1d        10.52.0.14   ...

pod-1 から pod-2 へのリクエストの送信

pod-1 のコンテナへのシェルを取得します。

kubectl exec -it pod-1 sh

シェルで、pod-2 にリクエストを送信します。

wget -qO- [POD_2_IP_ADDRESS]:8080

ここで、[POD_2_IP_ADDRESS] はこの演習の前半で説明した pod-2 の IP アドレスです。

出力には pod-2 内で実行中のコンテナからのレスポンスが表示されます。

Hello Kubernetes!

exit を入力してシェルを終了し、メインのコマンドライン環境に戻ります。

フローログ エントリの表示

gcloud

通常のコマンドライン ウィンドウで次のコマンドを入力して、pod-1 から pod-2 へのリクエストのフローログ エントリを表示します。

gcloud logging read \
    'logName="projects/[PROJECT_ID]/logs/compute.googleapis.com%2Fvpc_flows" AND jsonPayload.connection.src_ip="[POD_1_IP_ADDRESS]"'

ここで

  • [PROJECT_ID] は、プロジェクト ID です。
  • [POD_1_IP_ADDRESS] は、pod-1 の IP アドレスです。

出力は、pod-1 から pod-2 へのリクエストのフローログ エントリを示しています。この例では、pod-1 の IP アドレスは 10.56.0.13pod-2 の IP アドレスは 10.56.0.14 です。

...
jsonPayload:
  bytes_sent: '0'
  connection:
    dest_ip: 10.56.0.14
    dest_port: 8080
    protocol: 6
    src_ip: 10.56.0.13
    src_port: 35414
...

Console

  1. Cloud Console の Google Kubernetes Engine Stackdriver ログページにアクセスします。

    Stackdriver ログページに移動

  2. ページ上部のフィルタ ボックスの右側にある下矢印をクリックし、[高度なフィルタに変換] を選択します。

  3. フィルタ ボックス内のテキストをすべて削除し、次のクエリを入力します。

    resource.type="gce_subnetwork"
    logName="projects/[PROJECT_ID]/logs/compute.googleapis.com%2Fvpc_flows"
    jsonPayload.connection.src_ip="[POD_1_IP_ADDRESS]"
    

    ここで

    • [PROJECT_ID] は、プロジェクト ID です。
    • [POD_1_IP_ADDRESS] は、pod-1 の IP アドレスです。

    表示されたログエントリを展開します。jsonPayload で、リクエストが pod-1 から pod-2 に送信されたことが確認できます。この例では、pod-1 の IP アドレスは 10.56.0.13、pod-2 の IP アドレスは 10.56.0.14 です。

    jsonPayload: {
      bytes_sent:  "0"
      connection: {
        dest_ip:  "10.56.0.14"
        dest_port:  8080
        protocol:  6
        src_ip:  "10.56.0.13"
        src_port:  35414
    

クラスタにはノードが 1 つしかないことを思い出してください。つまり、pod-1pod-2 は同じノード上にありますが、そのような場合でも pod-1pod-2 間のノード内通信のフローログ エントリが作成されます。

既存のクラスタにおけるノード内の可視化の有効化

gcloud

既存のクラスタに対してノード内の可視化を有効にするには、次のコマンドを入力します。

gcloud beta container clusters update [CLUSTER_NAME] \
    --enable-intra-node-visibility

ここで、[CLUSTER_NAME] は既存のクラスタの名前です。

Console

  1. Cloud Console で Google Kubernetes Engine のメニューに移動します。

    Google Kubernetes Engine のメニューに移動

  2. 鉛筆の形をしたクラスタの [編集] ボタン をクリックします。

  3. [ノード内の可視化] を有効にします。

  4. [保存] をクリックします。

既存のクラスタに対してノード内の可視化を有効にすると、コントロール プレーンとワーカーノードの両方のコンポーネントが再起動されます。

この機能を有効にしてからノードのルーティング ルールを調べることで、有効になっていることを確認できます。

ip rule show

次のような出力が表示されます。

0:  from all lookup local
30001:  from all fwmark 0x4000/0x4000 lookup main
30002:  from all iif lo lookup main
30003:  not from all iif eth0 lookup 1
32766:  from all lookup main
32767:  from all lookup default

および

ip route show table 1

次のような出力が表示されます。

default via [GKE_NODE_SUBNET_GW] dev eth0

ノード内の可視化の無効化

gcloud

既存のクラスタに対してノード内の可視化を無効にするには、次のコマンドを入力します。

gcloud beta container clusters update [CLUSTER_NAME] \
  --no-enable-intra-node-visibility

ここで、[CLUSTER_NAME] は既存のクラスタの名前です。

Console

  1. Cloud Console の [Kubernetes クラスタ] ページにアクセスします。

    Kubernetes クラスタページに移動

  2. 鉛筆の形をしたクラスタの [編集] ボタン をクリックします。

  3. [ノード内の可視化] プルダウン メニューから、[無効] を選択します。

  4. [保存] をクリックします。

既存のクラスタに対してノード内の可視化を無効にすると、コントロール プレーンとワーカーノードの両方のコンポーネントが再起動されます。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Kubernetes Engine のドキュメント