kubernetes核心实战(四)--- Deployments

  • 2021-11-30
  • Admin

6、Deployments(重点)

一个 Deployment 控制器为 Pods和 ReplicaSets提供描述性的更新方式。

06909010ac702a5679cd144bcd74b5b1.png

描述 Deployment 中的 desired state,并且 Deployment 控制器以受控速率更改实际状态,以达到期望状态。可以定义 Deployments 以创建新的 ReplicaSets ,或删除现有 Deployments ,并通过新的 Deployments 使用其所有资源。

用例

以下是典型的 Deployments 用例:

创建 Deployment 以展开 ReplicaSet 。ReplicaSet 在后台创建 Pods。检查 ReplicaSet 展开的状态,查看其是否成功。

声明 Pod 的新状态 通过更新 Deployment 的 PodTemplateSpec。将创建新的 ReplicaSet ,并且 Deployment 管理器以受控速率将 Pod 从旧 ReplicaSet 移动到新 ReplicaSet 。每个新的 ReplicaSet 都会更新 Deployment 的修改历史。

回滚到较早的 Deployment 版本,如果 Deployment 的当前状态不稳定。每次回滚都会更新 Deployment 的修改。

扩展 Deployment 以承担更多负载.

暂停 Deployment 对其 PodTemplateSpec 进行修改,然后恢复它以启动新的展开。

使用 Deployment 状态 作为卡住展开的指示器。

清理较旧的 ReplicaSets ,那些不再需要的。

6e2d48024c859bbdc72dbf0187f4f0b4.png

1)创建 Deployment
  1. [root@k8s-master-node1 ~/yaml/test]# vim deployments.yaml
  2. [root@k8s-master-node1 ~/yaml/test]# cat deployments.yaml
  3. apiVersion: apps/v1
  4. kind: Deployment
  5. metadata:
  6. name: nginx-deployment
  7. labels:
  8. app: nginx
  9. spec:
  10. replicas: 3
  11. selector:
  12. matchLabels:
  13. app: nginx
  14. template:
  15. metadata:
  16. labels:
  17. app: nginx
  18. spec:
  19. containers:
  20. - name: nginx
  21. image: nginx:1.14.2
  22. ports:
  23. - containerPort: 80
  24. [root@k8s-master-node1 ~/yaml/test]#
  25. [root@k8s-master-node1 ~/yaml/test]# kubectl apply -f deployments.yaml
  26. deployment.apps/nginx-deployment created
  27. [root@k8s-master-node1 ~/yaml/test]#
  28. [root@k8s-master-node1 ~/yaml/test]#
含义介绍:

在该例中:将创建名为 nginx-deployment 的 Deployment ,由 .metadata.name 字段指示。

Deployment 创建三个复制的 Pods,由 replicas 字段指示。

selector 字段定义 Deployment 如何查找要管理的 Pods。在这种情况下,只需选择在 Pod 模板(app: nginx)中定义的标签。但是,更复杂的选择规则是可能的,只要 Pod 模板本身满足规则。

说明:

matchLabels 字段是 {key,value} 的映射。单个 {key,value}在 matchLabels 映射中的值等效于 matchExpressions 的元素,其键字段是“key”,运算符为“In”,值数组仅包含“value”。所有要求,从 matchLabelsmatchExpressions,必须满足才能匹配。

template 字段包含以下子字段:

Pod 标记为app: nginx,使用labels字段。

Pod 模板规范或 .template.spec 字段指示 Pods 运行一个容器, nginx,运行 nginx Docker Hub版本1.7.9的镜像 。

创建一个容器并使用name字段将其命名为 nginx。

查看详细的字段解释:
  1. [root@k8s-master-node1 ~]# kubectl explain Deployment.spec
  2. KIND: Deployment
  3. VERSION: apps/v1
  4. RESOURCE: spec
  5. DESCRIPTION:
  6. Specification of the desired behavior of the Deployment.
  7. DeploymentSpec is the specification of the desired behavior of the
  8. Deployment.
  9. FIELDS:
  10. minReadySeconds
  11. Minimum number of seconds for which a newly created pod should be ready
  12. without any of its container crashing, for it to be considered available.
  13. Defaults to 0 (pod will be considered available as soon as it is ready)
  14. paused
  15. Indicates that the deployment is paused.
  16. progressDeadlineSeconds
  17. The maximum time in seconds for a deployment to make progress before it is
  18. considered to be failed. The deployment controller will continue to process
  19. failed deployments and a condition with a ProgressDeadlineExceeded reason
  20. will be surfaced in the deployment status. Note that progress will not be
  21. estimated during the time a deployment is paused. Defaults to 600s.
  22. replicas
  23. Number of desired pods. This is a pointer to distinguish between explicit
  24. zero and not specified. Defaults to 1.
  25. revisionHistoryLimit
  26. The number of old ReplicaSets to retain to allow rollback. This is a
  27. pointer to distinguish between explicit zero and not specified. Defaults to
  28. 10.
  29. selector -required-
  30. Label selector for pods. Existing ReplicaSets whose pods are selected by
  31. this will be the ones affected by this deployment. It must match the pod
  32. template's labels.
  33. strategy
  34. The deployment strategy to use to replace existing pods with new ones.
  35. template -required-
  36. Template describes the pods that will be created.
  37. [root@k8s-master-node1 ~]#
  38. 查看pod
    1. [root@k8s-master-node1 ~/yaml/test]# kubectl get pod
    2. NAME READY STATUS RESTARTS AGE
    3. ingress-demo-app-694bf5d965-q4l7m 1/1 Terminating 0 23h
    4. ingress-demo-app-694bf5d965-v28sl 1/1 Running 0 3m9s
    5. ingress-demo-app-694bf5d965-v652j 1/1 Running 0 23h
    6. nfs-client-provisioner-dc5789f74-nnk77 1/1 Running 1 (8h ago) 22h
    7. nginx-deployment-66b6c48dd5-5hhjq 1/1 Running 0 3m9s
    8. nginx-deployment-66b6c48dd5-9z2n5 1/1 Running 0 3m19s
    9. nginx-deployment-66b6c48dd5-llq7c 1/1 Running 0 9m10s
    10. [root@k8s-master-node1 ~/yaml/test]#
    查看deployments
    1. [root@k8s-master-node1 ~/yaml/test]# kubectl get deployments.apps
    2. NAME READY UP-TO-DATE AVAILABLE AGE
    3. ingress-demo-app 2/2 2 2 23h
    4. nfs-client-provisioner 1/1 1 1 22h
    5. nginx-deployment 3/3 3 3 9m45s
    6. [root@k8s-master-node1 ~/yaml/test]#
    解释说明:

    检查集群中的 Deployments 时,将显示以下字段:

    NAME 列出了集群中 Deployments 的名称。

    DESIRED 显示应用程序的所需 副本 数,在创建 Deployment 时定义这些副本。这是 期望状态。

    CURRENT显示当前正在运行的副本数。

    UP-TO-DATE显示已更新以实现期望状态的副本数。

    AVAILABLE显示应用程序可供用户使用的副本数。

    AGE 显示应用程序运行的时间量。

    查看rs
    1. [root@k8s-master-node1 ~/yaml/test]# kubectl get replicasets.apps
    2. NAME DESIRED CURRENT READY AGE
    3. ingress-demo-app-694bf5d965 2 2 2 23h
    4. nfs-client-provisioner-dc5789f74 1 1 1 23h
    5. nginx-deployment-66b6c48dd5 3 3 3 19m
    6. [root@k8s-master-node1 ~/yaml/test]#
    查看pods的标签
    1. [root@k8s-master-node1 ~/yaml/test]# kubectl get pods --show-labels
    2. NAME READY STATUS RESTARTS AGE LABELS
    3. ingress-demo-app-694bf5d965-q4l7m 1/1 Terminating 0 23h app=ingress-demo-app,pod-template-hash=694bf5d965
    4. ingress-demo-app-694bf5d965-v28sl 1/1 Running 0 15m app=ingress-demo-app,pod-template-hash=694bf5d965
    5. ingress-demo-app-694bf5d965-v652j 1/1 Running 0 23h app=ingress-demo-app,pod-template-hash=694bf5d965
    6. nfs-client-provisioner-dc5789f74-nnk77 1/1 Running 1 (8h ago) 23h app=nfs-client-provisioner,pod-template-hash=dc5789f74
    7. nginx-deployment-66b6c48dd5-48k9j 0/1 Terminating 0 21m app=nginx,pod-template-hash=66b6c48dd5
    8. nginx-deployment-66b6c48dd5-5hhjq 1/1 Running 0 15m app=nginx,pod-template-hash=66b6c48dd5
    9. nginx-deployment-66b6c48dd5-9z2n5 1/1 Running 0 15m app=nginx,pod-template-hash=66b6c48dd5
    10. nginx-deployment-66b6c48dd5-kvzft 0/1 Terminating 0 21m app=nginx,pod-template-hash=66b6c48dd5
    11. nginx-deployment-66b6c48dd5-llq7c 1/1 Running 0 21m app=nginx,pod-template-hash=66b6c48dd5
    12. [root@k8s-master-node1 ~/yaml/test]#
    2)更新回滚 Deployment
    命令行行升级使用镜像
    1. [root@k8s-master-node1 ~/yaml/test]# kubectl get deployments -o wide
    2. NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
    3. ingress-demo-app 2/2 2 2 23h whoami traefik/whoami:v1.6.1 app=ingress-demo-app
    4. nfs-client-provisioner 1/1 1 1 23h nfs-client-provisioner registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/nfs-subdir-external-provisioner:v4.0.2 app=nfs-client-provisioner
    5. nginx-deployment 3/3 3 3 18m nginx nginx:1.14.2 app=nginx
    6. [root@k8s-master-node1 ~/yaml/test]#
    7. [root@k8s-master-node1 ~/yaml/test]# kubectl --record deployment.apps/nginx-deployment set image deployment.v1.apps/nginx-deployment nginx=nginx:1.20.1
    8. Flag --record has been deprecated, --record will be removed in the future
    9. deployment.apps/nginx-deployment image updated
    10. deployment.apps/nginx-deployment image updated
    11. [root@k8s-master-node1 ~/yaml/test]#
    12. [root@k8s-master-node1 ~/yaml/test]# kubectl get deployments -o wide
    13. NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
    14. ingress-demo-app 2/2 2 2 23h whoami traefik/whoami:v1.6.1 app=ingress-demo-app
    15. nfs-client-provisioner 1/1 1 1 23h nfs-client-provisioner registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/nfs-subdir-external-provisioner:v4.0.2 app=nfs-client-provisioner
    16. nginx-deployment 3/3 1 3 24m nginx nginx:1.20.1 app=nginx
    17. [root@k8s-master-node1 ~/yaml/test]#
    yaml方式修改镜像
    1. [root@k8s-master-node1 ~/yaml/test]# kubectl edit deployments.apps nginx-deployment
    2. Edit cancelled, no changes made.
    3. [root@k8s-master-node1 ~/yaml/test]#
    查看更新过程
    1. [root@k8s-master-node1 ~/yaml/test]# kubectl rollout status deployment.v1.apps/nginx-deployment
    2. Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
    3. Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
    4. Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
    5. Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
    6. Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
    7. Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
    8. Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
    9. Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
    10. deployment "nginx-deployment" successfully rolled out
    11. [root@k8s-master-node1 ~/yaml/test]#
    查看详细信息
    1. [root@k8s-master-node1 ~/yaml/test]# kubectl describe deployments
    2. Name: ingress-demo-app
    3. Namespace: default
    4. CreationTimestamp: Tue, 16 Nov 2021 13:28:26 +0800
    5. Labels: app=ingress-demo-app
    6. Annotations: deployment.kubernetes.io/revision: 1
    7. Selector: app=ingress-demo-app
    8. Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
    9. StrategyType: RollingUpdate
    10. MinReadySeconds: 0
    11. RollingUpdateStrategy: 25% max unavailable, 25% max surge
    12. Pod Template:
    13. Labels: app=ingress-demo-app
    14. Containers:
    15. whoami:
    16. Image: traefik/whoami:v1.6.1
    17. Port: 80/TCP
    18. Host Port: 0/TCP
    19. Environment:
    20. Mounts:
    21. Volumes:
    22. Conditions:
    23. Type Status Reason
    24. ---- ------ ------
    25. Progressing True NewReplicaSetAvailable
    26. Available True MinimumReplicasAvailable
    27. OldReplicaSets:
    28. NewReplicaSet: ingress-demo-app-694bf5d965 (2/2 replicas created)
    29. Events:
    30. Type Reason Age From Message
    31. ---- ------ ---- ---- -------
    32. Normal ScalingReplicaSet 23h deployment-controller Scaled up replica set ingress-demo-app-694bf5d965 to 2
    33. Name: nfs-client-provisioner
    34. Namespace: default
    35. CreationTimestamp: Tue, 16 Nov 2021 14:07:33 +0800
    36. Labels: app=nfs-client-provisioner
    37. Annotations: deployment.kubernetes.io/revision: 1
    38. Selector: app=nfs-client-provisioner
    39. Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
    40. StrategyType: Recreate
    41. MinReadySeconds: 0
    42. Pod Template:
    43. Labels: app=nfs-client-provisioner
    44. Service Account: nfs-client-provisioner
    45. Containers:
    46. nfs-client-provisioner:
    47. Image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/nfs-subdir-external-provisioner:v4.0.2
    48. Port:
    49. Host Port:
    50. Environment:
    51. PROVISIONER_NAME: k8s-sigs.io/nfs-subdir-external-provisioner
    52. NFS_SERVER: 192.168.1.66
    53. NFS_PATH: /nfs/
    54. Mounts:
    55. /persistentvolumes from nfs-client-root (rw)
    56. Volumes:
    57. nfs-client-root:
    58. Type: NFS (an NFS mount that lasts the lifetime of a pod)
    59. Server: 192.168.1.66
    60. Path: /nfs/
    61. ReadOnly: false
    62. Conditions:
    63. Type Status Reason
    64. ---- ------ ------
    65. Progressing True NewReplicaSetAvailable
    66. Available True MinimumReplicasAvailable
    67. OldReplicaSets:
    68. NewReplicaSet: nfs-client-provisioner-dc5789f74 (1/1 replicas created)
    69. Events:
    70. Type Reason Age From Message
    71. ---- ------ ---- ---- -------
    72. Normal ScalingReplicaSet 23h deployment-controller Scaled up replica set nfs-client-provisioner-dc5789f74 to 1
    73. 联系站长

      QQ:769220720

      Copyright © SibooSoft All right reserved 津ICP备19011444号