Kubernetes控制器之Deployment

  官方参考:https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/

       https://www.kubernetes.org.cn/deployment

  Deployments

  Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用。典型的应用场景包括:

  • 定义Deployment来创建Pod和ReplicaSet
  • 滚动升级和回滚应用
  • 扩容和缩容
  • 暂停和继续Deployment

  你只需要在Deployment中描述你想要的目标状态是什么,Deployment controller就会帮你将Pod和Replica Set的实际状态改变到你的目标状态。你可以定义一个全新的Deployment,也可以创建一个新的替换旧的Deployment。

  一个典型的用例如下

  • 使用Deployment来创建ReplicaSet。ReplicaSet在后台创建pod。检查启动状态,看它是成功还是失败。
  • 然后,通过更新Deployment的PodTemplateSpec字段来声明Pod的新状态。这会创建一个新的ReplicaSet,Deployment会按照控制的速率将pod从旧的ReplicaSet移动到新的ReplicaSet中。
  • 如果当前状态不稳定,回滚到之前的Deployment revision。每次回滚都会更新Deployment的revision。
  • 扩容Deployment以满足更高的负载。
  • 暂停Deployment来应用PodTemplateSpec的多个修复,然后恢复上线。
  • 根据Deployment 的状态判断上线是否hang住了。
  • 清除旧的不必要的ReplicaSet。

  创建Deployment

  下面是 Deployment 示例。创建一个 ReplicaSet 展开三个 nginx Pods:

  该示例为官方示例下载地址是

https://raw.githubusercontent.com/kubernetes/website/master/content/zh/examples/controllers/nginx-deployment.yaml

   

# cat nginx-deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.15.4
        name: nginx
        ports:
        - containerPort: 80

   也可以通过以下命令生成该yaml文档然后修改

# kubectl create deployment nginx-deployment --image=nginx:1.15.4 --dry-run -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx-deployment
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-deployment
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx-deployment
    spec:
      containers:
      - image: nginx:1.15.4
        name: nginx
        resources: {}
status: {}

   在该例中

  • 创建名为nginx-deployment的Deployment,由metadata.name字段指示
  • Deployment创建3个复制的Pods,由spec.replicas字段指示,该字段可以没有默认即为1
  • selector字段定义Deployment如何查找要管理的Pods。在这种情况下只需要在Pod模板(app:nginx)中定义的标签。
注意:`matchLabels` 字段是 {key,value} 的映射。单个 {key,value}在 `matchLabels` 映射中的值等效于 `matchExpressions` 的元素,其键字段是“key”,运算符为“In”,值数组仅包含“value”。所有要求,从 `matchLabels` 和 `matchExpressions`,必须满足才能匹配。
  •  template字段包含以下子字段
  • Pod使用labels字段标记为app:nginx
  • template.spec字段指示Pod运行一个容器nginx
  • 创建一个容器并使用name字段将其命名为nginx

  通过运行以下命令创建Deployment

kubectl apply -f nginx-deployment.yaml
注意:将kubectl的 —record 的flag设置为 true可以在annotation中记录当前命令创建或者升级了该资源。这在未来会很有用,例如,查看在每个Deployment revision中执行了哪些命令。

   --record示例如下

   运行kubectl get deployments 以检查 Deployment 是否已创建。如果仍在创建 Deployment ,则输出以下内容:

# kubectl get deployment
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment         3/3     3            3           48s

   显示以下字段

`READY` 3/3左边3是真正运行的副本数右边3是期望的副本数即replicas定义的副本数。
`UP-TO-DATE`显示已更新以实现期望状态的副本数。
`AVAILABLE`显示应用程序可供用户使用的副本数。
`AGE` 显示应用程序运行的时间量。

   要查看Deployment创建的ReplicaSet(rs),运行kubectl get rs输出

# kubectl get rs
NAME                                DESIRED   CURRENT   READY   AGE
nginx-deployment-67656986d9         3         3         3       108s

   

请注意, ReplicaSet 的名称始终被格式化为`[DEPLOYMENT-NAME]-[RANDOM-STRING]`。随机字符串是随机生成并使用 pod-template-hash 作为种子

   要查看每个Pod自动生成的标签,运行kubectl get pods --show-labels输出

# kubectl get pods --show-labels
NAME                                      READY   STATUS    RESTARTS   AGE     LABELS
nginx-deployment-67656986d9-996kk         1/1     Running   0          3m35s   app=nginx,pod-template-hash=67656986d9
nginx-deployment-67656986d9-fgdwz         1/1     Running   0          3m35s   app=nginx,pod-template-hash=67656986d9
nginx-deployment-67656986d9-j8jt8         1/1     Running   0          3m35s   app=nginx,pod-template-hash=67656986d9

   刚创建的Replica Set将保证总是有3个nginx的pod存在。并且创建的Pod名为[DEPLOYMENT-NAME]-[pod-template-hash]-[RANDOM-STRING]

注意: 你必须在Deployment中的selector指定正确pod template label(在该示例中是 app = nginx),不要跟其他的controller搞混了(包括Deployment、Replica Set、Replication Controller等)。Kubernetes本身不会阻止你这么做,如果你真的这么做了,这些controller之间会相互打架,并可能导致不正确的行为。

   Pod-template-hash 标签

注意:不要更改此标签

   Deployment 控制器将 pod-template-hash 标签添加到 Deployment 创建或使用的每个 ReplicaSet 。

  此标签可确保 Deployment 的子 ReplicaSets 不重叠。它通过对 ReplicaSet 的 PodTemplate 进行哈希处理,并使用生成的哈希值添加到 ReplicaSet 选择器、Pod 模板标签,并在 ReplicaSet 可能具有的任何现有 Pod 中。

  更新Deployment

注意: Deployment的rollout当且仅当Deployment的pod template(例如.spec.template)中的label更新或者镜像更改时被触发。其他更新,例如扩容Deployment不会触发rollout。

   安装以下步骤更新Deployment

  首先修改yaml把nginx版本修改成1.7.9

  应用一下各项nginx Pods,使用nginx:1.9.1镜像,而不是nginx:1.7.9

# kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
deployment.apps/nginx-deployment image updated

   说明:设置更新Deployment名为nginx-deployment镜像的镜像为nginx:1.9.1

  也可以使用edit命令来编辑Deployment,修改 .spec.template.spec.containers[0].image ,将nginx:1.7.9 改写成nginx:1.9.1

kubectl edit deployment/nginx-deployment

 

   修改完输出

deployment.apps/nginx-deployment edited

   查看rollout的状态,只要执行:

# kubectl rollout status deployment/nginx-deployment
deployment "nginx-deployment" successfully rolled out

   rollout成功后查看deployment

# kubectl get deployment
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment         3/3     3            3           9m37s

   UP-TO-DATE的replica的数目已经达到了配置中要求的数目。

  CURRENT的replica数表示Deployment管理的replica数量,AVAILABLE的replica数是当前可用的replica数量。

  我们通过执行kubectl get rs可以看到Deployment更新了Pod,通过创建一个新的Replica Set并扩容了3个replica,同时将原来的Replica Set缩容到了0个replica。

# kubectl get rs
NAME                                DESIRED   CURRENT   READY   AGE
nginx-deployment-54f57cf6bf         0         0         0       12m
nginx-deployment-56f8998dbc         3         3         3       9m6s

   执行 get pods只会看到当前的新的pod:

# kubectl get pod
NAME                                      READY   STATUS    RESTARTS   AGE
nginx-deployment-56f8998dbc-8j49x         1/1     Running   0          5m25s
nginx-deployment-56f8998dbc-fpzwt         1/1     Running   0          5m26s
nginx-deployment-56f8998dbc-r2wvp         1/1     Running   0          5m28s

   下次更新这些Pod的时候,只需要更新Deployment中pod的template即可

  Deployment 可确保在更新时仅关闭一定数量的 Pods。默认情况下,它确保至少 75%所需 Pods 运行(25%最大不可用)。

  Deployment 还确保仅创建一定数量的 Pods 高于期望的 Pods 数。默认情况下,它可确保最多增加 25% 期望 Pods 数(25%最大增量)。

  例如,如果仔细查看上述 Deployment ,将看到它首先创建了一个新的 Pod,然后删除了一些旧的 Pods,并创建了新的 Pods。它不会杀死老 Pods,直到有足够的数量新的 Pods 已经出现,并没有创造新的 Pods,直到足够数量的旧 Pods 被杀死。它确保至少 2 个 Pods 可用,并且总共最多 4 个 Pods 可用。

  获取Deployment更多信息

# kubectl describe deployments nginx-deployment
Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Fri, 20 Mar 2020 16:01:54 +0800
Labels:                 app=nginx
Annotations:            deployment.kubernetes.io/revision: 2
                        kubectl.kubernetes.io/last-applied-configuration:
                          {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"nginx"},"name":"nginx-deployment","namespace":"d...
Selector:               app=nginx
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=nginx
  Containers:
   nginx:
    Image:        nginx:1.9.1
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-deployment-56f8998dbc (3/3 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  53s   deployment-controller  Scaled up replica set nginx-deployment-54f57cf6bf to 3
  Normal  ScalingReplicaSet  8s    deployment-controller  Scaled up replica set nginx-deployment-56f8998dbc to 1
  Normal  ScalingReplicaSet  6s    deployment-controller  Scaled down replica set nginx-deployment-54f57cf6bf to 2
  Normal  ScalingReplicaSet  6s    deployment-controller  Scaled up replica set nginx-deployment-56f8998dbc to 2
  Normal  ScalingReplicaSet  5s    deployment-controller  Scaled down replica set nginx-deployment-54f57cf6bf to 1
  Normal  ScalingReplicaSet  5s    deployment-controller  Scaled up replica set nginx-deployment-56f8998dbc to 3
  Normal  ScalingReplicaSet  3s    deployment-controller  Scaled down replica set nginx-deployment-54f57cf6bf to 0

   可以看到,当第一次创建 Deployment 时,它创建了一个 ReplicaSet (nginx-deployment-54f57cf6bf)并将其直接扩展至 3 个副本。更新 Deployment 时,它创建了一个新的 ReplicaSet (nginx-deployment-56f8998dbc),并将其扩展为 1,然后将旧 ReplicaSet 缩小到 2,以便至少有 2 个 Pod 可用,并且最多创建 4 个 Pod。然后,它继续向上和向下扩展新的和旧的 ReplicaSet ,具有相同的滚动更新策略。最后,将有 3 个可用的副本在新的 ReplicaSet 中,旧 ReplicaSet 将缩小到 0。



  

猜你喜欢

转载自www.cnblogs.com/minseo/p/12532336.html