ノード間の可視化

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

ポッドが同じノード上の別のポッドにパケットを送信すると、そのパケットはそのノードを離れ、GCP ネットワークによって処理されます。その後、パケットはすぐに同じノードに戻され、宛先ポッドに送信されます。

ノード間の可視化は、GKE 1.11 以降で利用できます。

始める前に

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

  • Google Kubernetes Engine API が有効になっていることを確認します。
  • Google Kubernetes Engine API の有効化
  • Cloud SDK がインストール済みであることを確認します。
  • デフォルトのプロジェクト ID を設定します。
    gcloud config set project [PROJECT_ID]
  • gcloud を最新バージョンに更新します。
    gcloud components update

概要

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

  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. GCP Console の Google Kubernetes Engine VPC ネットワークのページにアクセスします。

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

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

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

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

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

クラスタの作成

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

gcloud

gcloud beta container clusters create my-inv-cluster \
    --zone us-central1-a \
    --num-nodes 1 \
    --enable-intra-node-visibility

Console

  1. GCP Console の Kuberneters クラスタページにアクセスします。

    Kubernetes クラスタページに移動

  2. [クラスタを作成] をクリックします。

  3. [名前] に「my-inv-cluster」と入力します。

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

  5. [ノード数] に 1 を入力します。

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

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

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

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

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

gcloud container clusters get-credentials my-inv-cluster \
    --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. GCP 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 beta container clusters update [CLUSTER_NAME] \
    --enable-intra-node-visibility

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

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

一般提供

ノード間の可視化は現在ベータ版です。この機能の一般提供が開始されると、新しいクラスタのデフォルトになります。

次のステップ

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

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

Kubernetes Engine のドキュメント