スタンドアロン ネットワーク エンドポイント グループ

このページでは、ネットワーク エンドポイント グループを基盤とする Kubernetes サービスを作成する方法を説明します。

概要

Google Cloud Platform にはさまざまな負荷分散コンポーネントがありますが、これらをさまざまな方法で組み合わせることで、アプリケーションの負荷分散を実現できます。このトピックの手順では、以下のコンポーネントを組み合わせて Kubernetes サービスの負荷を分散します。

次の図は、コンポーネント間の接続を示しています。

ネットワーク エンドポイント グループの負荷分散コンポーネントの図

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

  1. 3 つのポッドを持つ Deployment を作成します。各ポッドには、TCP ポート 50000 でリッスンするコンテナを用意します。

  2. サービスを作成します。サービス マニフェストに、cloud.google.com/neg アノテーションを含めます。これにより、GKE コントローラでネットワーク エンドポイント グループが作成されます。

  3. ヘルスチェックを作成します。

  4. バックエンド サービスを作成します。バックエンド サービスをヘルスチェックとネットワーク エンドポイント グループに接続します。

  5. TCP プロキシを作成します。TCP プロキシをバックエンド サービスに接続します。

  6. 転送ルールを作成します。転送ルールを TCP プロキシに接続します。

  7. 転送ルールをテストします。

始める前に

Google Kubernetes Engine バージョン 1.10 以降を実行するクラスタが必要です。

クラスタが VPC ネイティブである必要があります。詳細については、エイリアス IP を使用した VPC ネイティブ クラスタの作成をご覧ください。

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

  • Google Kubernetes Engine API が有効になっていることを確認します。
  • Google Kubernetes Engine API の有効化
  • Cloud SDK がインストール済みであることを確認します。
  • デフォルトのプロジェクト ID を設定します。
    gcloud config set project [PROJECT_ID]
  • ゾーンクラスタを使用する場合は、デフォルトのコンピューティング ゾーンを設定します。
    gcloud config set compute/zone [COMPUTE_ZONE]
  • リージョン クラスタを使用する場合は、デフォルトのコンピューティング リージョンを設定します。
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud を最新バージョンに更新します。
    gcloud components update

ネットワーク エンドポイント グループの作成

Deployment のマニフェストを次に示します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      purpose: demo
      topic: standalone-neg
  replicas: 3
  template:
    metadata:
      labels:
        purpose: demo
        topic: standalone-neg
    spec:
      containers:
      - name: hello
        image: debian
        command: ["/bin/bash"]
        args:
        - "-c"
        - "apt-get update && apt-get install -y netcat && while true; do echo Hello TCP | nc -l -p 50000; done"

Deployment には 3 つのポッドがあり、各ポッドにはコンテナが 1 つずつあります。

Deployment のマニフェストの cmd フィールドと args フィールドでは、netcat(nc)を指定することにより、ポート 50000 で接続をリッスンする単純な TCP サーバーを実装しています。

このマニフェストを my-deployment.yaml という名前のファイルに保存して、Deployment を作成します。

kubectl apply -f my-deployment.yaml

Service のマニフェストを次に示します。

apiVersion: v1
kind: Service
metadata:
  name: my-service
  annotations:
    cloud.google.com/neg: '{"exposed_ports": {"80":{}}}'
spec:
  type: ClusterIP
  selector:
    purpose: demo
    topic: standalone-neg
  ports:
  - name: my-service-port
    protocol: TCP
    port: 80
    targetPort: 50000

この演習を進めるにあたって、この Service について次のことを理解しておくことが重要です。

  • purpose: demotopic: standalone-neg のラベルが付いたポッドは、Service のメンバーです。

  • Service には my-service-port という 1 つの servicePort 構造があります。cloud.googe.com/neg アノテーションは、my-service-port とネットワーク エンドポイント グループとの関連付けを示しています。

  • 各メンバーポッドには、TCP ポート 50000 でリッスンするコンテナが必要です。

このマニフェストを my-service.yaml という名前のファイルに保存して、Service を作成します。

kubectl apply -f my-service.yaml

Service を作成すると、GKE コントローラがネットワーク エンドポイント グループを作成します。

ネットワーク エンドポイント グループが作成されるまで待ちます。その後、gcloud または Google Cloud Platform Console を使用してネットワーク エンドポイント グループを確認できます。

gcloud

ネットワーク エンドポイント グループの一覧を表示します。

gcloud beta compute network-endpoint-groups list

出力には、ネットワーク エンドポイント グループに 3 つのエンドポイントがあることが示されます。

NAME                                          LOCATION       ENDPOINT_TYPE   SIZE
k8s1-70aa83a6-default-my-service-80-c9710a6f  us-central1-a  GCE_VM_IP_PORT  3

エンドポイントを確認します。

gcloud beta compute network-endpoint-groups list-network-endpoints \
    [NETWORK_ENDPOINT_GROUP_NAME]

[NETWORK_ENDPOINT_GROUP_NAME] は、ネットワーク エンドポイント グループの名前です。

出力には、3 つのエンドポイントが表示されます。エンドポイントは、ポッド IP アドレスとポートのペアです。

INSTANCE                                           IP_ADDRESS  PORT
gke-standard-cluster-3-default-pool-4cc71a15-qlpf  10.12.1.43  50000
gke-standard-cluster-3-default-pool-4cc71a15-qlpf  10.12.1.44  50000
gke-standard-cluster-3-default-pool-4cc71a15-w9nk  10.12.2.26  50000
````

Console

  1. GCP Console で Google Kubernetes Engine の [TODO] メニューに移動します。

    [ワークロード] メニューに移動

  2. [デプロイ] をクリックします。

  3. [コンテナ イメージ] にコンテナ イメージとそのバージョン(nginx:latest など)を入力するか、[既存の Google Container Registry イメージを選択する] をクリックしてイメージを選択します。

  4. 環境変数、初期コマンド、アプリケーション名、名前空間、ラベルを追加するなど、必要に応じてコンテナを構成します。

  5. [クラスタ] プルダウン メニューから、目的のクラスタを選択します。

  6. [デプロイ] をクリックします。

ファイアウォール ルールを作成する

この演習の後半では、ヘルスチェックと TCP プロキシを作成します。

TCP プロキシとヘルスチェックからの TCP トラフィックを許可するファイアウォール ルールを作成します。

gcloud compute firewall-rules create my-fwr --network default \
    --source-ranges 130.211.0.0/22,35.191.0.0/16 --allow tcp

ヘルスチェックとバックエンド サービスを作成する

ヘルスチェックを作成します。

gcloud beta compute health-checks create tcp my-hc --use-serving-port

バックエンド サービスを作成します。

gcloud compute backend-services create my-bes --global \
    --protocol tcp --health-checks my-hc

ネットワーク エンドポイント グループをバックエンド サービスに追加します。

gcloud beta compute backend-services add-backend my-bes --global \
   --network-endpoint-group [NETWORK_ENDPOINT_GROUP_NAME] \
   --network-endpoint-group-zone [NETWORK_ENDPOINT_GROUP_ZONE] \
   --balancing-mode CONNECTION --max-connections-per-endpoint 5

ここで

  • [NETWORK_ENDPOINT_GROUP_NAME] は、ネットワーク エンドポイント グループの名前です。
  • [NETWORK_ENDPOINT_GROUP_ZONE] は、ネットワーク エンドポイント グループのゾーンです。

バックエンド サービスの説明を設定します。

gcloud compute backend-services describe my-bes --global

出力に、バックエンド サービスがヘルスチェックとネットワーク エンドポイント グループに関連付けられていることが示されます。

...
backends:
- balancingMode: CONNECTION
  capacityScaler: 1.0
  group: ... /networkEndpointGroups/k8s1-70aa83a6-default-my-service-80-c9710a6f
...
healthChecks:
- ... /healthChecks/my-hc
...
name: my-bes
...

バックエンド サービスが構成されるまで 5 分待ちます。

バックエンド サービスのヘルスチェックを行います。

gcloud beta compute backend-services get-health my-bes --global

各エンドポイントの状態が出力に表示されます。

...
status:
  healthStatus:
  - healthState: HEALTHY
    instance: ... gke-standard-cluster-3-default-pool-4cc71a15-qlpf
    ipAddress: 10.12.1.43
    port: 50000
  - healthState: HEALTHY
    instance: ... gke-standard-cluster-3-default-pool-4cc71a15-qlpf
    ipAddress: 10.12.1.44
    port: 50000
  - healthState: HEALTHY
    instance: ... gke-standard-cluster-3-default-pool-4cc71a15-w9nk
    ipAddress: 10.12.2.26
    port: 50000

TCP プロキシと転送ルールを作成する

TCP プロキシを作成します。

gcloud compute target-tcp-proxies create my-tp --backend-service my-bes

転送ルールを作成します。

gcloud compute forwarding-rules create my-for --global \
    --ip-protocol tcp --ports 25 --target-tcp-proxy my-tp

転送ルールを表示します。

gcloud compute forwarding-rules describe my-for --global

出力には、転送ルールの外部 IP アドレスが表示されます。

IPAddress: 203.0.113.1
IPProtocol: TCP
...
kind: compute#forwardingRule
loadBalancingScheme: EXTERNAL
name: my-for
...
portRange: 25 - 25

転送ルールが構成されるまで 10 分待ちます。

netcat を使用して転送ルールをテストします。

nc -v [EXTERNAL_IP_ADDRESS] 25

[EXTERNAL_IP_ADDRESS] は転送ルールの外部 IP アドレスです。

コンテナからの応答が出力に表示されます。

Connection to 203.0.113.1 25 port [tcp/smtp] succeeded!
Hello TCP

クリーンアップ

このページのタスクを完了したら、アカウントで不要な請求が発生しないように、以下のコマンドでリソースを削除します。

gcloud compute forwarding-rules delete my-for --global --quiet
gcloud compute target-tcp-proxies delete my-tp --quiet
gcloud compute backend-services delete my-bes --quiet --global
gcloud compute firewall-rules delete my-fwr --quiet
gcloud compute health-checks delete my-hc --quiet
kubectl delete service my-service
kubectl delete deployment my-deployment

次のステップ

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

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

Kubernetes Engine のドキュメント