最初のアプリケーションのデプロイ

このページでは、ユーザー クラスタにアプリケーションをデプロイする方法について説明します。

管理ワークステーションへの SSH 接続

管理ワークステーションに SSH で接続します。

ssh -i ~/.ssh/vsphere_workstation ubuntu@[IP_ADDRESS]

ここで、[IP_ADDRESS] は管理ワークステーションの IP アドレスです。

このトピックの残りの手順はすべて管理ワークステーションで行います。

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: "gcr.io/google-samples/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: gcr.io/google-samples/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:        gcr.io/google-samples/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
  loadBalancerIP: [SERVICE_IP_ADDRESS]
  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 とソースコードで確認できます。

[SERVICE_IP_ADDRESS] は、まだ使用されていない自分のアドレスに置き換えます。たとえば、これを会社が所有するパブリック IP アドレスに設定できます。または、社内ネットワークのプライベート アドレスに設定することもできます。

選択したアドレスは、Service にリクエストを送信するクライアントの場所からルーティング可能である必要があります。たとえば、プライベート アドレスを選択した場合、外部クライアントは Service にリクエストを送信できません。

マニフェストを my-service.yaml という名前のファイルに保存し、Service を作成します。

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] apply -f my-service.yaml

ここで、[USER_CLUSTER_KUBECONFIG] はユーザー クラスタの kubeconfig ファイルのパスです。

Service を作成すると、GKE On-Prem によって F5 BIG-IP ロードバランサの loadBalancerIP アドレスが自動的に構成されます。

Service を表示します。

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get service my-service --output yaml

出力は次のようになります。

apiVersion: v1
kind: Service
metadata:
  ...
  name: my-service
  namespace: default
  ...
spec:
  clusterIP: 10.107.84.202
  externalTrafficPolicy: Cluster
  loadBalancerIP: 203.0.113.1
  ports:
  - nodePort: 31919
    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 があることがわかります。また、nodePortporttargetPort もあります。

clusterIP はこの演習には関係ありません。loadBalancerIPmy-service.yaml で指定した IP アドレスです。

例として、上記の出力に示されている値を使用します。つまり、Service の loadBalancerIP = 203.0.113.1、port = 80、nodePort = 31919、targetPort = 8080 とします。

クライアントは TCP ポート 80 で 203.0.113.1 にリクエストを送信します。リクエストは F5 BIG-IP ロードバランサにルーティングされます。ロードバランサは、ユーザー クラスタ ノードの 1 つを選択し、TCP ポート 31919 でリクエストを [NODE_ADDRESS] に転送します。ノードの iptables ルールにより、リクエストは TCP ポート 8080 のメンバー Pod に転送されます。

Service を呼び出します。

curl [SERVICE_IP_ADDRESS]

ここで、[SERVICE_IP_ADDRESS]loadBalancerIP に指定したアドレスです。

出力には、Hello, world! メッセージが表示されます。

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