写在前面:如有问题,以你为准,
目前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 匹配规则
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
创建
---
apiVersion: v1
kind: Namespace
metadata:
name: study
---
apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
metadata: # 元数据
name: pc-deployment # deployment的名称
namespace: study # 命名类型
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 # 容器所监听的端口
[root@master k8s]# kubectl apply -f controller.yaml
namespace/study created
deployment.apps/pc-deployment created
扩缩容
[root@master k8s]# kubectl scale deploy pc-deployment --replicas=5 -n study
deployment.apps/pc-deployment scaled
[root@master k8s]# kubectl get deployments.apps -n study
NAME READY UP-TO-DATE AVAILABLE AGE
pc-deployment 5/5 5 5 32m
使用 edit 命令编辑 yaml spec.replicas 字段
[root@master k8s]# kubectl edit deployment pc-deployment -n study
deployment.apps/pc-deployment edited
[root@master k8s]# kubectl get deployments.apps -n study
NAME READY UP-TO-DATE AVAILABLE AGE
pc-deployment 3/3 3 3 33m
[root@master k8s]# vim controller.yaml
[root@master k8s]# kubectl apply -f controller.yaml
namespace/study unchanged
deployment.apps/pc-deployment configured
[root@master k8s]# kubectl get deployments.apps -n study
NAME READY UP-TO-DATE AVAILABLE AGE
pc-deployment 1/1 1 1 35m
镜像更新
首先deploy创建时候会创建相应的rs,如果进行版本更新,那么会根据新的镜像来创建新的RS,逐渐将新的rs副本数拉大,将旧的rs副本数了拉小,最终旧的为0,新的为最大值,此时为更新完成,旧的不会删除,用于实现版本回退
# 版本升级相关功能
kubetl rollout 参数 deploy <deploy-name> # 支持下面的选择
# status 显示当前升级的状态
# history 显示升级历史记录
# undo 回滚到上一级版本 (可以使用--to-revision回滚到指定的版本)
# pause 暂停版本升级过程
# resume 继续已经暂停的版本升级过程
# restart 重启版本升级过程
# history 中显示 CHANGE-CAUSE 是创建使用的命令,
# 需要再创建命令哪里输入 --record
重建更新和滚动更新(默认),可以通过strategy选项进行配置
strategy: 指定新的Pod替代旧的Pod的策略,支持两个属性
type: 指定策略类型,支持两种策略
Recreate:在创建出新的Pod之前会先杀掉所有已经存在的Pod
RollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本的Pod
rollingUpdate:当type为RollingUpdate的时候生效,用于为rollingUpdate设置参数,支持两个属性:
# 最大杀死多少老的,最大开启多少新的
maxUnavailable:用来指定在升级过程中不可用的Pod的最大数量,默认为25%。 如果有8个pod,先干掉2个
maxSurge: 用来指定在升级过程中可以超过期望的Pod的最大数量,默认为25%。如果有8个pod,先启动2个
重建更新
apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
metadata: # 元数据
name: pc-deployment # deployment的名称
namespace: study # 命名类型
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 # 容器所监听的端口
# 持续查看更新过程
kubectl get pod -n study -w
[root@master k8s]# kubectl apply -f controller.yaml
deployment.apps/pc-deployment created
[root@master k8s]# kubectl get deployments.apps -n study
NAME READY UP-TO-DATE AVAILABLE AGE
pc-deployment 3/3 3 3 6s
[root@master k8s]# kubectl set image deployment pc-deployment nginx=nginx:1.17.2 -n study
deployment.apps/pc-deployment image updated
[root@master k8s]# kubectl rollout status deploy pc-deployment -n study
Waiting for deployment "pc-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
[root@master k8s]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
pc-deployment-6697bc6f84-5nq4d 0/1 ContainerCreating 0 1s
pc-deployment-6697bc6f84-s7zqn 0/1 Pending 0 1s
pc-deployment-6697bc6f84-t9z5w 0/1 Pending 0 1s
[root@master k8s]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
pc-deployment-6697bc6f84-5nq4d 0/1 ContainerCreating 0 2s
pc-deployment-6697bc6f84-s7zqn 0/1 ContainerCreating 0 2s
pc-deployment-6697bc6f84-t9z5w 0/1 ContainerCreating 0 2s
滚动更新
apiVersion: apps/v1 # 版本号
kind: Deployment # 类型
metadata: # 元数据
name: pc-deployment # deployment的名称
namespace: study # 命名类型
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 # 容器所监听的端口
# 持续查看更新过程
kubectl get pod -n study -w
[root@master k8s]# kubectl apply -f controller.yaml
deployment.apps/pc-deployment created
[root@master k8s]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
pc-deployment-6bb9d9f778-94wzr 1/1 Running 0 7s
pc-deployment-6bb9d9f778-rdxc7 1/1 Running 0 7s
pc-deployment-6bb9d9f778-v4gb6 1/1 Running 0 7s
[root@master k8s]# kubectl set image deployment pc-deployment nginx=nginx:1.17.3 -n study
deployment.apps/pc-deployment image updated
#观察更新状态
[root@master k8s]# kubectl rollout status deploy pc-deployment -n study
Waiting for deployment "pc-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
[root@master k8s]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
pc-deployment-6697bc6f84-sxjnp 0/1 ContainerCreating 0 2s
pc-deployment-6bb9d9f778-94wzr 1/1 Running 0 2m47s
pc-deployment-6bb9d9f778-rdxc7 1/1 Running 0 2m47s
pc-deployment-6bb9d9f778-v4gb6 1/1 Running 0 2m47s
[root@master k8s]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
pc-deployment-6697bc6f84-sxjnp 1/1 Running 0 4s
pc-deployment-6697bc6f84-z7dqc 0/1 ContainerCreating 0 1s
pc-deployment-6bb9d9f778-94wzr 1/1 Running 0 2m49s
pc-deployment-6bb9d9f778-v4gb6 1/1 Running 0 2m49s
[root@master k8s]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
pc-deployment-6697bc6f84-5skdv 1/1 Running 0 3s
pc-deployment-6697bc6f84-sxjnp 1/1 Running 0 8s
pc-deployment-6697bc6f84-z7dqc 1/1 Running 0 5s
查看rs,发现原来的rs依旧存在,只是Pod的数量变为0,而后又产生了一个rs,Pod的数量变为3
版本回退
Deployment支持版本升级过程中的暂停、继续功能以及版本回退等诸多功
deployment之所以能够实现版本的回退,就是通过记录下历史的ReplicaSet来实现的,一旦想回滚到那个版本,只需要将当前版本的Pod数量降为0,然后将回退版本的Pod提升为目标数量即可(镜像更新rs的变化就相反)
# 查看之前或回退前最新版本
[root@master k8s]# kubectl get rs -n study
NAME DESIRED CURRENT READY AGE
pc-deployment-6697bc6f84 0 0 0 8m18s
pc-deployment-6bb9d9f778 3 3 3 11m
[root@master k8s]# kubectl describe rs -n study pc-deployment-6697bc6f84
Containers:
nginx:
Image: nginx:1.17.3
# 版本升级相关功能
kubetl rollout 参数 deploy <deploy-name> # 支持下面的选择
# status 显示当前升级的状态
# history 显示升级历史记录
# undo 回滚到上一级版本 (可以使用--to-revision回滚到指定的版本)
# pause 暂停版本升级过程
# resume 继续已经暂停的版本升级过程
# restart 重启版本升级过程
# history 中显示 CHANGE-CAUSE 是创建使用的命令,
# 需要再创建命令哪里输入 --record
[root@master k8s]# kubectl rollout status deployment pc-deployment -n study
deployment "pc-deployment" successfully rolled out
[root@master k8s]# kubectl rollout history deployment pc-deployment -n study
deployment.apps/pc-deployment
REVISION CHANGE-CAUSE
1 <none>
2 <none>
# 版本回退
[root@master k8s]# kubectl get deploy -n study -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
pc-deployment 3/3 3 3 8m23s nginx nginx:1.17.3 app=nginx-pod
[root@master k8s]# kubectl rollout undo deployment -n study pc-deployment --to-revision=1
deployment.apps/pc-deployment rolled back
[root@master k8s]# kubectl get deploy -n study -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
pc-deployment 3/3 2 3 9m5s nginx nginx:1.17.1 app=nginx-pod
# 1 版本就没了,因为3版本就是1版本
[root@master k8s]# kubectl rollout history deployment pc-deployment -n study
deployment.apps/pc-deployment
REVISION CHANGE-CAUSE
3 <none>
2 <none>
金丝雀发布
Deployment控制器支持控制更新过程中的控制,如“暂停(pause)”或“继续(resume)”更新操作
比如有一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。然后,再筛选一小部分的用户请求路由到新版本的Pod应用,继续观察能否稳定地按期望的方式运行。确定没问题之后再继续完成余下的Pod资源滚动更新,否则立即回滚更新操作。这就是所谓的金丝雀发布
# 更新deployment的版本,并配置暂停deployment
[root@master k8s]# kubectl set image deploy pc-deployment nginx=nginx:1.17.5 -n study && kubectl rollout pause deployment pc-deployment -n study
deployment.apps/pc-deployment paused
# 观察更新状态
[root@master k8s]# kubectl rollout status deploy pc-deployment -n study
Waiting for deployment "pc-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
# # 监控更新的过程,可以看到已经新增了一个资源,但是并未按照预期的状态去删除一个旧的资源,就是因为使用了pause暂停命令
# 查看 rs,下面的显示的都可以回退
[root@master k8s]# kubectl get rs -o wide -n study
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-deployment-55878c67d9 3 3 3 5m58s nginx nginx:1.17.4 app=nginx-pod,pod-template-hash=55878c67d9
pc-deployment-649d477dd6 1 1 1 55s nginx nginx:1.17.5 app=nginx-pod,pod-template-hash=649d477dd6
pc-deployment-6697bc6f84 0 0 0 26m nginx nginx:1.17.3 app=nginx-pod,pod-template-hash=6697bc6f84
pc-deployment-6bb9d9f778 0 0 0 28m nginx nginx:1.17.1 app=nginx-pod,pod-template-hash=6bb9d9f778
# 注意rs部分的随机码,被粘贴了所以有4个
[root@master k8s]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
pc-deployment-55878c67d9-qb9js 1/1 Running 0 8m42s
pc-deployment-55878c67d9-sltxw 1/1 Running 0 8m19s
pc-deployment-55878c67d9-xh8sb 1/1 Running 0 8m15s
pc-deployment-649d477dd6-q72pg 1/1 Running 0 3m39s
# 此时观察业务是否有问题,新的pod能否正常接受流量(重点)
# 重新启动更新
[root@master k8s]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
pc-deployment-55878c67d9-sltxw 1/1 Running 0 9m23s
pc-deployment-55878c67d9-xh8sb 1/1 Running 0 9m19s
pc-deployment-649d477dd6-pphwk 0/1 ContainerCreating 0 2s
pc-deployment-649d477dd6-q72pg 1/1 Running 0 4m43s
[root@master k8s]# kubectl get rs -o wide -n study
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
pc-deployment-55878c67d9 0 0 0 9m51s nginx nginx:1.17.4 app=nginx-pod,pod-template-hash=55878c67d9
pc-deployment-649d477dd6 3 3 3 4m48s nginx nginx:1.17.5 app=nginx-pod,pod-template-hash=649d477dd6
pc-deployment-6697bc6f84 0 0 0 29m nginx nginx:1.17.3 app=nginx-pod,pod-template-hash=6697bc6f84
pc-deployment-6bb9d9f778 0 0 0 32m nginx nginx:1.17.1 app=nginx-pod,pod-template-hash=6bb9d9f778
[root@master k8s]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
pc-deployment-649d477dd6-pphwk 1/1 Running 0 17s
pc-deployment-649d477dd6-q72pg 1/1 Running 0 4m58s
pc-deployment-649d477dd6-xf2fw 1/1 Running 0 15s
删除
kubectl delete -f pc-deployment.yaml
kubectl delete deploy -n study pc-deployment
HPA (Horizontal Pod Autoscaler)
kubectl scale命令实现Pod的扩缩容,但是这显然不符合kubernetes的定位目标–自动化和智能化。kubernetes期望可以通过监测Pod的使用情况,实现Pod数量的自动调整,于是就产生了HPA这种控制器。
HPA可以获取每个Pod的利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现Pod的数量的调整。其实HPA和之前的Deployment一样,也属于一种kubernetes资源对象,它通过追踪分析目标Pod的负载变化情况,来确定是否需要针对性的调整目标Pod的副本数
metrics-server 安装
metrics-server可以用来收集集群中的资源使用情况,搭配HPA Pod控制器使用
安装教程kubernetes 部署 metrics-server(HPA)-CSDN博客
创建 Deploy 和 Service
---
apiVersion: v1
kind: Namespace
metadata:
name: study
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: stuy
spec: # 详细描述
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 # 容器所监听的端口
resources: # 资源限制
requests:
cpu: "100m" # 100m表示100millicpu,即0.1个CPU
[
root@master k8s]# kubectl apply -f controller.yaml
namespace/study configured
deployment.apps/nginx-deployment configured
[root@master k8s]# kubectl get deployments.apps -n study
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 1/1 1 1 66s
[root@master k8s]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
nginx-deployment-55c9d4fbb5-mklv5 1/1 Running 0 6s
create Service
kubectl expose deployment -n study nginx-deployment --name=nginx --type=NodePort --port=80 --target-port=80
[root@master k8s]# kubectl expose deployment -n study nginx-deployment --name=nginx --type=NodePort --port=80 --target-port=80
service/nginx exposed
[root@master k8s]# kubectl get svc -n study
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx NodePort 10.104.236.152 <none> 80:32260/TCP 43s
部署HPA
命令行操作
kubectl autoscale deployment -n study nginx-deployment --cpu-percent=50 --min=1 --max=10
# pod 副本数量区间为 1-10
# cpu 平均利用率为 50 则扩容
yaml 编写
maxReplicas -required-: 自动缩放器可以扩的最大规模。它不能少于minReplicas
minReplicas:自动缩放器可以扩的最小规模,默认为 1
metrics: 默认指标
将设置为80% 平均CPU利用率
type -required-: 以那个目标为缩放条件 "ContainerResource",
"External", "Object", "Pods" or "Resource"
resource: # 目标为cpu或内存利用率
name: <cpu 或 memory> -required-
target -required-:
type -required-: Utilization, Value, or
AverageValue
averageUtilization: 对目标值设置平均利用值,到达就进行扩缩
scaleTargetRef -required-: 指向要缩放的目标资源,并用于
应该收集指标的pod,以及实际更改的pod
副本计数 (用来指定对应的deployment)
apiVersion: autoscaling/v2 # 版本号
kind: HorizontalPodAutoscaler # 类型
metadata: # 元数据
name: pc-hpa # deployment的名称
namespace: study # 命名类型
spec:
minReplicas: 1 # 最小Pod数量
maxReplicas: 10 # 最大Pod数量
metrics:
- type: Resource
resource:
name: cpu
target:
averageUtilization: 50
type: Utilization
scaleTargetRef: # 连接 deployment 目标
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
[root@master k8s]# kubectl get hpa -n study
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
pc-hpa Deployment/nginx-deployment <unknown>/50% 1 10 0 14s
# 过小段时间
[root@master k8s]# kubectl get hpa -n study
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
pc-hpa Deployment/nginx-deployment 0%/50% 1 10 1 67s
[root@master ~]# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master 309m 15% 2372Mi 62%
node1 102m 5% 1283Mi 33%
node2 114m 5% 1430Mi 37%
[root@master ~]# kubectl top pod -n study
NAME CPU(cores) MEMORY(bytes)
nginx-deployment-55c9d4fbb5-mklv5 0m 2Mi
测试
yum -y install httpd-tools
# 访问网页
[root@master k8s]# kubectl get svc -n study
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx NodePort 10.104.236.152 <none> 80:32260/TCP 42m
[root@master k8s]# curl 192.168.100.51:32260
ab -c 1000 -n 10000 http://192.168.100.51:32260/index.html
或
sudo yum -y install siege
siege -c 200 -i http://192.168.100.51:32260/index.html
[root@master ~]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
nginx-deployment-55c9d4fbb5-mklv5 1/1 Running 0 55m
[root@master ~]# kubectl get pod -n study -w
NAME READY STATUS RESTARTS AGE
nginx-deployment-55c9d4fbb5-mklv5 1/1 Running 0 55m
nginx-deployment-55c9d4fbb5-5k82v 0/1 Pending 0 0s
nginx-deployment-55c9d4fbb5-5k82v 0/1 Pending 0 0s
nginx-deployment-55c9d4fbb5-5k82v 0/1 ContainerCreating 0 0s
nginx-deployment-55c9d4fbb5-5k82v 0/1 ContainerCreating 0 2s
nginx-deployment-55c9d4fbb5-5k82v 1/1 Running 0 2s
[root@master k8s]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
nginx-deployment-55c9d4fbb5-5k82v 1/1 Running 0 50s
nginx-deployment-55c9d4fbb5-mklv5 1/1 Running 0 59m
[root@master ~]# kubectl get hpa -n study -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
pc-hpa Deployment/nginx-deployment 0%/50% 1 10 1 18m
pc-hpa Deployment/nginx-deployment 1%/50% 1 10 1 20m
pc-hpa Deployment/nginx-deployment 2%/50% 1 10 1 20m
pc-hpa Deployment/nginx-deployment 92%/50% 1 10 1 21m
pc-hpa Deployment/nginx-deployment 1%/50% 1 10 2 21m
pc-hpa Deployment/nginx-deployment 0%/50% 1 10 2 21m
# REPLICAS 该参数为现在副本数量
CPU 利用率降至 0%,过(5-10)分钟 HPA 会自动将副本数缩减为 1。
不会负载下来立刻缩减副本数了,而是会过5-10分钟重新获取多次利用率再缩减
[root@master ~]# kubectl get hpa -n study -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
pc-hpa Deployment/nginx-deployment 0%/50% 1 10 2 23m
pc-hpa Deployment/nginx-deployment 113%/50% 1 10 2 23m
pc-hpa Deployment/nginx-deployment 79%/50% 1 10 4 24m
pc-hpa Deployment/nginx-deployment 76%/50% 1 10 5 24m
pc-hpa Deployment/nginx-deployment 0%/50% 1 10 5 24m
pc-hpa Deployment/nginx-deployment 0%/50% 1 10 5 29m
pc-hpa Deployment/nginx-deployment 0%/50% 1 10 1 29m
[root@master ~]# kubectl get pod -n study -w
nginx-deployment-55c9d4fbb5-5k82v 1/1 Terminating 0 8m17s
nginx-deployment-55c9d4fbb5-fs9v5 1/1 Terminating 0 5m30s
nginx-deployment-55c9d4fbb5-c8x9c 1/1 Terminating 0 5m15s
nginx-deployment-55c9d4fbb5-dpbwl 1/1 Terminating 0 5m30s
nginx-deployment-55c9d4fbb5-fs9v5 1/1 Terminating 0 5m30s
nginx-deployment-55c9d4fbb5-5k82v 1/1 Terminating 0 8m17s
[root@master k8s]# kubectl get deployments.apps -n study -w
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 5/5 5 5 65m
nginx-deployment 5/1 5 5 68m
nginx-deployment 5/1 5 5 68m
nginx-deployment 1/1 1 1 68m
删除
删除hpa不会连着其创建deployment一起删除,要手动删除
[root@master k8s]# kubectl get hpa -A
NAMESPACE NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
study pc-hpa Deployment/nginx-deployment 0%/50% 1 10 1 2d6h
[root@master k8s]# kubectl delete -f controller.yaml
horizontalpodautoscaler.autoscaling "pc-hpa" deleted
[root@master k8s]# kubectl get deployments.apps -n study
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 1/1 1 1 2d7h
[root@master k8s]# kubectl delete deployments.apps -n study nginx-deployment
deployment.apps "nginx-deployment" deleted
DaemonSet
DaemonSet类型的控制器可以保证集群中的每一台(或指定)节点上都运行一个副本,一般适用于日志收集、节点监控等场景。也就是说,如果一个Pod提供的功能是节点级别的(每个节点都需要且只需要一个),那么这类Pod就适合使用DaemonSet类型的控制器创建
整体 yaml 解析
revisionHistoryLimit: 保留历史版本,用于回滚
updateStrategy: 更新策略
type: RollingUpdate : 更新策略类型设置为滚动更新
# 还有 OnDelete 仅在被杀死时替换旧的守护程序
minReadySeconds: 新创建的DaemonSet pod的最小准备时间,默认为0
apiVersion: apps/v1 # 版本号
kind: DaemonSet # 类型
metadata: # 元数据
name: # 名称
namespace: #命名空间
labels: #标签
controller: daemonset
spec: # 详情描述
revisionHistoryLimit: 3 # 保留历史版本
updateStrategy: # 更新策略
type: RollingUpdate # 滚动更新策略
rollingUpdate: # 滚动更新
maxUnavailable: 1 # 最大不可用状态的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
创建
apiVersion: apps/v1 # 版本号
kind: DaemonSet # 类型
metadata: # 元数据
name: pc-damonset # 名称
namespace: dev #命名空间
spec: # 详情描述
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
[root@master k8s]# kubectl apply -f controller.yaml
daemonset.apps/pc-damonset created
[root@master k8s]# kubectl get ds -n study -o wide
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
pc-damonset 2 2 0 2 0 <none> 36s nginx nginx:1.17.1 app=nginx-pod
测试
# 将两个node都重启,则重启后node重新加入集群,damonset控制器会自动为每个新加入的创建pod
[root@master k8s]# kubectl get pods -A --field-selector=spec.nodeName=node2
NAMESPACE NAME READY STATUS RESTARTS AGE
calico-system calico-node-s8v4z 1/1 Running 4 (3m36s ago) 11d
calico-system calico-typha-5b99648654-rgqg6 1/1 Running 5 (3m36s ago) 11d
kube-system kube-proxy-g6q8z 1/1 Running 4 (3m36s ago) 12d
kube-system metrics-server-6b5d469648-hgr6q 1/1 Running 2 (112s ago) 2d22h
study pc-damonset-hr6jt 1/1 Running 0 6m25s
tigera-operator tigera-operator-7795f5d79b-jf6pv 1/1 Running 12 (112s ago) 12d
[root@master k8s]# kubectl get pods -A --field-selector=spec.nodeName=node1
NAMESPACE NAME READY STATUS RESTARTS AGE
calico-system calico-node-n4df5 1/1 Running 3 (3m49s ago) 11d
calico-system calico-typha-5b99648654-nrjfn 1/1 Running 3 (3m49s ago) 11d
kube-system kube-proxy-trzb9 1/1 Running 3 (3m49s ago) 11d
kube-system metrics-server-6b5d469648-4vmvp 1/1 Running 2 (2m7s ago) 2d22h
study pc-damonset-5xljn 1/1 Running 0
删除
[root@master k8s]# kubectl delete -f controller.yaml
daemonset.apps "pc-damonset" deleted
[root@master k8s]# kubectl get pod -n study
No resources found in study namespace.
Job
整体 yaml 解析
restartPolicy
关于模板中的重启策略的说明:
如果设置为OnFailure,则Job会在Pod出现故障的时候重启容器,而不是创建Pod,failed次数不变。
如果设置为Never,则Job会在Pod出现故障的时候创建新的Pod,并且故障Pod不会消失,也不会重启,failed次数+1。
如果指定为Always,就意味着一直重启,意味着Pod任务会重复执行,这和Job的定义冲突,所以不能设置为Always。
apiVersion: batch/v1 # 版本号
kind: Job # 类型
metadata: # 元数据
name: # 名称
namespace: #命名空间
labels: # 标签
controller: job
spec: # 详情描述
completions: 1 # 指定Job需要成功运行Pod的总次数,等于需要执行多少次一次性任务,默认为1
parallelism: 1 # 指定Job在任一时刻应该并发运行Pod的数量,等于同时执行多个一次性任务,默认为1
activeDeadlineSeconds: 30
# 指定Job可以运行的时间期限,超过时间还没结束,系统将会尝试进行终止
backoffLimit: 6 # 指定Job失败后进行重试的次数,默认为6
manualSelector: true # 是否可以使用selector选择器选择Pod,默认为false
selector: # 选择器,通过它指定该控制器管理那些Pod
matchLabels: # Labels匹配规则
app: counter-pod
matchExpressions: # Expressions匹配规则
- key: app
operator: In
values:
- counter-pod
template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板
metadata:
labels:
app: counter-pod
spec:
restartPolicy: Never # 重启策略只能设置为 Never 或 OnFailure
containers:
- name: counter
image: busybox:1.30
command: ["/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 20;done"]
创建
apiVersion: batch/v1 # 版本号
kind: Job # 类型
metadata: # 元数据
name: pc-job # 名称
namespace: study #命名空间
spec: # 详情描述
manualSelector: true # 是否可以使用selector选择器选择Pod,默认为false
selector: # 选择器,通过它指定该控制器管理那些Pod
matchLabels: # Labels匹配规则
app: counter-pod
template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板
metadata:
labels:
app: counter-pod
spec:
restartPolicy: Never # 重启策略只能设置为Never或OnFailure
containers:
- name: counter
image: busybox:1.30
command: [ "/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 3;done" ]
[root@master k8s]# kubectl apply -f controller.yaml
job.batch/pc-job created
[root@master k8s]# kubectl get job -A
NAMESPACE NAME COMPLETIONS(任务数量) DURATION AGE
study pc-job 0/1 (成功数量/总数量) 6s 6s
[root@master k8s]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
pc-job-s6ql5 0/1 Completed 0 2m34s
# 持续变化如下
NAME READY STATUS RESTARTS AGE
pc-job-7qgjk 1/1 Running 0 7s
pc-job-7qgjk 0/1 Completed 0 29s
pc-job-7qgjk 0/1 Completed 0 30s
pc-job-7qgjk 0/1 Completed 0 31s
pc-job-7qgjk 0/1 Completed 0 31s
[root@master ~]# kubectl get job -n study -w
NAME COMPLETIONS DURATION AGE
pc-job 0/1 11s 11s
pc-job 0/1 30s 30s
pc-job 0/1 31s 31s
pc-job 1/1 31s 31s
更改执行次数与并发
completions: 6 # 指定Job需要成功运行Pod的总次数,等于需要执行多少次一次性任务,默认为1
[root@master k8s]# vim controller.yaml
[root@master k8s]# kubectl apply -f controller.yaml
job.batch/pc-job created
删除
[root@master k8s]# kubectl delete -f controller.yaml
job.batch "pc-job" deleted
CronJob(CJ)
CronJob控制器以Job控制器为其管控对象,并借助它管理Pod资源对象,Job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但CronJob可以以类似Linux操作系统的周期性任务作业计划(定时任务)的方式控制器运行时间点及重复运行的方式,换言之,CronJob可以在特定的时间点反复去执行Job任务。
整体 yaml 解析
schedule:cron表达式,用于指定任务的执行时间。
*/1 * * * * 表示 每分钟执行一次
分 时 日 月 周。
分钟的值从0到59。
小时的值从0到23。
日的值从1到31。
月的值从1到12。
星期的值从0到6,0表示星期日。
多个时间可以用逗号隔开,范围可以用连字符给出:* 可以作为通配符,/表示每...
concurrencyPolicy:并发执行策略
# 第一个pod执行后还没完成,时间到了第二个pod要开始执行了,第二个pod能否执行就看这个参数
Allow:运行Job并发运行(默认)。
Forbid:禁止并发运行,如果上一次运行尚未完成,则跳过下一次运行。
apiVersion: batch/v1 # 版本号
kind: CronJob # 类型
metadata: # 元数据
name: # 名称
namespace: #命名空间
labels:
controller: cronjob
spec: # 详情描述
schedule: # cron格式的作业调度运行时间点,用于控制任务任务时间执行
concurrencyPolicy: # 并发执行策略
failedJobsHistoryLimit: # 为失败的任务执行保留的历史记录数,默认为1
successfulJobsHistoryLimit: # 为成功的任务执行保留的历史记录数,默认为3
jobTemplate: # job控制器模板,用于为cronjob控制器生成job对象,下面其实就是job控制器的定义
metadata: {}
spec:
completions: 1 # 指定Job需要成功运行Pod的总次数,默认为1
parallelism: 1 # 指定Job在任一时刻应该并发运行Pod的数量,默认为1
activeDeadlineSeconds: 30 # 指定Job可以运行的时间期限,超过时间还没结束,系统将会尝试进行终止
backoffLimit: 6 # 指定Job失败后进行重试的次数,默认为6
template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板
spec:
restartPolicy: Never # 重启策略只能设置为 Never 或 OnFailure
containers:
- name: counter
image: busybox:1.30
command: [ "/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 20;done" ]
创建
apiVersion: batch/v1 # 版本号
kind: CronJob # 类型
metadata: # 元数据
name: pc-cronjob # 名称
namespace: dev #命名空间
spec: # 详情描述
schedule: "*/1 * * * * " # cron格式的作业调度运行时间点,用于控制任务任务时间执行
jobTemplate: # job控制器模板,用于为cronjob控制器生成job对象,下面其实就是job的定义
metadata: {}
spec:
template: # 模板,当副本数量不足时,会根据下面的模板创建Pod模板
spec:
restartPolicy: Never # 重启策略只能设置为Never或OnFailure
containers:
- name: counter
image: busybox:1.30
command: [ "/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 2;done" ]
[root@master k8s]# kubectl apply -f controller.yaml
cronjob.batch/pc-cronjob created
[root@master ~]# kubectl get cronjob -n study -w
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
pc-cronjob */1 * * * * False 0 <none> 2s
pc-cronjob */1 * * * * False 1 0s 5s
pc-cronjob */1 * * * * False 0 22s 27s
pc-cronjob */1 * * * * False 0 22s 27s
pc-cronjob */1 * * * * False 1 0s 65s
pc-cronjob */1 * * * * False 0 22s 87s
pc-cronjob */1 * * * * False 0 22s 87s
[root@master ~]# kubectl get job -n study -w
pc-cronjob-27939788 0/1 0s
pc-cronjob-27939788 0/1 0s 0s
pc-cronjob-27939788 0/1 2s 2s
pc-cronjob-27939788 0/1 21s 21s
pc-cronjob-27939788 0/1 22s 22s
pc-cronjob-27939788 1/1 22s 22s # 完成第一次
pc-cronjob-27939789 0/1 0s
pc-cronjob-27939789 0/1 0s 0s
pc-cronjob-27939789 0/1 2s 2s
pc-cronjob-27939789 0/1 21s 21s
pc-cronjob-27939789 0/1 22s 22s
pc-cronjob-27939789 1/1 22s 22s # 完成第二次
pc-cronjob-27939790 0/1 0s
pc-cronjob-27939790 0/1 0s 0s
[root@master ~]# kubectl get pod -n study -w
NAME READY STATUS RESTARTS AGE
pc-cronjob-27939788-w29x8 0/1 Completed 0 110s
pc-cronjob-27939789-v6fbr 0/1 Completed 0 50s
删除
[root@master k8s]# kubectl delete -f controller.yaml
cronjob.batch "pc-cronjob" deleted
StatefulSet
文档: kubernetes之StatefulSet控制器-腾讯云开发者社区-腾讯云
- 在用Deployment时,每一个Pod名称是没有顺序的,是随机字符串,因此是Pod名称是无序的,但是在StatefulSet中要求必须是有序 ,每一个Pod不能被随意取代,Pod重建后pod名称还是一样的。
- 而Pod IP是变化的,所以是以Pod名称来识别。Pod名称是Pod唯一性的标识符,必须持久稳定有效。这时候要用到无头服务,它可以给每个Pod一个唯一的名称 。
常用来部署RabbitMQ集群、Zookeeper集群、MySQL集群、Eureka集群等
特点
整体 yaml 解析
podManagementPolicy:
OrderedReady(默认): # 就是按照一定的顺序先后启动
Parallel: # StatefulSet 控制器并行的启动或终止所有的 Pod
# 启动或者终止其他 Pod 前,无需等待 Pod 进入 Running 和 ready 或者完全停止状态
updateStrategy
type: RollingUpdate
# 还有 OnDelete 仅在被杀死时替换旧的守护程序
rollingUpdate:# 滚动更新 使用rolling用新的复制集替换旧的复制集
更新,
# 即逐步缩小旧的复制集,并扩大新的复制集
---
# 设置 HeadLinessService
apiVersion: v1
kind: Service
metadata:
name: service-headliness
namespace: study
spec:
podManagementPolicy: OrderedReady
TerminationGracePeriodSeconds: 10 # 终止宽限时间,不要设置为0(默认)
updateStrategy # 更新策略
type: RollingUpdate
rollingUpdate: # 滚动更新
partition: 0
selector: # 选择器,与pod模板进行绑定
app: nginx-pod
clusterIP: None # 将clusterIP设置为None,即可创建headliness Service
type: ClusterIP
ports:
- port: 80 # Service的端口
targetPort: 80 # Pod的端口
---
# 设置 StatefulSet 控制器
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: pc-statefulset
namespace: study
spec:
replicas: 3 # 副本数量,默认为 1
serviceName: service-headliness # 与service进行绑定
selector: # 选择器,与pod模板进行绑定
matchLabels:
app: nginx-pod
template: # pod 模板
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
创建
apiVersion: v1
kind: Service
metadata:
name: service-headliness
namespace: study
spec:
selector:
app: nginx-pod
clusterIP: None # 将clusterIP设置为None,即可创建headliness Service
type: ClusterIP
ports:
- port: 80 # Service的端口
targetPort: 80 # Pod的端口
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: pc-statefulset
namespace: study
spec:
replicas: 3
serviceName: service-headliness
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
[root@master k8s]# kubectl apply -f controller.yaml
service/service-headliness created
statefulset.apps/pc-statefulset created
[root@master k8s]# kubectl get statefulsets.apps -n study
NAME READY AGE
pc-statefulset 3/3 7s
[root@master k8s]# kubectl get svc -n study
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service-headliness ClusterIP None <none> 80/TCP 38s
# 因为 clusterIP: None
# 下面 pod 注意命名规则
[root@master k8s]# kubectl get pod -n study
NAME READY STATUS RESTARTS AGE
pc-statefulset-0 1/1 Running 0 106s
pc-statefulset-1 1/1 Running 0 104s
pc-statefulset-2 1/1 Running 0 102s
删除
[root@master k8s]# kubectl delete -f controller.yaml
service "service-headliness" deleted
statefulset.apps "pc-statefulset" deleted
Deployment和StatefulSet的区别
- Deployment和StatefulSet的区别:Deployment没有唯一标识而StatefulSet有唯一标识。
- StatefulSet的唯一标识是根据主机名+一定规则生成的。
- StatefulSet的唯一标识是 主机名.无头Service名称.命名空间.svc.cluster.local
金丝雀发布
apiVersion: v1
kind: Service
metadata:
name: service-headliness
namespace: study
spec:
selector:
app: nginx-pod
clusterIP: None # 将clusterIP设置为None,即可创建headliness Service
type: ClusterIP
ports:
- port: 80 # Service的端口
targetPort: 80 # Pod的端口
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: pc-statefulset
namespace: study
spec:
replicas: 3
serviceName: service-headliness
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate