本文档介绍如何在 VMware 上的 Anthos 集群 (GKE On-Prem) 的用户集群中部署应用。
准备工作
通过 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: "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 有三个可用的 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:
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
输出结果显示有关 Deployment 的精确格式详细信息,包括关联的 ReplicaSet:
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 loadBalancerIP: [SERVICE_IP_ADDRESS] ports: - port: 80 targetPort: 8080
基于本练习的目的,了解以下重要事项有助于理解 Service:
具有
app: metrics
标签和department: sales
标签的任何 Pod 都是 Service 的成员。请注意,my-deployment
中的 Pod 具有这些标签。当客户端向 TCP 端口 80 上的 Service 发送请求时,请求将被转发到 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 时,Anthos clusters on VMware 会自动在 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 负载平衡器。负载平衡器选择您的一个用户集群节点,并将请求转发到 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
。