0
点赞
收藏
分享

微信扫一扫

kuberbeters、Pod 控制器Deployment

十年河东,十年河西,莫欺少年穷

学无止境,精益求精

1、Pod控制器介绍

  • 在kubernetes中,按照Pod的创建方式可以将其分为两类:
  • 自主式Pod:kubernetes直接创建出来的Pod,这种Pod删除后就没有了,也不会重建。
  • 控制器创建Pod:通过Pod控制器创建的Pod,这种Pod删除之后还会自动重建。
  • Pod控制器:Pod控制器是管理Pod的中间层,使用了Pod控制器之后,我们只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它就会创建出满足条件的Pod并确保每一个Pod处于用户期望的状态,如果Pod在运行中出现故障,控制器会基于指定的策略重启或重建Pod。
  • 在kubernetes中,有很多类型的Pod控制器,每种都有自己的适合的场景,常见的有下面这些:
  • ReplicationController:比较原始的Pod控制器,已经被废弃,由ReplicaSet替代。
  • ReplicaSet:保证指定数量的Pod运行,并支持Pod数量变更,镜像版本变更。
  • Deployment:通过控制ReplicaSet来控制Pod,并支持滚动升级、版本回退。
  • Horizontal Pod Autoscaler:可以根据集群负载自动调整Pod的数量,实现削峰填谷。
  • DaemonSet:在集群中的指定Node上都运行一个副本,一般用于守护进程类的任务。
  • Job:它创建出来的Pod只要完成任务就立即退出,用于执行一次性任务。
  • CronJob:它创建的Pod会周期性的执行,用于执行周期性的任务。
  • StatefulSet:管理有状态的应用

Deployment(Deploy)

  • 为了更好的解决服务编排的问题,kubernetes在v1.2版本开始,引入了Deployment控制器。值得一提的是,Deployment控制器并不直接管理Pod,而是通过管理ReplicaSet来间接管理Pod,即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment的功能比ReplicaSet强大。

kuberbeters、Pod 控制器Deployment_版本升级

  • Deployment的主要功能如下:
  • 支持ReplicaSet的所有功能。
  • 支持发布的停止、继续。
  • 支持版本滚动更新和版本回退。
  • Deployment的资源清单:

kuberbeters、Pod 控制器Deployment_版本升级_02kuberbeters、Pod 控制器Deployment_版本回退_03

apiVersion: apps/v1 # 版本号 
kind: Deployment # 类型
metadata: # 元数据
name: # rs名称
namespace: # 所属命名空间
labels: #标签
controller: deploy
spec: # 详情描述
replicas: 3 # 副本数量
revisionHistoryLimit: 3 # 保留历史版本,默认为10
paused: false # 暂停部署,默认是false
progressDeadlineSeconds: 600 # 部署超时时间(s),默认是600
strategy: # 策略
type: RollingUpdate # 滚动更新策略
rollingUpdate: # 滚动更新
maxSurge: 30% # 最大额外可以存在的副本数,可以为百分比,也可以为整数 maxUnavailable: 30% # 最大不可用状态的 Pod 的最大值,可以为百分比,也可以为整数
selector: # 选择器,通过它指定该控制器管理哪些pod
matchLabels: # Labels匹配规则
app: nginx-pod
matchExpressions: # Expressions匹配规则
- {key: app, operator: In, values: [nginx-pod]}
template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80

View Code

创建Deployment

  • 创建pc-deployment.yaml文件,内容如下:

apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
metadata: # 元数据
name: pc-deployment # deployment的名称
namespace: dev # 命名类型
spec: # 详细描述
replicas: 3 # 副本数量
selector: # 选择器,通过它指定该控制器可以管理哪些Pod
matchLabels: # Labels匹配规则
app: nginx-pod
template: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx # 容器名称
image: nginx:1.17.1 # 容器需要的镜像地址
ports:
- containerPort: 80 # 容器所监听的端口

执行yaml文件

kubectl create -f pc-deployment.yaml

创建成功后,查看该Deployment 

kubectl get deploy pc-deployment -n dev -o wide

kuberbeters、Pod 控制器Deployment_版本升级_04

 查看dev命名空间下的ReplicaSet 和 Pod

kubectl get rs,pod -n dev -o wide

kuberbeters、Pod 控制器Deployment_nginx_05

 

 Deployment 的扩缩容 

命令模式:

kubectl scale deploy pc-deployment --replicas=5 -n dev

编辑模式:

kubectl edit deployment pc-deployment -n dev

kuberbeters、Pod 控制器Deployment_版本升级_06

Deployment 的镜像更新

Deployment的镜像更新支持两种模式的策略,分别为:重建更新、滚动更新

重建更新:在创建出新的Pod之前会先杀掉所有已经存在的Pod

滚动更新:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本的Pod

重建更新

  • 编辑pc-deployment.yaml文件,在spec节点下添加更新策略strategy

apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
metadata: # 元数据
name: pc-deployment # deployment的名称
namespace: dev # 命名类型
spec: # 详细描述
replicas: 3 # 副本数量
strategy: # 镜像更新策略
type: Recreate # Recreate:在创建出新的Pod之前会先杀掉所有已经存在的Pod
selector: # 选择器,通过它指定该控制器可以管理哪些Pod
matchLabels: # Labels匹配规则
app: nginx-pod
template: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx # 容器名称
image: nginx:1.17.1 # 容器需要的镜像地址
ports:
- containerPort: 80 # 容器所监听的端口

更新Depolyment 

kubectl apply -f pc-deployment.yaml

更新成功后,可通过命令模式  

命令模式:

kubectl set image deployment pc-deployment nginx=nginx:1.17.2 -n dev

编辑模式 【直接编辑的是Deployment】:

kubectl edit deployment pc-deployment -n dev

kuberbeters、Pod 控制器Deployment_版本升级_07

滚动更新

编辑pc-deployment.yaml文件,在spec节点下添加更新策略

apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
metadata: # 元数据
name: pc-deployment # deployment的名称
namespace: dev # 命名类型
spec: # 详细描述
replicas: 3 # 副本数量
strategy: # 镜像更新策略
type: RollingUpdate # RollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本的Pod
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
selector: # 选择器,通过它指定该控制器可以管理哪些Pod
matchLabels: # Labels匹配规则
app: nginx-pod
template: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx # 容器名称
image: nginx:1.17.1 # 容器需要的镜像地址
ports:
- containerPort: 80 # 容器所监听的端口

更新deploy

kubectl apply -f pc-deployment.yaml

通过命令更新镜像

kubectl set image deployment pc-deployment nginx=nginx:1.17.3 -n dev

也可以直接编辑Deploy文件

kubectl edit deployment pc-deployment -n dev

编辑更新镜像策略为:RollingUpdate

strategy: # 镜像更新策略
type: RollingUpdate # RollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本的Pod

wq报错后,再次查看Deploy

kubectl edit deployment pc-deployment -n dev   --再次查看

kuberbeters、Pod 控制器Deployment_版本回退_08

 

 Ttpe 已更新为滚动更新,且maxSurge 和 另一个参数已重置为默认值

查看ReplicaSet

kubectl get rs -n dev

# 查看rs,发现原来的rs依旧存在,只是Pod的数量变为0,而后又产生了一个rs,Pod的数量变为3
# 其实这就是deployment能够进行版本回退的奥妙所在,该奥妙可用于版本回退。

kuberbeters、Pod 控制器Deployment_nginx_09

版本回退

  • Deployment支持版本升级过程中的暂停、继续功能以及版本回退等诸多功能,下面具体来看:

# 版本升级相关功能
kubetl rollout 参数 deploy xx # 支持下面的选择
# status 显示当前升级的状态
# history 显示升级历史记录
# pause 暂停版本升级过程
# resume 继续已经暂停的版本升级过程
# restart 重启版本升级过程
# undo 回滚到上一级版本 (可以使用--to-revision回滚到指定的版本)

查看当前升级版本的状态

kubectl rollout status deployment pc-deployment -n dev

会返回成功或失败

kuberbeters、Pod 控制器Deployment_版本回退_10

  • 查看升级历史记录:

kubectl rollout history deployment pc-deployment -n dev

kuberbeters、Pod 控制器Deployment_版本升级_11

 

 历史记录了两个版本,最新版本为 2 

  • 版本回退:

# 可以使用-to-revision=1回退到1版本,如果省略这个选项,就是回退到上个版本,即2版本
kubectl rollout undo deployment pc-deployment --to-revision=1 -n dev

deployment之所以能够实现版本的回退,就是通过记录下历史的ReplicaSet来实现的,一旦想回滚到那个版本,只需要将当前版本的Pod数量降为0,然后将回退版本的Pod提升为目标数量即可。

执行回退后,再次查看历史记录版本号

kubectl rollout history deployment pc-deployment -n dev

kuberbeters、Pod 控制器Deployment_版本回退_12

 

 一旦执行了回退,回退到的目标版本就变成了新的版本,因此,版本3 就是 未回退时的版本 1

@天才卧龙的波尔克

​​只爱少妇​​

举报

相关推荐

0 条评论