写在前面:如有问题,以你为准,
目前24年应届生,各位大佬轻喷,部分资料与图片来自网络
内容较长,页面右上角目录方便跳转
Pod控制器 概述
Pod控制器:Pod控制器是管理Pod的中间层,使用了Pod控制器之后,我们只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它就会创建出满足条件的Pod并确保每一个Pod处于用户期望的状态,如果Pod在运行中出现故障,控制器会基于指定的策略重启或重建Pod
- 在kubernetes中,按照Pod的创建方式可以将其分为两类:
- 在kubernetes中,有很多类型的Pod控制器,每种都有自己的适合的场景,常见的有下面这些:
- ReplicationController:比较原始的Pod控制器,已经被废弃,由ReplicaSet替代。
- ReplicaSet:保证指定数量的Pod运行,并支持Pod数量变更,镜像版本变更。
- Deployment:通过控制ReplicaSet来控制Pod,并支持滚动升级、版本回退。
- Horizontal Pod Autoscaler:可以根据集群负载自动调整Pod的数量,实现削峰填谷。
- DaemonSet:在集群中的指定Node上都运行一个副本,一般用于守护进程类的任务,新加进来node,DaemonSet会立刻在这个node上运行一个副本
- Job:它创建出来的Pod只要完成任务就立即退出,用于执行一次性任务。
- CronJob:它创建的Pod会周期性的执行,用于执行周期性的任务。
- StatefulSet:管理有状态的应用,即按顺序创建,按顺序删除。
其中最常见的是Deployment控制器,其拥有RS和RC的全部功能并且更有滚动升级、版本回退
ReplicaSet(RS)
ReplicaSet的主要作用是保证一定数量的Pod能够正常运行,它会持续监听这些Pod的运行状态,一旦Pod发生故障,就会重启或重建。同时它还支持对Pod数量的扩缩容和镜像更新(后续出现的新pod副本才会使用更新后的镜像,更改后现有的pod不会进行更改)
整体 yaml 解析
apiVersion: apps/v1 # 版本号
kind: ReplicaSet # 类型
metadata: # 元数据
name: # rs名称
namespace: # 所属命名空间
labels: #标签
controller: rs
spec: # 详情描述
replicas: 3 # 副本数量
selector: # 选择器,通过它指定该控制器管理哪些po
matchLabels: # Labels匹配规则
app: nginx-pod
matchExpressions: # Expressions匹配规则
- {key: app, operator: In, values: [nginx-pod]}
template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本,其实就是 pod 配置项
metadata:
labels:
app: nginx-pod # 用于连接上面pod控制器的标签选择器
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
创建
---
apiVersion: v1
kind: Namespace
metadata:
name: study
---
apiVersion: apps/v1 # 版本号
kind: ReplicaSet # 类型
metadata: # 元数据
name: pc-replicaset # rs名称
namespace: study # 命名类型
spec: # 详细描述
replicas: 3 # 副本数量
selector: # 选择器,通过它指定该控制器可以管理哪些Pod
matchLabels: # Labels匹配规则
app: nginx-pod
template: # 模块 当副本数据不足的时候,会根据下面的模板创建Pod副本
metadata:
labels:
app: nginx-pod # 用于连接上面pod控制器的标签选择器
spec:
containers:
- name: nginx # 容器名称
image: nginx:1.17.1 # 容器需要的镜像地址
ports:
- containerPort: 80 # 容器所监听的端口
[root@master k8s]# kubectl apply -f controller.yaml
namespace/study unchanged
replicaset.apps/pc-replicaset created
[root@master k8s]# kubectl get rs -n study -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-replicaset 3 3 3 80s nginx nginx:1.17.1 app=nginx-pod
# DESIRED CURRENT READY
# 期望副本数 当前副本数 准备好的副本数(即Pod状态为runing)
# 查看当前控制器创建出来的Pod(控制器创建出来的Pod的名称是在控制器名称后面拼接了-xxx随机码
[root@master k8s]# kubectl get pod -n study -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pc-replicaset-7rtzq 1/1 Running 0 3m35s 10.244.104.21 node2 <none> <none>
pc-replicaset-ksmlh 1/1 Running 0 3m35s 10.244.104.20 node2 <none> <none>
pc-replicaset-prsl7 1/1 Running 0 3m35s 10.244.104.19 node2 <none> <none>
扩缩容
[root@master k8s]# kubectl scale rs -n study pc-replicaset --replicas=4
replicaset.apps/pc-replicaset scaled
[root@master k8s]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
pc-replicaset-5l8db 1/1 Running 0 27s
pc-replicaset-7rtzq 1/1 Running 0 8m49s
pc-replicaset-ksmlh 1/1 Running 0 8m49s
pc-replicaset-x2hn8 1/1 Running 0 32s
[root@master k8s]# kubectl get rs -n study
NAME DESIRED CURRENT READY AGE
pc-replicaset 4 4 4 11m
使用 edit 命令编辑 yaml spec.replicas 字段
[root@master k8s]# kubectl edit rs -n study pc-replicaset
replicaset.apps/pc-replicaset edited
[root@master k8s]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
pc-replicaset-7rtzq 1/1 Running 0 7m25s
pc-replicaset-ksmlh 1/1 Running 0 7m25s
[root@master k8s]# kubectl get rs -n study
NAME DESIRED CURRENT READY AGE
pc-replicaset 2 2 2 11m
[root@master k8s]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
pc-replicaset-7rtzq 1/1 Running 0 16m
pc-replicaset-ksmlh 1/1 Running 0 16m
[root@master k8s]# vim controller.yaml
[root@master k8s]# kubectl apply -f controller.yaml
namespace/study unchanged
replicaset.apps/pc-replicaset configured
[root@master k8s]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
pc-replicaset-7rtzq 1/1 Running 0 19m
pc-replicaset-g4wmg 1/1 Running 0 10s
pc-replicaset-ksmlh 1/1 Running 0 19m
[root@master k8s]# kubectl get rs -n study
NAME DESIRED CURRENT READY AGE
pc-replicaset 3 3 3 19m
镜像更新
注意:后续出现的新pod副本才会使用更新后的镜像,更改后现有的pod不会进行更改
# # 从 1.17.1 改到 1.17.1
[root@master k8s]# kubectl set image rs pc-replicaset nginx=nginx:1.17.2 -n test
replicaset.apps/pc-replicaset image updated
[root@master k8s]# kubectl get rs -n study -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-replicaset 3 3 3 26m nginx nginx:1.17.2 app=nginx-pod
使用 edit 命令编辑 yaml spec.template.spec.containers.image 字段
# 从 1.17.1 改到 1.17.1
[root@master k8s]# kubectl edit rs -n study
replicaset.apps/pc-replicaset edited
[root@master k8s]# kubectl get rs -n study -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-replicaset 3 3 3 26m nginx nginx:1.17.2 app=nginx-pod
vim 编辑 yaml yaml spec.template.spec.containers.image 字段
# 从 1.17.1 改到 1.17.1
[root@master k8s]# kubectl apply -f controller.yaml
namespace/study unchanged
replicaset.apps/pc-replicaset configured
[root@master k8s]# kubectl get rs -n study -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-replicaset 3 3 3 26m nginx nginx:1.17.2 app=nginx-pod
删除
在kubernetes删除ReplicaSet前,会将ReplicaSet的replicas调整为0,等到所有的Pod被删除后,再执行ReplicaSet对象的删除
两种方式:delete rs 和 delete -f yaml(推荐)
kubectl delete rs pc-replicaset -n study
#如果希望仅仅删除ReplicaSet控制器(保留现有Pod)、
#只需要在使用kubectl delete rs命令的时候添加--cascade=false选项(不推荐)
kubectl delete rs pc-replicaset -n study--cascade=false
kubectl delete -f controller.yaml
Deployment(Deploy)
kubernetes在v1.2版本开始,引入了Deployment控制器
Deployment控制器并不直接管理Pod,而是通过管理ReplicaSet来间接管理Pod,即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment的功能比ReplicaSet强大
但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。
Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。
命令行实操
[root@master k8s]# kubectl create deployment nginx -n default --image=nginx:1.8 --replicas=2
deployment.apps/nginx created
[root@master k8s]# kubectl get deployment -n default
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 2/2 2 2 69m
# kubectl describe deployments.apps -n default 查看详细信息
[root@master k8s]# kubectl scale deployment nginx --replicas=4 -n default
deployment.apps/nginx scaled
[root@master k8s]# kubectl get deployment -n default
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 4/4 4 4 70m
[root@master k8s]# kubectl delete deployment -n default nginx
deployment.apps "nginx" deleted
[root@master k8s]# kubectl get pod -n default
No resources found in default namespace.
整体 yaml 解析
revisionHistoryLimit: 保留镜像版本,用于版本回退
paused: 部署成功后是否不立即创建pod,false就是立即创建
strategy: 设置镜像更新的策略,两种
RollingUpdate: 滚动更新 使用rolling用新的复制集替换旧的复制集
更新,
即逐步缩小旧的复制集,并扩大新的复制集
Recreate: 重建更新 在创建新的pod之前先杀死所有现有的pod
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 的最大值,可以为百分比,也可以为整数
maxUnavailable: 30% # 最大不可用状态的Pod的最大值,可以为百分比,也可以为整数
selector: # 选择器,通过它指定该控制器管理哪些pod
matchLabels: # Labels 匹配规则