十年河东,十年河西,莫欺少年穷
学无止境,精益求精
1、Pod控制器介绍
- 在kubernetes中,按照Pod的创建方式可以将其分为两类:
- 自主式Pod:kubernetes直接创建出来的Pod,这种Pod删除后就没有了,也不会重建。
- Pod控制器:Pod控制器是管理Pod的中间层,使用了Pod控制器之后,我们只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它就会创建出满足条件的Pod并确保每一个Pod处于用户期望的状态,如果Pod在运行中出现故障,控制器会基于指定的策略重启或重建Pod。
- 在kubernetes中,有很多类型的Pod控制器,每种都有自己的适合的场景,常见的有下面这些:
- ReplicationController:比较原始的Pod控制器,已经被废弃,由replicaset替代。
- replicaset:保证指定数量的Pod运行,并支持Pod数量变更,镜像版本变更。
- Deployment:通过控制replicaset来控制Pod,并支持滚动升级、版本回退。
- DaemonSet:在集群中的指定Node上都运行一个副本,一般用于守护进程类的任务。
- Job:它创建出来的Pod只要完成任务就立即退出,用于执行一次性任务。
- CronJob:它创建的Pod会周期性的执行,用于执行周期性的任务。
- StatefulSet:管理有状态的应用
Deployment(Deploy)
- 为了更好的解决服务编排的问题,kubernetes在v1.2版本开始,引入了Deployment控制器。值得一提的是,Deployment控制器并不直接管理Pod,而是通过管理replicaset来间接管理Pod,即:Deployment管理replicaset,replicaset管理Pod。所以Deployment的功能比replicaset强大。
- Deployment的主要功能如下:
- 支持replicaset的所有功能。
- 支持发布的停止、继续。
- 支持版本滚动更新和版本回退。
- Deployment的资源清单:
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: 80View Code
创建Deployment
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
查看dev命名空间下的replicaset 和 Pod
kubectl get rs,pod -n dev -o wide
Deployment 的扩缩容
命令模式:
kubectl scale deploy pc-deployment --replicas=5 -n dev
编辑模式:
kubectl edit deployment pc-deployment -n dev
Deployment 的镜像更新
Deployment的镜像更新支持两种模式的策略,分别为:重建更新、滚动更新
重建更新:在创建出新的Pod之前会先杀掉所有已经存在的Pod
滚动更新:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本的Pod
重建更新
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
滚动更新
编辑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 --再次查看
Ttpe 已更新为滚动更新,且maxSurge 和 另一个参数已重置为默认值
kubectl get rs -n dev
# 查看rs,发现原来的rs依旧存在,只是Pod的数量变为0,而后又产生了一个rs,Pod的数量变为3@H_502_247@# 其实这就是deployment能够进行版本回退的奥妙所在,该奥妙可用于版本回退。
版本回退
# 版本升级相关功能 kubetl rollout 参数 deploy xx # 支持下面的选择 # status 显示当前升级的状态 # history 显示升级历史记录 # pause 暂停版本升级过程 # resume 继续已经暂停的版本升级过程 # restart 重启版本升级过程 # undo 回滚到上一级版本 (可以使用--to-revision回滚到指定的版本)
查看当前升级版本的状态
kubectl rollout status deployment pc-deployment -n dev
会返回成功或失败
- 查看升级历史记录:
kubectl rollout history deployment pc-deployment -n dev
历史记录了两个版本,最新版本为 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
一旦执行了回退,回退到的目标版本就变成了新的版本,因此,版本3 就是 未回退时的版本 1
@天才卧龙的波尔克
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。