このドキュメントでは、VMware 用 Google Distributed Cloud(ソフトウェアのみ)で作成されたユーザー クラスタにアプリケーションをデプロイする方法の例を示します。
始める前に
ここに示す例では、バンドルされた MetalLB ロード バランシングを使用するユーザー クラスタが必要です。MetalLB を使用する最小のユーザー クラスタを作成する手順については、基本クラスタを作成するをご覧ください。
管理者ワークステーションの Google Cloud コンソールまたはコマンドライン ツール kubectl
を使用して、アプリケーションをデプロイできます。
コンソールで、Google Kubernetes Engine クラスタの概要ページに移動します。
クラスタのリストでユーザー クラスタをクリックし、クラスタにログインしていることを確認します。
まだユーザー クラスタにログインしていない場合は、Google Cloud コンソールからクラスタを管理するの手順に沿ってログインします。
コンテナ
[コンテナ] で [既存のコンテナ イメージ] を選択します。
[イメージパス] に「
us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0
」と入力します。[続行] をクリックします。
構成
[デプロイ名] に「
my-deployment
」と入力します。[Namespace] に「
default
」と入力します。次の 2 つのラベルを入力します。
- キー 1:
app
, 値 1:metrics
- キー 2:
department
, 値 2sales
- キー 1:
[Kubernetes クラスタ] プルダウンでクラスタを選択します。
[続行] をクリックします。
公開
[Deployment を新しいサービスとして公開する] をチェックします。
[ポート 1] に「
80
」と入力します。[ターゲット ポート 1] に「
8080
」と入力します。hello-app
コンテナは、デフォルトで TCP ポート 8080 をリッスンするため、これは適切な値です。これは、アプリの Dockerfile とソースコードで確認できます。[プロトコル 1] で [
TCP
] を選択します。[サービスタイプ] で
LoadBalancer
を選択します。
ページの下部にある [デプロイ] ボタンをクリックします。
デプロイとサービスの詳細を表示する
Deployment の準備が完了すると、Google Cloud コンソールの Kubernetes ワークロード セクションに [デプロイの詳細] ページが開きます。このページでは、Deployment とその 3 つの Pod の詳細を確認できます。
[サービスの公開] で、Deployment を公開する Service の名前をクリックします。この演習では、名前は
my-deployment-service
です。[サービスの詳細] ページが開きます。このページには、Service の詳細が表示されます。たとえば、
app: metrics
とdepartment: sales
のラベルを持つ Pod は Service のメンバーです。my-deployment
の Pod にはこれらのラベルが付いていることに注意してください。
[ロードバランサ IP] の値も表示されます。ロードバランサ IP がクラスタ ロードバランサに自動的に構成されています。
Service への転送
クラスタの外にあるクライアントが、TCP ポート 80 でロードバランサの IP にリクエストを送信したとします。リクエストはクラスタ ロードバランサに転送されます。ロードバランサは、TCP ポート 8080 でメンバーの Pod にリクエストを転送します。my-deployment
のすべての Pod には、TCP ポート 8080 をリッスンするコンテナがあることを思い出してください。
サービスをテストする
ロードバランサの IP がルーティング可能となるマシンに移動します。
Service を呼び出すには、ロードバランサの IP をブラウザに入力するか、curl
などのコマンドを使用します。例:
curl[LOAD_BALANCER_IP] :80
出力には、Hello, world!
メッセージが表示されます。例:
curl 203.0.113.1:80 Hello, world! Version: 2.0.0 Hostname: my-deployment-dbd86c8c4-9wpbv
Deployment を削除する
コンソールの [Kubernetes Engine] セクションで、[ワークロード] ページに移動します。
Deployment のリストで、my-deployment
を選択します。
ページ上部の [
削除] をクリックします。これにより、Deployment と公開する Service の両方が削除されます。管理ワークステーションに接続する
管理ワークステーションへの SSH 接続を確立します。管理ワークステーションで、次の操作を行います。
Deployment を作成する
Deployment のマニフェストは次のとおりです。
apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment spec: selector: matchLabels: app: metrics department: sales replicas: 3 template: metadata: labels: app: metrics department: sales spec: containers: - name: hello image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0"
このマニフェストを my-deployment.yaml
という名前のファイルにコピーして Deployment を作成します。
kubectl apply --kubeconfigUSER_CLUSTER_KUBECONFIG -f my-deployment.yaml
USER_CLUSTER_KUBECONFIG は、クラスタの kubeconfig ファイルのパスです。
Deployment に関する基本情報を取得します。
kubectl --kubeconfigUSER_CLUSTER_KUBECONFIG get deployment my-deployment
出力には、Deployment に利用可能な次の 3 つの Pod があることが示されます。
NAME READY UP-TO-DATE AVAILABLE AGE my-deployment 3/3 3 3 27s
Deployment 内の Pod を一覧表示します。
kubectl --kubeconfigUSER_CLUSTER_KUBECONFIG get pods
出力に Deployment に実行中の Pod が 3 つあることが表示されます。
NAME READY STATUS RESTARTS AGE my-deployment-54944c8d55-4srm2 1/1 Running 0 6s my-deployment-54944c8d55-7z5nn 1/1 Running 0 6s my-deployment-54944c8d55-j62n9 1/1 Running 0 6s
Deployment に関する詳細情報を取得します。
kubectl --kubeconfigUSER_CLUSTER_KUBECONFIG get deployment my-deployment --output yaml
出力には、Deployment の仕様とステータスの詳細が表示されます。
kind: Deployment metadata: ... generation: 1 name: my-deployment namespace: default ... spec: ... replicas: 3 revisionHistoryLimit: 10 selector: matchLabels: app: metrics department: sales ... spec: containers: - image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0 imagePullPolicy: IfNotPresent name: hello resources: {} terminationMessagePath: /dev/termination-log terminationMessagePolicy: File dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 30 status: availableReplicas: 3 conditions: ‑ lastTransitionTime: "2019-11-11T18:44:02Z" lastUpdateTime: "2019-11-11T18:44:02Z" message: Deployment has minimum availability. reason: MinimumReplicasAvailable status: "True" type: Available ‑ lastTransitionTime: "2019-11-11T18:43:58Z" lastUpdateTime: "2019-11-11T18:44:02Z" message: ReplicaSet "my-deployment-54944c8d55" has successfully progressed. reason: NewReplicaSetAvailable status: "True" type: Progressing observedGeneration: 1 readyReplicas: 3 replicas: 3 updatedReplicas: 3
Deployment を記述します。
kubectl --kubeconfigUSER_CLUSTER_KUBECONFIG describe deployment my-deployment
関連付けられた ReplicaSet を含む、適切にフォーマットされた Deployment の詳細が出力に表示されます。
Name: my-deployment Namespace: default CreationTimestamp: Mon, 11 Nov 2019 10:43:58 -0800 Labels:... Selector: app=metrics,department=sales Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=metrics department=sales Containers: hello: Image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0 Port: Host Port: Environment: Mounts: Volumes: Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: NewReplicaSet: my-deployment-54944c8d55 (3/3 replicas created)
LoadBalancer タイプの Service を作成する
Deployment をクラスタ外のクライアントに公開する方法の 一つは、LoadBalancer
タイプの Kubernetes Service を作成することです。
LoadBalancer
タイプの Service のマニフェストは次のとおりです。
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: metrics department: sales type: LoadBalancer ports: ‑ port: 80 targetPort: 8080
この演習を進めるにあたって、この Service について次のことを理解しておくことが重要です。
app: metrics
とdepartment: sales
のラベルが付いた Pod は、Service のメンバーです。my-deployment
の Pod にはこれらのラベルが付いていることに注意してください。クライアントによってこの Service の TCP ポート 80 にリクエストが送信されると、このリクエストは TCP ポート 8080 でメンバー Pod に転送されます。
メンバー Pod ごとに、TCP ポート 8080 をリッスンするコンテナが必要です。
デフォルトでは、hello-app
コンテナが TCP ポート 8080 をリッスンします。これは、アプリの Dockerfile とソースコードで確認できます。
このマニフェストを my-service.yaml
という名前のファイルに保存して Service を作成します。
kubectl --kubeconfigUSER_CLUSTER_KUBECONFIG apply -f my-service.yaml
USER_CLUSTER_KUBECONFIG は、クラスタの kubeconfig ファイルのパスです。
Service を作成すると、Google Distributed Cloud はクラスタ ロードバランサに loadBalancerIP
アドレスを自動的に構成します。
Service を表示します。
kubectl --kubeconfigUSER_CLUSTER_KUBECONFIG get service my-service --output yaml
出力は次のようになります。
kind: Service metadata: ... name: my-service namespace: default ... spec: allocateLoadBalancerNodePorts: true clusterIP: 10.96.1.39 clusterIPs: - 10.96.1.39 externalTrafficPolicy: Cluster internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - nodePort: 31184 port: 80 protocol: TCP targetPort: 8080 selector: app: metrics department: sales sessionAffinity: None type: LoadBalancer status: loadBalancer: ingress: - ip: 203.0.113.1
上記の出力では、Service に clusterIP
と loadBalancerIP
があることがわかります。また、port
と targetPort
もあります。
clusterIP
はこの演習には関係ありません。loadBalancerIP
は、クラスタの外にあるクライアントが Service を呼び出すために使用できる IP アドレスです。
例として、上記の出力に示されている値を使用します。つまり、Service に loadBalancerIP
= 203.0.113.1、port
= 80、targetPort
= 8080 が設定されているとします。
クライアントは TCP ポート 80 で 203.0.113.1 にリクエストを送信します。リクエストはクラスタ ロードバランサに転送されます。ロードバランサは、TCP ポート 8080 でメンバーの Pod にリクエストを転送します。
Service を呼び出します。
curlLOAD_BALANCER_IP
出力には、Hello, world!
メッセージが表示されます。
curl 203.0.113.1 Hello, world! Version: 2.0.0 Hostname: my-deployment-dbd86c8c4-9wpbv
Service を削除する
Service を削除します。
kubectl --kubeconfigUSER_CLUSTER_KUBECONFIG delete service my-service
Service が削除されたことを確認します。
kubectl --kubeconfigUSER_CLUSTER_KUBECONFIG get services
出力に my-service
が表示されなくなります。
Deployment を削除する
Deployment を削除します。
kubectl --kubeconfigUSER_CLUSTER_KUBECONFIG delete deployment my-deployment
Deployment が削除されたことを確認します。
kubectl --kubeconfigUSER_CLUSTER_KUBECONFIG get deployments
出力に my-deployment
が表示されなくなります。