K8s新手系列之初始Deployment资源

打印 上一主题 下一主题

主题 1910|帖子 1910|积分 5730

概述

官网:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/
Deployment简称deploy,Deployment 用于管理运行一个应用负载的一组 Pod,通常实用于无状态的应用。
为了更好的解决服务编排的问题,kubernetes在V1.2版本开始,引入了Deployment控制器。值得一提的是,这种控制器并不直接管理pod,而是通过管理ReplicaSet来间接管理Pod,
即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment比ReplicaSet功能更加强大。要学习ReplicaSet请检察这篇文章:K8s新手系列之ReplicaSet资源
Deployment资源不会直接创建Pod,其作用在rs资源上,基于rs管理Pod副本。

Deployment的作用

管理 Pod 的副本


  • 创建和管理 Pod 副本:Deployment 可以创建指定数量的 Pod 副本,并确保这些副本始终运行。比方,你可以通过设置 replicas 字段来指定必要运行的 Pod 数量。
  • 自动规复:假如某个 Pod 出现故障或被意外删除,Deployment 会自动创建一个新的 Pod 来替代它,从而保证应用的高可用性。
声明式更新


  • 界说期望状态:用户只必要在 Deployment 的配置文件中描述期望的状态,比方 Pod 的数量、镜像版本等,Deployment 控制器会自动将实际状态调解为期望状态。
  • 更新 Pod 模板:通过更新 Deployment 的 PodTemplateSpec,可以声明 Pod 的新状态,Deployment 会自动创建新的 ReplicaSet,并以受控速率将 Pod 从旧 ReplicaSet 迁移到新 ReplicaSet。
滚动更新和回滚


  • 滚动更新:Deployment 支持滚动更新,即在更新应用时,不会一次性替换所有 Pod,而是逐步替换,从而保证服务的连续性。你可以通过设置 maxSurge 和 maxUnavailable 参数来控制更新的节奏。
  • 回滚:假如更新后的应用出现问题,Deployment 可以方便地回滚到之前的版本。每次更新都会生成一个新的修订版本,你可以通过 kubectl rollout undo 命令回滚到指定的版本。
扩容和缩容


  • 手动扩展:你可以通过修改 Deployment 的 replicas 字段,手动增加或减少 Pod 的副本数量,以应对差别的负载需求。
  • 自动扩展:结合 Kubernetes 的程度自动扩展器(Horizontal Pod Autoscaler),Deployment 可以根据 CPU 利用率或其他自界说指标自动调解 Pod 的数量
版本管理


  • 修订版本:Deployment 会记录每次更新的修订版本,你可以通过 kubectl rollout history 检察历史版本,并通过 --revision 参数检察特定版本的详细信息
停息和规复


  • 停息更新:在更新过程中,假如必要对 PodTemplateSpec 进行多次修改,可以停息 Deployment 的更新,待修改完成后规复,从而制止频繁更新导致的问题
清算旧的 ReplicaSet


  • 自动清算:Deployment 会自动清算不再必要的旧 ReplicaSet,以节省资源。
支持多种更新策略


  • 滚动更新(RollingUpdate):这是默认的更新策略,通过逐步替换 Pod 来更新应用。
  • 重建更新(Recreate):在这种策略下,Deployment 会先删除所有旧的 Pod,然后创建新的 Pod。
比例缩放


  • 支持比例缩放:在滚动更新过程中,假如 Deployment 的副本数量发生变化,Deployment 控制器会按照比例在新旧 ReplicaSet 中分配额外的副本,以降低更新风险。
负载均衡与服务发现


  • 与 Service 集成:Deployment 通常会和 Service 共同利用。Service 为 Deployment 中的 Pod 提供了一个稳定的网络端点,将请求分发到差别的 Pod 上,实现负载均衡。
Deployment资源配置文件详解

Deployment的资源配置文件和ReplicaSet资源配置文件类似,可以通过kubectl explain deploy来检察创建Deployment的字段
示例:
  1. [root@master01 ~]# kubectl explain deploy
  2. KIND:     Deployment
  3. VERSION:  apps/v1
  4. DESCRIPTION:
  5.      Deployment enables declarative updates for Pods and ReplicaSets.
  6. # FIELDS字段中的内容已进行截取
  7. FIELDS:
  8.    apiVersion   <string>
  9.    kind <string>
  10.    metadata     <Object>
  11.    spec <Object>
  12.    status       <Object>
复制代码
通过上述可以发现界说Deployment的资源文件和界说Pod一样,也必要apiVersion、kind、metadata、spec等字段。
但是spec字段中有三个字段,必要注意,分别是replicas、selector、template。如下:
  1. [root@master01 ~]# kubectl explain deploy.spec
  2. KIND:     Deployment
  3. VERSION:  apps/v1
  4. RESOURCE: spec <Object>
  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      <integer>
  11.    #可选字段
  12.    #用于设定一个新创建的 Pod 在其所有容器都正常运行且处于就绪状态,并且没有任何容器崩溃的最短持续时间。
  13.    #默认值为0
  14.    
  15.    paused       <boolean>
  16.    #可选字段
  17.    #用于指示 Deployment 是否处于暂停状态。
  18.    #当将其设置为 true 时,Deployment 会停止创建或删除 Pod 的操作,不会再进行滚动更新等操作。
  19.    #默认值为false
  20.    progressDeadlineSeconds      <integer>
  21.      # 可选字段
  22.      #用于设定 Deployment 在被视为失败之前可以花费的最长时间。
  23.      #如果在这个时间内 Deployment 没有取得预期的进展,Deployment 控制器会继续处理该 Deployment,但会在 Deployment 的状态中显示一个 ProgressDeadlineExceeded 原因的条件。
  24.      #默认值600秒
  25.    replicas     <integer>
  26.      # 必选字段
  27.      #用于设置Pod的副本数量
  28.    revisionHistoryLimit <integer>
  29.      #可选字段
  30.      #用于指定要保留的旧 ReplicaSet 的数量,以便在需要时进行回滚操作。
  31.          #默认值为10
  32.    selector     <Object> -required-
  33.      #用于定义一个标签选择器,用于选择 Pod
  34.    strategy     <Object>
  35.      #用于指定 Deployment 在替换现有 Pod 为新 Pod 时所采用的策略
  36.      #默认值为RollingUpdate
  37.    template     <Object> -required-
  38.     #用于描述 Deployment 将会创建的 Pod 的模板。它包含了 Pod 的元数据(如标签)和规格(如容器配置)。
复制代码
创建Deployment

这里我们创建三个Pod副本
示例:
  1. # 定义资源文件
  2. [root@master01 ~/deploy]# cat deploy-nginx.yaml
  3. apiVersion: apps/v1
  4. kind: Deployment
  5. metadata:
  6.   name: deployment-nginx
  7.   namespace: default
  8. spec:
  9.   # 设置Pod的副本数量
  10.   replicas: 3
  11.   selector:
  12.     # 标签匹配规则
  13.     matchLabels:
  14.       app: nginx
  15.   template:
  16.     metadata:
  17.       name: pod-nginx
  18.       labels:
  19.         app: nginx
  20.     spec:
  21.       containers:
  22.       - name: container-nginx
  23.         image: nginx:1.14.1
  24.       restartPolicy: Always
  25.           [root@master01 ~/deploy]# cat deploy-nginx.yaml
  26. apiVersion: apps/v1
  27. kind: Deployment
  28. metadata:
  29.   name: deployment-nginx
  30.   namespace: default
  31. spec:
  32.   replicas: 3
  33.   selector:
  34.     matchLabels:
  35.       app: nginx
  36.   template:
  37.     metadata:
  38.       name: pod-nginx
  39.       labels:
  40.         app: nginx
  41.     spec:
  42.       containers:
  43.       - name: container-nginx
  44.         image: nginx:1.14.1
  45.       restartPolicy: Always
  46. # 创建deploy
  47. [root@master01 ~/deploy]# kubectl apply -f deploy-nginx.yaml
  48. deployment.apps/deployment-nginx created
  49. [root@master01 ~/deploy]# kubectl get deploy
  50. NAME               READY   UP-TO-DATE   AVAILABLE   AGE
  51. deployment-nginx   0/3     3            0           8s
  52. [root@master01 ~/deploy]# kubectl get rs
  53. NAME                          DESIRED   CURRENT   READY   AGE
  54. deployment-nginx-6d84458cd8   3         3         0       11s
  55. rs-nginx-1                    1         1         1       95m
  56. [root@master01 ~/deploy]# kubectl get po | grep pod-nginx
  57. [root@master01 ~/deploy]# kubectl get po | grep deploy
  58. deployment-nginx-6d84458cd8-8kbmf   1/1     Running            0                     41s
  59. deployment-nginx-6d84458cd8-cmsl2   1/1     Running            0                     41s
  60. deployment-nginx-6d84458cd8-qmk9m   1/1     Running            0                     41s
  61. [root@master01 ~/deploy]# kubectl apply -f deploy-nginx.yaml
  62. deployment.apps/deployment-nginx created
复制代码
检察创建成功之后对应的资源

检察deploy
  1. [root@master01 ~/deploy]# kubectl get deploy
  2. NAME               READY   UP-TO-DATE   AVAILABLE   AGE
  3. deployment-nginx   0/3     3            0           8s
复制代码
检察ReplicaSet
  1. [root@master01 ~/deploy]# kubectl get rs
  2. NAME                          DESIRED   CURRENT   READY   AGE
  3. deployment-nginx-6d84458cd8   3         3         0       11s
复制代码
检察Pod
  1. [root@master01 ~/deploy]# kubectl get po | grep deploy
  2. deployment-nginx-6d84458cd8-8kbmf   1/1     Running            0                     41s
  3. deployment-nginx-6d84458cd8-cmsl2   1/1     Running            0                     41s
  4. deployment-nginx-6d84458cd8-qmk9m   1/1     Running            0                     41s
复制代码
验证Deployment的副本管理

假如某个 Pod 出现故障或被意外删除,Deployment 会自动创建一个新的 Pod 来替代它,从而保证应用的高可用性。
我们将新创建的三个Pod都哦进行删除,检察一下会发生什么:
  1. # 删除所有的Pod
  2. [root@master01 ~/deploy]# kubectl delete po deployment-nginx-6d84458cd8-8kbmf deployment-nginx-6d84458cd8-cmsl2 deployment-nginx-6d84458cd8-qmk9m
  3. pod "deployment-nginx-6d84458cd8-8kbmf" deleted
  4. pod "deployment-nginx-6d84458cd8-cmsl2" deleted
  5. pod "deployment-nginx-6d84458cd8-qmk9m" deleted
  6. #查看deploy
  7. [root@master01 ~/deploy]# kubectl get deploy
  8. NAME               READY   UP-TO-DATE   AVAILABLE   AGE
  9. deployment-nginx   3/3     3            3           7m
  10. # 查看rs
  11. [root@master01 ~/deploy]# kubectl get rs
  12. NAME                          DESIRED   CURRENT   READY   AGE
  13. deployment-nginx-6d84458cd8   3         3         3       6m28s
  14. # 查看Pod,发现对应的数量还是3个
  15. [root@master01 ~/deploy]# kubectl get po | grep deloy
  16. [root@master01 ~/deploy]# kubectl get po | grep dep
  17. deployment-nginx-6d84458cd8-4tds2   1/1     Running            0                     20s
  18. deployment-nginx-6d84458cd8-4tzzs   1/1     Running            0                     20s
  19. deployment-nginx-6d84458cd8-l9vqv   1/1     Running            0                     20s
复制代码
假如将Replicaset资源删除会发生什么呢?
  1. # 删除rs
  2. [root@master01 ~/deploy]# kubectl delete rs deployment-nginx-6d84458cd8
  3. replicaset.apps "deployment-nginx-6d84458cd8" deleted
  4. # 查看rs,发现数量没有变化,只不过查看AGE字段发现重启了
  5. [root@master01 ~/deploy]# kubectl get rs
  6. NAME                          DESIRED   CURRENT   READY   AGE
  7. deployment-nginx-6d84458cd8   3         3         3       3s
  8. # 查看Pod,发现对应的Pod重新创建了三个
  9. [root@master01 ~/deploy]# kubectl get po | grep deploy
  10. deployment-nginx-6d84458cd8-69zg9   1/1     Running            0                 20s
  11. deployment-nginx-6d84458cd8-ljdxw   1/1     Running            0                 20s
  12. deployment-nginx-6d84458cd8-qqc48   1/1     Running            0                 20s
复制代码
验证Deployment的声明式更新和扩缩容

声明式更新表示用户只必要在 Deployment 的配置文件中描述期望的状态,比方 Pod 的数量、镜像版本等,Deployment 控制器会自动将实际状态调解为期望状态。
验证声明式更新和扩容

我们来将Pod的副本数量更改成10个,发现会发生什么呢?
  1. [root@master01 ~/deploy]# cat deploy-nginx.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   name: deployment-nginx
  6.   namespace: default
  7. spec:
  8.   # 将Pod的副本数量调整成10
  9.   replicas: 10
  10.   selector:
  11.     matchLabels:
  12.       app: nginx
  13.   template:
  14.     metadata:
  15.       name: pod-nginx
  16.       labels:
  17.         app: nginx
  18.     spec:
  19.       containers:
  20.       - name: container-nginx
  21.         image: nginx:1.14.1
  22.       restartPolicy: Always
  23. # 重新应用资源文件
  24. [root@master01 ~/deploy]# kubectl apply -f deploy-nginx.yaml
  25. deployment.apps/deployment-nginx configured
复制代码
检察一下对应的资源变化发生了什么?
  1. # 查看deploy
  2. [root@master01 ~/deploy]# kubectl get deploy
  3. NAME               READY   UP-TO-DATE   AVAILABLE   AGE
  4. deployment-nginx   10/10   10           10          15h
  5. # 查看rs
  6. [root@master01 ~/deploy]# kubectl get rs
  7. NAME                          DESIRED   CURRENT   READY   AGE
  8. deployment-nginx-6d84458cd8   10        10        10      5m1s
  9. # 查看po
  10. [root@master01 ~/deploy]# kubectl get po | grep deploy
  11. deployment-nginx-6d84458cd8-69zg9   1/1     Running            0                 5m33s
  12. deployment-nginx-6d84458cd8-6vvzt   1/1     Running            0                 40s
  13. deployment-nginx-6d84458cd8-ljdxw   1/1     Running            0                 5m33s
  14. deployment-nginx-6d84458cd8-mkhlw   1/1     Running            0                 40s
  15. deployment-nginx-6d84458cd8-pnv9x   1/1     Running            0                 40s
  16. deployment-nginx-6d84458cd8-qqc48   1/1     Running            0                 5m33s
  17. deployment-nginx-6d84458cd8-rgngt   1/1     Running            0                 40s
  18. deployment-nginx-6d84458cd8-t7nms   1/1     Running            0                 40s
  19. deployment-nginx-6d84458cd8-wllqb   1/1     Running            0                 40s
  20. deployment-nginx-6d84458cd8-wrdmc   1/1     Running            0                 40s
复制代码
通过上述发现,通过deploy扩容,deploy和rs两个资源都不会产生变化,只不外将Pod的数量达到我们界说的副本数量
验证声明式更新和缩容

同理,我们将Pod的副本数量调解成1
  1. [root@master01 ~/deploy]# cat deploy-nginx.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   name: deployment-nginx
  6.   namespace: default
  7. spec:
  8.   # 将副本数量调整成1
  9.   replicas: 1
  10.   selector:
  11.     matchLabels:
  12.       app: nginx
  13.   template:
  14.     metadata:
  15.       name: pod-nginx
  16.       labels:
  17.         app: nginx
  18.     spec:
  19.       containers:
  20.       - name: container-nginx
  21.         image: nginx:1.14.1
  22.       restartPolicy: Always
  23. # 重新应用它
  24. [root@master01 ~/deploy]# kubectl apply -f deploy-nginx.yaml
  25. deployment.apps/deployment-nginx configured
复制代码
检察一下对应的资源变化
  1. # 查看deploy
  2. [root@master01 ~/deploy]# kubectl get deploy
  3. NAME               READY   UP-TO-DATE   AVAILABLE   AGE
  4. deployment-nginx   1/1     1            1           15h
  5. # 查看rs
  6. [root@master01 ~/deploy]# kubectl get rs
  7. NAME                          DESIRED   CURRENT   READY   AGE
  8. deployment-nginx-6d84458cd8   1         1         1       10m
  9. # 查看Pod
  10. [root@master01 ~/deploy]# kubectl get po | grep deploy
  11. deployment-nginx-6d84458cd8-qqc48   1/1     Running            0                 10m
复制代码
Deployment的标签选择器

Deployment的标签选择器和Replicaset一样,分为两类,一类是等式选择器,另一类是集合选择器
等式选择器

等式选择器通过 =、==(两者含义类似)或者 != 来筛选标签。其通过spec.selector.matchLabels来实现。
示例:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: deploy-nginx
  5.   namespace: default
  6.   labels:
  7.     app: deploy-nginx
  8. spec:
  9.   replicas: 1
  10.   selector:
  11.   # 等式选择器
  12.     matchLabels:
  13.       app: nginx
  14.   template:
  15.     metadata:
  16.       name: pod-nginx
  17.       labels:
  18.         app: nginx
  19.     spec:
  20.       restartPolicy: Always
  21.       containers:
  22.       - name: nginx
  23.         image: nginx:latest
复制代码
集合选择器

集合选择器借助 in、notin、exists、DoesNotExist 这些操纵符来筛选标签。

  • in:用于选取标签值在指定集合内的 Pod。
  • notin:用于选取标签值不在指定集合内的 Pod。
  • exists:用于选取具有指定标签的 Pod,不考虑标签的值。
  • DoesNotExist:用于选取不具有指定标签的 Pod,不考虑标签的值。
其通过spec.selector.matchExpressions来实现
示例:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: nginx-Deployment-set
  5. spec:
  6.   replicas: 3
  7.   selector:
  8.    # 集合选择器
  9.     matchExpressions:
  10.         # key:指定Label的key,operator:表示操作符,value:表示Label的value
  11.       - {key: app, operator: In, values: [nginx]}
  12.       - {key: env, operator: NotIn, values: [development, testing]}
  13.   template:
  14.     metadata:
  15.       labels:
  16.         app: nginx
  17.         env: production
  18.     spec:
  19.       containers:
  20.       - name: nginx
  21.         image: nginx:1.14.2
  22.         ports:
  23.         - containerPort: 80
复制代码
管理Deployment

检察Deployment

语法:
  1. kubectl get deploy <deploy-name> -n <namespace-name>
复制代码
示例:
  1. [root@master01 ~/deploy]# kubectl get deploy
  2. NAME               READY   UP-TO-DATE   AVAILABLE   AGE
  3. deployment-nginx   1/1     1            1           15h
复制代码
修改Deployment

由两种方式,一种是通过kubectl edit rc 来进行修改,会打开一个类似vim的界面,修改其对应的值即可,最后wq保存即可应用你的配置.
另一种方式则是修改对应的资源文件,最后利用kubectl apply -f 即可。
删除Deployment

删除Deployment时会删除对应的ReplicaSet和Pod,删除时请谨慎!!!
语法:
  1. kubectl delete rc <rc-name> -n <namespace-name>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

河曲智叟

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表