Service と Ingress の作成

このページでは、GKE On-Prem ユーザー クラスタで Kubernetes Ingress オブジェクトを作成する方法について説明します。1 つの Ingress オブジェクトは 1 つ以上の Service オブジェクトに関連付けられている必要があります。それぞれの Service オブジェクトは、Pod のセットに関連付けられます。

管理ワークステーションへの SSH 接続

管理ワークステーションに SSH で接続します。

ssh -i ~/.ssh/vsphere_workstation ubuntu@[IP_ADDRESS]

ここで、[IP_ADDRESS] は管理ワークステーションの IP アドレスです。

このトピックの残りの手順はすべて管理ワークステーションで行います。

Deployment の作成

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-deployment
spec:
  selector:
    matchLabels:
      greeting: hello
  replicas: 3
  template:
    metadata:
      labels:
        greeting: hello
    spec:
      containers:
      - name: hello-world
        image: "gcr.io/google-samples/hello-app:2.0"
        env:
        - name: "PORT"
          value: "50000"
      - name: hello-kubernetes
        image: "gcr.io/google-samples/node-hello:1.0"
        env:
        - name: "PORT"
          value: "8080"

この演習を進めるにあたって、この Deployment のマニフェストについて次のことを理解しておくことが重要です。

  • Deployment に属する各 Pod には greeting: hello ラベルが付いています。

  • 各 Pod には 2 つのコンテナがあります。

  • env フィールドは、hello-app コンテナは TCP ポート 50000 でリッスンし、node-hello コンテナは TCP ポート 8080 でリッスンするように指定します。hello-app の場合、ソースコードを見ると PORT 環境変数の効果がわかります。

このマニフェストを hello-deployment.yaml という名前のファイルにコピーして Deployment を作成します。

kubectl apply --kubeconfig [USER_CLUSTER_KUBECONFIG] -f hello-deployment.yaml

ここで、[USER_CLUSTER_KUBECONFIG] はユーザー クラスタの kubeconfig ファイルです。

Service による Deployment の公開

クライアントが Deployment の Pod にリクエストを安定して送信するには、Service を作成します。

クラスタの内外のクライアントに Deployment を公開する Service のマニフェストは次のとおりです。

apiVersion: v1
kind: Service
metadata:
  name: hello-service
spec:
  type: NodePort
  selector:
    greeting: hello
  ports:
  - name: world-port
    protocol: TCP
    port: 60000
    targetPort: 50000
  - name: kubernetes-port
    protocol: TCP
    port: 60001
    targetPort: 8080

マニフェストを hello-service.yaml という名前のファイルにコピーして、Service を作成します。

kubectl apply --kubeconfig [USER_CLUSTER_KUBECONFIG] -f hello-service.yaml

Service を表示します。

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get service hello-service --output yaml

出力には、Service に割り当てられた nodePort 値が表示されます。

apiVersion: v1
kind: Service
metadata:
  ...
  name: hello-service
  namespace: default
  ...
spec:
  clusterIP: 10.105.252.237
  externalTrafficPolicy: Cluster
  ports:
  - name: world-port
    nodePort: 31807
    port: 60000
    protocol: TCP
    targetPort: 50000
  - name: kubernetes-port
    nodePort: 30734
    port: 60001
    protocol: TCP
    targetPort: 8080
  selector:
    greeting: hello
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer:
    ingress:
    - {}

上述の出力では、ports フィールドは ServicePort オブジェクトの配列であり、1 つは world-port、もう 1 つは kubernetes-port という名前です。

クライアントが world-port を使用して Service を呼び出すことができる方法は次のとおりです。

  • いずれかのクラスタノードで実行されているクライアントは、port 上の clusterIP にリクエストを送信できます。この例では 10.105.252.237:60000 です。リクエストは、targetPort 上のメンバー Pod に転送されます。この例では [POD_IP_ADDRESS]:50000 です。

  • クライアントは、nodePort 上の任意のクラスタノードの IP アドレスにリクエストを送信できます。この例では [NODE_IP_ADDRESS]:31807 です。リクエストは、targetPort 上のメンバー Pod に転送されます。この例では [POD_IP_ADDRESS]:50000 です。

クライアントが kubernetes-port を使用して Service を呼び出すことができる方法は次のとおりです。

  • いずれかのクラスタノードで実行されているクライアントは、port 上の clusterIP にリクエストを送信できます。この例では 10.105.252.237:60001 です。リクエストは、targetPort 上のメンバー Pod に転送されます。この例では [POD_IP_ADDRESS]:8080 です。

  • クライアントは、nodePort 上の任意のクラスタノードの IP アドレスにリクエストを送信できます。この例では [NODE_IP_ADDRESS]:30734 です。リクエストは、targetPort 上のメンバー Pod に転送されます。この例では [POD_IP_ADDRESS]:8080 です。

Ingress の作成

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

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - http:
      paths:
      - path: /greet-the-world
        backend:
          serviceName: hello-service
          servicePort: 60000
      - path: /greet-kubernetes
        backend:
          serviceName: hello-service
          servicePort: 60001

このマニフェストを my-ingress.yaml という名前のファイルにコピーし、次のようにして Ingress を作成します。

kubectl apply --kubeconfig [USER_CLUSTER_KUBECONFIG] -f my-ingress.yaml

ユーザー クラスタの作成の一環として、ユーザー クラスタの構成ファイルusercluster.vips.ingressvip の値を指定して、Ingress の仮想 IP アドレス(VIP)を指定しました。

クライアントがユーザー クラスタ Ingress VIP にリクエストを送信すると、リクエストは F5 BIG-IP ロードバランサにルーティングされます。次に、ロードバランサは、ユーザー クラスタで実行されている Ingress Service にリクエストを転送します。Ingress Service は、リクエスト URL のパスに応じて、異なるバックエンドにリクエストを転送するように構成されています。

このトピックの手順に関連する 2 つの異なる Service がある点を理解することは重要です。

  • Service の名前は hello-service です。これは、hello-deployment Deployment の Pod を公開するために作成した Service です。

  • ユーザー クラスタの gke-system Namespace で実行する Ingress Service。この Service は、クラスタのインフラストラクチャの一部です。

/greet-the-world パス

Ingress マニフェストで、パス /greet-the-worldserviceName: hello-serviceservicePort: 60000 に関連付けられていることを示すルールを確認できます。hello-service Service の world-port フィールドの port 値が 60000 であることを思い出してください。

- name: world-port
    nodePort: 31807
    port: 60000
    protocol: TCP
    targetPort: 50000

Ingress Service は、クラスタノードを選択し、nodePort 上のノードにリクエストを転送します。この例では [NODE_IP_ADDRESS]:31807 です。ノードの iptables ルールにより、リクエストはポート 50000 のメンバー Pod に転送されます。ポート 50000 でリッスンしているコンテナに Hello World! メッセージが表示されます。

/greet-kubernetes パス

Ingress マニフェストで、パス /greet-kubernetesserviceName: hello-serviceservicePort: 60001 に関連付けられていることを示すルールを確認できます。hello-service Service の kubernetes-port フィールドの port 値が 60001 であることを思い出してください。

- name: kubernetes-port
    nodePort: 30734
    port: 60001
    protocol: TCP
    targetPort: 8080

Ingress Service は、クラスタノードを選択し、nodePort 上のノードにリクエストを転送します。この例では [NODE_IP_ADDRESS]:30734 です。ノードの iptables ルールにより、リクエストはポート 8080 のメンバー Pod に転送されます。ポート 8080 でリッスンするコンテナに Hello Kubernetes! メッセージが表示されます。

Ingress をテストする:

/greet-the-world パスを使用して Ingress をテストします。

curl [USER_CLUSTER_INGRESS_VIP]/greet-the-world

出力には、Hello, world! メッセージが表示されます。

Hello, world!
Version: 2.0.0
Hostname: ...

/greet-kubernetes パスを使用して Ingress をテストします。

curl [USER_CLUSTER_INGRESS_VIP]/greet-kubernetes

出力には、Hello, Kubernetes! メッセージが表示されます。

Hello Kubernetes!

クリーンアップ

Ingress を削除します。

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete ingress my-ingress

Service を削除します。

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete service hello-service

Deployment を削除します。

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] delete deployment hello-deployment

次のステップ

高度なインストール トピックの概要

クラスタの状態をモニタリングするダッシュボードを作成する