使用 Deployment 运行一个无状态应用

本文介绍如何通过 Kubernetes Deployment 对象去运行一个应用.

Objectives

  • 创建一个 nginx Deployment.
  • 使用 kubectl 列举关于 Deployment 的信息.
  • 更新 Deployment。

Before you begin

你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

Your Kubernetes server must be at or later than version v1.9. To check the version, enter kubectl version.

创建并了解一个 nginx Deployment

你可以通过创建一个 Kubernetes Deployment 对象来运行一个应用, 且你可以在一个 YAML 文件中描述 Deployment。例如, 下面这个 YAML 文件描述了一个运行 nginx:1.14.2 Docker 镜像的 Deployment:

application/deployment.yaml

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-deployment
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: nginx
  9. replicas: 2 # tells deployment to run 2 pods matching the template
  10. template:
  11. metadata:
  12. labels:
  13. app: nginx
  14. spec:
  15. containers:
  16. - name: nginx
  17. image: nginx:1.14.2
  18. ports:
  19. - containerPort: 80
  1. 通过 YAML 文件创建一个 Deployment:

    1. kubectl apply -f https://k8s.io/examples/application/deployment.yaml
  2. 显示 Deployment 相关信息:

    1. kubectl describe deployment nginx-deployment

    输出类似于这样:

    1. Name: nginx-deployment
    2. Namespace: default
    3. CreationTimestamp: Tue, 30 Aug 2016 18:11:37 -0700
    4. Labels: app=nginx
    5. Annotations: deployment.kubernetes.io/revision=1
    6. Selector: app=nginx
    7. Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
    8. StrategyType: RollingUpdate
    9. MinReadySeconds: 0
    10. RollingUpdateStrategy: 1 max unavailable, 1 max surge
    11. Pod Template:
    12. Labels: app=nginx
    13. Containers:
    14. nginx:
    15. Image: nginx:1.7.9
    16. Port: 80/TCP
    17. Environment: <none>
    18. Mounts: <none>
    19. Volumes: <none>
    20. Conditions:
    21. Type Status Reason
    22. ---- ------ ------
    23. Available True MinimumReplicasAvailable
    24. Progressing True NewReplicaSetAvailable
    25. OldReplicaSets: <none>
    26. NewReplicaSet: nginx-deployment-1771418926 (2/2 replicas created)
    27. No events.
  3. 列出 Deployment 创建的 Pods:

    1. kubectl get pods -l app=nginx

    输出类似于这样:

    1. NAME READY STATUS RESTARTS AGE
    2. nginx-deployment-1771418926-7o5ns 1/1 Running 0 16h
    3. nginx-deployment-1771418926-r18az 1/1 Running 0 16h
  4. 展示某一个 Pod 信息:

    1. kubectl describe pod <pod-name>

    这里的 <pod-name> 是某一 Pod 的名称。

更新 Deployment

你可以通过更新一个新的 YAML 文件来更新 Deployment。下面的 YAML 文件指定该 Deployment 镜像更新为 nginx 1.16.1。

application/deployment-update.yaml

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-deployment
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: nginx
  9. replicas: 2
  10. template:
  11. metadata:
  12. labels:
  13. app: nginx
  14. spec:
  15. containers:
  16. - name: nginx
  17. image: nginx:1.16.1 # Update the version of nginx from 1.14.2 to 1.16.1
  18. ports:
  19. - containerPort: 80
  1. 应用新的 YAML:

    1. kubectl apply -f https://k8s.io/examples/application/deployment-update.yaml
  2. 查看该 Deployment 以新的名称创建 Pods 同时删除旧的 Pods:

    1. kubectl get pods -l app=nginx

通过增加副本数来扩缩应用

你可以通过应用新的 YAML 文件来增加 Deployment 中 Pods 的数量。 下面的 YAML 文件将 replicas 设置为 4,指定该 Deployment 应有 4 个 Pods:

application/deployment-scale.yaml

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-deployment
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: nginx
  9. replicas: 4 # Update the replicas from 2 to 4
  10. template:
  11. metadata:
  12. labels:
  13. app: nginx
  14. spec:
  15. containers:
  16. - name: nginx
  17. image: nginx:1.14.2
  18. ports:
  19. - containerPort: 80
  1. 应用新的 YAML 文件:

    1. kubectl apply -f https://k8s.io/examples/application/deployment-scale.yaml
  2. 验证 Deployment 有 4 个 Pods:

    1. kubectl get pods -l app=nginx

    输出的结果类似于:

    1. NAME READY STATUS RESTARTS AGE
    2. nginx-deployment-148880595-4zdqq 1/1 Running 0 25s
    3. nginx-deployment-148880595-6zgi1 1/1 Running 0 25s
    4. nginx-deployment-148880595-fxcez 1/1 Running 0 2m
    5. nginx-deployment-148880595-rwovn 1/1 Running 0 2m

删除 Deployment

基于名称删除 Deployment:

  1. kubectl delete deployment nginx-deployment

ReplicationControllers — 旧的方式

创建一个多副本应用首选方法是使用 Deployment,Deployment 内部使用 ReplicaSet。 在 Deployment 和 ReplicaSet 被引入到 Kubernetes 之前,多副本应用通过 ReplicationController 来配置。

What’s next

最后修改 May 14, 2021 at 1:41 PM PST: [zh] Resync tasks for 1.21 (4) (1638e3543)