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

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

始める前に

ここに示す例では、バンドルされた 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. [デプロイ名] に「my-deployment」と入力します。

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

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

    • キー 1: app, 値 1: metrics
    • キー 2: department, 値 2 sales
  4. [Kubernetes クラスタ] プルダウンでクラスタを選択します。

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

公開

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

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

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

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

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

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

デプロイとサービスの詳細を表示する

  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 をリッスンするコンテナがあることを思い出してください。

サービスをテストする

ロードバランサの 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: 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 を作成すると、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 に 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 を作成する