一、Pod控制器

1.Pod控制器及其作用

Pod控制器,又称之为工作负载(workload),是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试重启Pod,使其达到预期状态

2.Pod控制器有多种类型

k8s Deployment selector和labels区别 k8s deployment replicaset_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>