您现在的位置是:首页 >学无止境 >带你深入学习k8s--(四) 控制器(k8s核心)网站首页学无止境

带你深入学习k8s--(四) 控制器(k8s核心)

好久没说梦想 2023-06-28 12:00:04
简介带你深入学习k8s--(四) 控制器(k8s核心)

目录

一、概念

1、什么是控制器

2、控制器执行流程

3、控制器类型

二、控制器的使用

1、ReplicaSet

2、Deployment

1、版本迭代

2、回滚 

3、修改滚动更新策略

4、暂停与恢复

3、daemonset

4、job

5、cronjob


前言:

上一章我们说到,pod有两种,分别为自主式 Pod,Pod 退出后不会被创建;和被控制器管理的 Pod,在控制器的生命周期里,始终要维持 Pod 的副本数目。本章我们来讲解下k8s的核心控制器,在官方文档中也叫工作负载资源。

官方文档:工作负载资源 | Kuberneteshttps://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/

一、概念

1、什么是控制器

Kubernetes 中内建了很多 controller(控制器),这些相当于一个状态机,用来控制 Pod 的具体状态和行为。

2、控制器执行流程

通过yaml文件把用户期望的状态存入etcd,控制器会通过ApiServer访问etcd,时刻去listwatch,检索当前的状态,并获取应用的状态,不断比对当前状态和你期望的状态是否是一致的,如果不一致由代码自驱动完成修复。

3、控制器类型

Replication Controller和ReplicaSet(RC已经被RS取代,RS一般不会单独用,一般都是和deployment一起使用)
Deployment
DaemonSet
StatefulSet
Job
CronJob
HPA全称Horizontal Pod Autoscaler

二、控制器的使用

1、ReplicaSet

rs主要控制的是pod的副本数

案例:证明k8s的控制器在自动的维护pod的副本数

[root@k8s2 pod]# vim rs-example.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-example
spec:
  replicas: 3
  selector:
    matchLabels:		#通过选择标签
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx

[root@k8s2 pod]# kubectl apply -f rs-example.yml

[root@k8s2 pod]# kubectl get pod --show-labels

replicaset是通过标签匹配pod,我们修改其中一个pod的标签,控制器会始终维护yaml中定义的3个副本数,所以他就会新创建一个标签为myapp的pod
[root@k8s2 pod]# kubectl label pod replicaset-example-q2sq9 app=myapp --overwrite
[root@k8s2 pod]# kubectl get pod --show-labels 

我们把刚在修改的pod再改回来,发现还是只有3个副本数

[root@k8s2 pod]# kubectl label pod replicaset-example-q2sq9 app=nginx --overwrite
[root@k8s2 pod]# kubectl get pod --show-labels 

删除掉其中的一个pod控制器仍然会自动创建一个

replicaset自动控制副本数量,pod可以自愈

[root@k8s2 pod]# kubectl delete pod replicaset-example-q2sq9

[root@k8s2 pod]# kubectl get pod --show-labels

回收资源

[root@k8s2 pod]# kubectl delete -f rs-example.yml

2、Deployment

deployment底层还是调用rs控制器,可以用来更新,rs就相当于是其中的一个版本

比较适合部署无状态的,如web服务器

创建一个deployment控制器,我们可以发现他的yaml和RS控制器只有kind不同

[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1
[root@k8s2 pod]# kubectl apply -f deployment-example.yaml

1、版本迭代

[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v2

[root@k8s2 pod]# kubectl apply -f deployment-example.yaml

replicaset就是deployment的一个版本,rs创建pod,deployment创建rs,v2版本就是把v1的资源回收,rebuild到v2

2、回滚 

[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1

[root@k8s2 pod]# kubectl apply -f deployment-example.yaml

默认一次更新25%,可以根据自己业务的需求做对应的更改

版本已经退回到v1随便访问一个pod

3、修改滚动更新策略

[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example
spec:
  minReadySeconds: 5    #最小就绪时间(方便测试)
  strategy:
    rollingUpdate:            #滚动更新,采用先创建一个后回收一个,比较稳妥
      maxSurge: 1            #比定义的副本数多几个
      maxUnavailable: 0    #最大不可用

  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1 

 [root@k8s2 pod]# kubectl apply -f deployment-example.yaml

4、暂停与恢复

生产环境使用比较多

暂停,避免触发不必要的线上更新

[root@k8s2 pod]# kubectl rollout pause deployment deployment-example

[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example
spec:
  minReadySeconds: 5
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  replicas: 6                #副本数增加
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: nginx        #资源敏感型业务
        resources:
          limits:
            cpu: 0.5
            memory: 200Mi
          requests:
            cpu: 0.5
            memory: 200Mi

[root@k8s2 pod]# kubectl apply -f deployment-example.yaml 

调整副本数,不受影响

但是更新镜像和修改资源并没有触发更新,因为当前处于暂停状态

[root@k8s2 pod]# kubectl rollout history deployment deployment-example

deployment.apps/deployment-example

REVISION CHANGE-CAUSE

2 <none>

3 <none>

恢复后开始触发更新
[root@k8s2 pod]# kubectl rollout resume deployment deployment-example

[root@k8s2 pod]# kubectl rollout history  deployment deployment-example
deployment.apps/deployment-example
REVISION  CHANGE-CAUSE
2         <none>
3         <none>
4         <none>

回收资源
[root@k8s2 pod]# kubectl delete -f deployment-example.yaml 

3、daemonset

特点:一个节点只部署一个,只有一个副本,比较适合部署有守护进程的,分布式的文件系统
比较典型的就是kube-flannel中,有几个集群节点就会部署几个,每个节点部署一个,是自动的

还有一个就是在kube-system中 

示例:

tolerations: #允许污点存在,如果不加集群的调度节点不会生成副本

- effect: NoSchedule

  operator: Exists

[root@k8s2 pod]# vim daemonset-example.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-example
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      tolerations:	#允许污点存在,如果不加集群的调度节点不会生成副本
      - effect: NoSchedule
        operator: Exists
      containers:
      - name: nginx
        image: nginx

[root@k8s2 pod]# kubectl apply -f daemonset-example.yml

回收

[root@k8s2 pod]# kubectl delete -f daemonset-example.yml

补充:扩容节点,kubeadm的join时间是24小时,超过了需要重新kubeadm token create ...重新生成

4、job

主要处理一些离线任务做一次性任务,可以参考官方的例子,计算π的值

#并行job,可以做并行任务

completions: 6         # 共完成6个

parallelism: 2        #每次跑2个

[root@k8s2 pod]# vim job.yml
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  completions: 6	#并行job,可以做并行任务 共完成6个,每次跑2个
  parallelism: 2
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

[root@k8s2 pod]# kubectl apply -f job.yml

查看使用logs加上pod名

[root@k8s2 pod]# kubectl logs pi-2jrhb

回收

[root@k8s2 pod]# kubectl delete -f job.yml

5、cronjob

可以做周期任务,到指定时间创建job在由job创建容器

示例:没分钟执行一段输出

[root@k8s2 pod]# vim cronjob.yml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "* * * * *"		#分钟 小时 日 月 周 代表每分钟
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh	#运行date命令输出一段话
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

[root@k8s2 pod]# kubectl apply -f cronjob.yml

回收

[root@k8s2 pod]# kubectl delete -f cronjob.yml

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。