このページでは、ユーザー クラスタにアプリケーションをデプロイする方法について説明します。
管理ワークステーションへの 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: metrics
とdepartment: 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 に clusterIP
と loadBalancerIP
があることがわかります。また、nodePort
、port
、targetPort
もあります。
clusterIP
はこの演習には関係ありません。loadBalancerIP
は my-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
が表示されなくなります。