部署应用

本文档介绍如何在 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: "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 有三个可用的 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: 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

输出结果显示有关 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:        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 公开给集群外部客户端的一种方法是创建类型为 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。它还具有 nodePortporttargetPort

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

后续步骤

启用 Ingress