このドキュメントでは、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 --kubeconfig USER_CLUSTER_KUBECONFIG -f my-deployment.yaml
USER_CLUSTER_KUBECONFIG は、クラスタの kubeconfig ファイルのパスです。
Deployment に関する基本情報を取得します。
kubectl --kubeconfig USER_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 --kubeconfig USER_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 --kubeconfig USER_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 --kubeconfig USER_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 --kubeconfig USER_CLUSTER_KUBECONFIG apply -f my-service.yaml
USER_CLUSTER_KUBECONFIG は、クラスタの kubeconfig ファイルのパスです。
Service を作成すると、Google Distributed Cloud はクラスタ ロードバランサに loadBalancerIP
アドレスを自動的に構成します。
Service を表示します。
kubectl --kubeconfig USER_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 を呼び出します。
curl LOAD_BALANCER_IP
出力には、Hello, world!
メッセージが表示されます。
curl 203.0.113.1 Hello, world! Version: 2.0.0 Hostname: my-deployment-dbd86c8c4-9wpbv
Service を削除する
Service を削除します。
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete service my-service
Service が削除されたことを確認します。
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get services
出力に my-service
が表示されなくなります。
Deployment を削除する
Deployment を削除します。
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG delete deployment my-deployment
Deployment が削除されたことを確認します。
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get deployments
出力に my-deployment
が表示されなくなります。