アプリケーションをデプロイする

このドキュメントでは、GKE on VMware のユーザー クラスタにアプリケーションをデプロイする方法の例を示します。

準備

ここに示す例では、バンドル型 MetalLB ロード バランシングを使用するユーザー クラスタが必要です。MetalLB を使用する最小のユーザー クラスタを作成する手順については、基本クラスタを作成するをご覧ください。

アプリケーションは、管理ワークステーションで Google Cloud コンソールまたはコマンドライン ツール kubectl を使用してデプロイできます。

コンソール

  1. コンソールで、Google Kubernetes Engine クラスタの概要ページに移動します。

    GKE クラスタに移動

  2. クラスタのリストでユーザー クラスタをクリックし、クラスタにログインしていることを確認します。

    まだユーザー クラスタにログインしていない場合は、Google Cloud コンソールからクラスタを管理するの手順に従ってログインします。

コンテナ

  1. [新しいコンテナの指定] で、[既存のコンテナ イメージ] を選択します。

  2. [イメージパス] に「us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0」と入力します。

  3. [続行] をクリックします。

構成

  1. [Deployment name] に「my-deployment」と入力します。

  2. [Namespace] に「default」と入力します。

  3. 次の 2 つのラベルを入力します。

    • Key 1: appValue 1: metrics
    • Key 2: departmentValue 2 sales
  4. [Kubernetes クラスタ] プルダウンからクラスタを選択します。

  5. [続行] をクリックします。

公開

  1. [Deployment を新しいサービスとして公開する] チェックボックスをオンにします。

  2. [ポート 1] に「80」と入力します。

  3. [ターゲット ポート 1] に「8080」と入力します。hello-app コンテナは、デフォルトで TCP ポート 8080 をリッスンするため、これは適切な値です。これは、アプリの Dockerfile とソースコードで確認できます。

  4. [プロトコル 1] で TCP を選択します。

  5. [サービスタイプ] で LoadBalancer を選択します。

ページの下部にある [デプロイ] ボタンをクリックします。

Deployment と Service の詳細を表示する

  1. Deployment の準備が完了すると、Google Cloud コンソールの Kubernetes ワークロードセクションに [デプロイの詳細] ページが開きます。このページでは、Deployment とその 3 つの Pod の詳細を確認できます。

  2. [サービスの公開] で、Deployment を公開する Service の名前をクリックします。この演習では、名前は my-deployment-service です。

  3. [サービスの詳細] ページが開きます。このページでは、Service の詳細を確認できます。たとえば、app: metricsdepartment: sales のラベルが付いた Pod が Service のメンバーであることがわかります。my-deployment の Pod には、これらのラベルが付いています。

[ロードバランサの IP] の値も確認できます。ロードバランサの IP は、クラスタ ロードバランサに自動的に構成されています。

Service への転送

クラスタの外にあるクライアントが、TCP ポート 80 でロードバランサの IP にリクエストを送信したとします。リクエストはクラスタ ロードバランサに転送されます。ロードバランサは、TCP ポート 8080 でメンバーの Pod にリクエストを転送します。my-deployment のすべての Pod には、TCP ポート 8080 をリッスンするコンテナがあることを思い出してください。

Service をテストする

ロードバランサの 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 をクラスタ外のクライアントに公開する方法の 1 つは、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: metricsdepartment: 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 を作成すると、GKE on VMware によってクラスタ ロードバランサに自動的に 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 に clusterIPloadBalancerIP があることがわかります。また、porttargetPort もあります。

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 が表示されなくなります。

次のステップ

Service と Ingress を作成する