一、Pod控制器
1.Pod控制器及其作用
Pod控制器,又称之为工作负载(workload),是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试重启Pod,使其达到预期状态
2.Pod控制器有多种类型
(1)ReplicaSet: 代用户创建指定数量的pod副本,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能
(2)Deployment:工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。ReplicaSet 与Deployment 这两个资源对象逐步替换之前RC的作用。
(3)DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现统级后台任务。比如日志采集(loki)服务、监控服务(promethues)
特性:服务是无状态的,服务必须是守护进程
(4)StatefulSet:管理有状态应用
(5)Job:只要完成就立即退出,不需要重启或重建
(6)Cronjob:周期性任务控制,不需要持续后台运行
3.Pod与控制器之间的关系
controllers:在集群上管理和运行容器的 pod 对象, pod 通过 label-selector 相关联。
Pod 通过控制器实现应用的运维,如伸缩,升级等。
二、Deployment介绍
1.概念
Deployment 控制器为 Pods和 ReplicaSets提供描述性的更新方式。用来替代以前的ReplicationController以方便管理应用。典型的应用场景包括:
- 定义Deployment来创建Pod和ReplicaSet
- 滚动升级和回滚应用
- 扩容和缩容,管理Pod和ReplicaSet(副本数量)
- 暂停和继续Deployment
- 部署无状态应用(Web,微服务,nginx等)
功能区别:
deployment:
①RS的全部功能
②事件和状态查看
③回滚:当升级Pod的时候如果出现问题,可以使用回滚操作回滚到之前的任一版本
④版本记录:每一次对Deployment的操作,都能够保存下来,这也是保证可以回滚到任一版本的基础
⑤暂停和启动:对于每一次升级都能够随时暂停和启动
replicaset:
①确保Pod数量
②确保Pod健康
③弹性伸缩
④滚动升级
2.yaml文件解读
## Deployment配置
apiVersion: apps/v1 # 接口组及版本
kind: Deployment # 资源对象类型
metadata: # 元数据
name: nginx # 名称
namespace: test # 指定在那个命名空间下运行
## RS配置
spec: # 详细定义
replicas: 2 # 副本数量
selector: # 定义标签选择器
matchLabels: # 同样支持matchExpressions 表达式语法
app: nginx # ReplicaSet 通过标签来确定那个Pod由它来管理
matchExpressions: # matchExpressions 表达式语法
- key: app # 标签的key
operator: In # In、NotIn、Exists 和DoesNotExist
values:nginx # 标签的值
##Pod配置
template: # 定义用来创建Pod的模板
metadata: # Pod元数据
labels: # 名称由控制器生成
app: nginx # 这里只能定义标签
spec: # Pod的详细定义
restartPolicy: Always # 重启策略(OnFailure、Never、Always)
containers: # 容器定义
- name: nginx # 容器名称
image: nginx:1.16.1 # 创建容器使用的镜像
imagePullPolicy: IfNotPresent # 镜像下载策略(Always、Never、IfNotPresent)
ports: # 容器内服务使用的端口号
- protocol: TCP # 协议
containerPort: 8090 # 端口
重启策略
Always:容器失效时,自动重启该容器,这是默认值
OnFailure:容器停止运行且退出码不为0时重启
Never:不论状态为何,都不重启该容器镜像拉取策略
IfNotPresent:只有当镜像在本地不存在时才会拉取
Always:每当 kubelet 启动一个容器时,kubelet会查询容器的镜像仓库, 将名称解析为一个镜像摘要。 如果 kubelet 有一个容器镜像,并且对应的摘要已在本地缓存,kubelet就会使用其缓存的镜像; 否则,kubelet 就会使用解析后的摘要拉取镜像,并使用该镜像来启动容器
Never:Kubelet不会尝试获取镜像。如果镜像已经以某种方式存在本地, kubelet 会尝试启动容器;否则,会启动失败
3.演练(结合kuboard做演练操作)
3.1发布
如果没有namespace那就创建一个
[root@k8s-master test-namespace]# cat test-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: test
[root@k8s-master test-namespace]# kubectl apply -f test-namespace.yaml
namespace/test created
发布一个deployment,可以用上面的yaml文件
[root@k8s-master test-namespace]# kubectl apply -f nginx-deploy.yaml
deployment.apps/nginx created
查看发布的deployment资源
[root@k8s-master test-namespace]# kubectl get deploy -n test
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 2/2 2 2 2m30s
[root@k8s-master test-namespace]# kubectl get rs -n test
NAME DESIRED CURRENT READY AGE
nginx-7bc99ff65 2 2 2 2m47s
[root@k8s-master test-namespace]# kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
nginx-7bc99ff65-79sns 1/1 Running 0 110s
nginx-7bc99ff65-82588 1/1 Running 0 110s
3.2手动扩缩容
[root@k8s-master test-namespace]# kubectl scale --replicas=6 deploy/nginx -n test
deployment.apps/nginx scaled
[root@k8s-master test-namespace]# kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
nginx-7bc99ff65-79sns 1/1 Running 0 50m
nginx-7bc99ff65-82588 1/1 Running 0 50m
nginx-7bc99ff65-b5mfn 1/1 Running 0 23s
nginx-7bc99ff65-cwtcb 1/1 Running 0 23s
nginx-7bc99ff65-kprj8 1/1 Running 0 23s
nginx-7bc99ff65-slkgw 1/1 Running 0 23s
3.3更新
3.3.1滚动更新
[root@k8s-master test-namespace]# kubectl set image deployment/nginx nginx=nginx:1.17 -n test --record=true
deployment.apps/nginx image updated
3.3.2暂停滚动(金丝雀发布)
[root@k8s-master test-namespace]# kubectl set image deployment/nginx nginx=nginx:1.20 -n test
deployment.apps/nginx image updated
[root@k8s-master test-namespace]# kubectl rollout pause deployment/nginx -n test
deployment.apps/nginx paused
[root@k8s-master test-namespace]# kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
nginx-789dfdff9c-6d5q8 1/1 Running 0 86s
nginx-789dfdff9c-czdvt 1/1 Running 0 86s
nginx-789dfdff9c-g7lwh 1/1 Running 0 86s
nginx-db6bff64f-78kpj 1/1 Running 0 44m
nginx-db6bff64f-gdjhq 1/1 Running 0 44m
nginx-db6bff64f-krcsl 1/1 Running 0 45m
nginx-db6bff64f-mt7bg 1/1 Running 0 44m
nginx-db6bff64f-sgrhj 1/1 Running 0 45m
3.3.3恢复滚动
[root@k8s-master test-namespace]# kubectl rollout resume deployment/nginx -n test
deployment.apps/nginx resumed
[root@k8s-master test-namespace]# kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
nginx-789dfdff9c-6d5q8 1/1 Running 0 5m55s
nginx-789dfdff9c-czdvt 1/1 Running 0 5m55s
nginx-789dfdff9c-czzcz 1/1 Running 0 12s
nginx-789dfdff9c-g7lwh 1/1 Running 0 5m55s
nginx-789dfdff9c-rnn6f 1/1 Running 0 12s
nginx-789dfdff9c-xvsdn 1/1 Running 0 12s
3.3.4查看版本记录
[root@k8s-master test-namespace]# kubectl rollout history deploy/nginx -n test
deployment.apps/nginx
REVISION CHANGE-CAUSE
1 <none>
2 kubectl set image deployment/nginx nginx=nginx:1.21 --namespace=test --record=true
3.4回滚
[root@k8s-master test-namespace]# kubectl rollout history deploy/nginx --revision=1 -n test
deployment.apps/nginx with revision #1
Pod Template:
Labels: app=nginx
pod-template-hash=7bc99ff65
Containers:
nginx:
Image: nginx:1.16.1
Port: 8090/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>