このページでは、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-world
が serviceName: hello-service
と servicePort: 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-kubernetes
が serviceName: hello-service
と servicePort: 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