1、控制器简介

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、 Replicaset控制器

[root@server2 ~]# vim rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-example
spec:
  replicas: 3   运行了三个副本
  selector:      表示选者器,控制器和pod之间的联系是啥,因为不同的pod有不同的控制器
    matchLabels:
      app: nginx   如果pod上有app:nginx标签,此pod就属于此控制器
  template:          模板
    metadata:       
      labels:
        app: nginx          表示模板下面创建的pod都会有app: nginx 标签
    spec:
      containers:
      - name: nginx
        image: nginx
[root@server2 ~]# kubectl apply -f rs.yaml   运行
replicaset.apps/replicaset-example created
[root@server2 ~]# kubectl get  rs    
NAME                 DESIRED   CURRENT   READY   AGE
replicaset-example   3         3         3       40s
[root@server2 ~]# kubectl get pod   运行了三个副本
NAME                       READY   STATUS    RESTARTS   AGE
replicaset-example-9qr92   1/1     Running   0          2m13s
replicaset-example-c7zpv   1/1     Running   0          2m13s
replicaset-example-hdrqc   1/1     Running   0          2m13s
[root@server2 ~]# kubectl get pod --show-labels   查看pod的标签 ,3个副本都有 app=myapp 标签
NAME                       READY   STATUS    RESTARTS   AGE     LABELS
replicaset-example-9qr92   1/1     Running   0          3m22s   app=myapp 
replicaset-example-c7zpv   1/1     Running   0          3m22s   app=myapp
replicaset-example-hdrqc   1/1     Running   0          3m22s   app=myapp

标签对控制器的影响

[root@server2 ~]# kubectl label pods replicaset-example-9qr92 app=nginx --overwrite    将原有的标签覆盖换成app=nginx,overwrite 表示覆盖
pod/replicaset-example-9qr92 labeled   
[root@server2 ~]# kubectl get pod --show-labels  查看标签
NAME                       READY   STATUS    RESTARTS   AGE     LABELS
replicaset-example-9qr92   1/1     Running   0          13m     app=nginx   其中这个不匹配,控制器会维护副本数,会重新拉伸一个出来
replicaset-example-c7zpv   1/1     Running   0          13m     app=myapp
replicaset-example-hdrqc   1/1     Running   0          13m     app=myapp
replicaset-example-sjxss   1/1     Running   0          2m46s   app=myapp
[root@server2 ~]# kubectl delete -f rs.yaml   删除
replicaset.apps "replicaset-example" deleted

3、deployment 控制器

deployment 和 Replicaset 书写一样

[root@server2 ~]# vim rs.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1
[root@server2 ~]# kubectl apply -f rs.yaml 
deployment.apps/deployment created  
[root@server2 ~]# kubectl get all

在这里插入图片描述

deployment控制器可以进行版本更新,版本退回,rs是做不到的,rs只控制副本数,如下实验:

[root@server2 ~]# vim rs.yaml
apiVersion: apps/v1
kind: ReplicaSet    
metadata:
  name: deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1
[root@server2 ~]# vim rs.yaml
[root@server2 ~]# kubectl apply -f rs.yaml   运行
[root@server2 ~]# vim rs.yaml  
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v2   版本变成v2
[root@server2 ~]# kubectl apply -f rs.yaml     
[root@server2 ~]# kubectl get pod -o wide
NAME                       READY   STATUS    RESTARTS   AGE     IP            NODE      NOMINATED NODE   READINESS GATES
deployment-895ql           1/1     Running   0          2m28s   10.244.2.17   server4   <none>           <none>
deployment-bsgpw           1/1     Running   0          2m28s   10.244.1.24   server3   <none>           <none>
deployment-wmw2x           1/1     Running   0          2m28s   10.244.1.25   server3   <none>           <none>
replicaset-example-9qr92   1/1     Running   0          77m     10.244.2.15   server4   <none> 
[root@server2 ~]# curl 10.244.2.17   版本并没有更改。rs是做不到版本更新的
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>   
[root@server2 ~]# kubectl delete pod --all 删除所有副本,重新拉起三个副本
pod "deployment-895ql" deleted
pod "deployment-bsgpw" deleted
pod "deployment-wmw2x" deleted
pod "replicaset-example-9qr92" deleted
[root@server2 ~]# kubectl get pod -o wide  查看ip
NAME               READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
deployment-7dvsd   1/1     Running   0          57s   10.244.2.20   server4   <none>           <none>
deployment-prlpx   1/1     Running   0          56s   10.244.1.29   server3   <none>           <none>
deployment-wtvkx   1/1     Running   0          56s   10.244.1.28   server3   <none>           <none>
[root@server2 ~]# curl 10.244.1.28  访问,可以看出新拉起来的,版本就更新成了v2
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>   
[root@server2 ~]# kubectl delete -f rs.yaml   删除
replicaset.apps "deployment" deleted

deployment 控制器

[root@server2 ~]# vim rs.yaml    变回deployment控制器
apiVersion: apps/v1
kind: Deployment   变回deployment控制器
metadata:
  name: deployment   
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1
[root@server2 ~]# kubectl apply -f rs.yaml   运行
deployment.apps/deployment created
 [root@server2 ~]# kubectl get pod    查看pod节点,总共3个副本
NAME                          READY   STATUS    RESTARTS   AGE
deployment-678fcbc488-8nhmf   1/1     Running   0          38s
deployment-678fcbc488-9brd7   1/1     Running   0          38s
deployment-678fcbc488-xkr8x   1/1     Running   0          38s
[root@server2 ~]# vim rs.yaml   拉伸为6个副本
apiVersion: apps/v1
kind: Deployment   
metadata: 
  name: deployment
spec:
  replicas: 6     拉伸为6个副本
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1
[root@server2 ~]# kubectl apply -f rs.yaml   运行
deployment.apps/deployment configured
[root@server2 ~]# kubectl get pod   可以发现生成了6个副本,deployment控制器里面也有rs控制器,所以可以拉伸
NAME                          READY   STATUS    RESTARTS   AGE
deployment-678fcbc488-57q4x   1/1     Running   0          75s
deployment-678fcbc488-6l24d   1/1     Running   0          75s
deployment-678fcbc488-8nhmf   1/1     Running   0          3m35s
deployment-678fcbc488-9brd7   1/1     Running   0          3m35s
deployment-678fcbc488-cmggh   1/1     Running   0          75s
deployment-678fcbc488-xkr8x   1/1     Running   0          3m35s  
[root@server2 ~]#  vim rs.yaml
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: deployment
spec:
  replicas: 3   下降为3个副本
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1
[root@server2 ~]# kubectl apply -f rs.yaml   运行
[root@server2 ~]# kubectl get pod   3个副本
NAME                          READY   STATUS    RESTARTS   AGE
deployment-678fcbc488-57q4x   1/1     Running   0          6m50s
deployment-678fcbc488-9brd7   1/1     Running   0          9m10s
deployment-678fcbc488-cmggh   1/1     Running   0          6m50s

[root@server2 ~]# vim rs.yaml    版本更新
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v2   将版本更新为v2
[root@server2 ~]# kubectl apply -f rs.yaml 
deployment.apps/deployment configured
[root@server2 ~]# kubectl get pod -o wide   查看ip
NAME                          READY   STATUS        RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
deployment-57c78c68df-d5bbz   1/1     Running   0          70s   10.244.1.33   server3   <none>           <none>
deployment-57c78c68df-v69cg   1/1     Running   0          66s   10.244.2.24   server4   <none>           <none>
deployment-57c78c68df-xq7wp   1/1     Running   0          61s   10.244.1.34   server3   <none>           <none>
[root@server2 ~]# curl 10.244.1.34    访问,可以发现版本变成v2   deployment控制器负责版本切换
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a> 

deployment控制器版本更新回退原理

[root@server2 ~]# kubectl get all

在这里插入图片描述
在这里插入图片描述
如果更新了镜像,deployment控制器新建一个rs,原来的rs不动保留,之前rs控制的pod会被回收,新的rs应用新的副本
如果退回原来的版本v1,v2上的rs直接切换到以前保留的版本v1,不用新建,v2上rs控制的pod会被回收

上述操作也可用命令操作
在这里插入图片描述

3、DaemonSet控制器(针对所有节点都要部署一个pod)

[root@server2 ~]# kubectl delete -f  rs.yaml 
deployment.apps "deployment" deleted
[root@server2 ~]# cp rs.yaml ds.yaml
[root@server2 ~]# vim ds.yaml 
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset
spec:
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v2
[root@server2 ~]# kubectl apply -f  ds.yaml   运行
daemonset.apps/daemonset created
[root@server2 ~]# kubectl get ds   部署了两个节点,其中master节点不部署
NAME        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset   2         2         2       2            2           <none>          39s
[root@server2 ~]# kubectl get node    daemonset控制器是根据集群节点数来部署的,每个节点部署一个pod
NAME      STATUS   ROLES                  AGE     VERSION
server2   Ready    control-plane,master   5d7h    v1.23.4
server3   Ready    <none>                 4d22h   v1.23.4
server4   Ready    <none>                 4d22h   v1.23.4

[root@server2 ~]# vim ds.yaml   如果变更镜像版本
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset
spec:
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1    版本变成v1
[root@server2 ~]# kubectl apply -f  ds.yaml   运行
[root@server2 ~]# kubectl get pod -o wide  查看ip
NAME              READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
daemonset-2df5d   1/1     Running   0          68s   10.244.2.26   server4   <none>           <none>
daemonset-ksv2h   1/1     Running   0          72s   10.244.1.36   server3   <none>           <none>
[root@server2 ~]# curl 10.244.1.36   访问,可以发现版本变成v1,所以daemonset控制器也只成版本更新
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server2 ~]# kubectl delete  -f  ds.yaml  删除
daemonset.apps "daemonset" deleted

4、job控制器(仅执行一次任务)

[root@server1 harbor]# docker pull perl  网上拉取perl镜像
[root@server1 harbor]# docker tag perl:latest reg.westos.org/library/perl:latest  改标签
[root@server1 harbor]# docker push reg.westos.org/library/perl:latest  上传到私有仓库
[root@server2 ~]# vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]   容器内运行的指令 ,保留小数点多少位
      restartPolicy: Never   不重启
  backoffLimit: 4   出错次数最大上限为4次
[root@server2 ~]# kubectl apply -f job.yaml  创建
job.batch/pi created
[root@server2 ~]# kubectl get pod   可以发现运行完一次之后直接退出
NAME       READY   STATUS      RESTARTS   AGE
pi-v27nx   0/1     Completed   0          2m10s
[root@server2 ~]# kubectl logs pi-v27nx  输出的信息在日志里保存
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096
[root@server2 ~]# kubectl delete -f job.yaml   删除
job.batch "pi" deleted

5、cronjob 控制器

Cron Job 创建基于时间调度的 Jobs。
一个 CronJob 对象就像 crontab (cron table) 文件中的一行,它用 Cron 格式进行编写,并周期性地在给定的调度时间执行 Job。

Cron 时间表语法

# ┌───────────── 分钟 (0 - 59)
# │ ┌───────────── 小时 (0 - 23)
# │ │ ┌───────────── 月的某天 (1 - 31)
# │ │ │ ┌───────────── 月份 (1 - 12)
# │ │ │ │ ┌───────────── 周的某天 (0 - 6) (周日到周一;在某些系统上,7 也是星期日)
# │ │ │ │ │                                   
# │ │ │ │ │
# │ │ │ │ │
# * * * * *

[root@server2 ~]# vim cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "* * * * *"   表示每分钟
  jobTemplate:   job模板
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            imagePullPolicy: IfNotPresent    
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster       在shell里面执行date命令
          restartPolicy: OnFailure   表示只要出错,就重启
[root@server2 ~]# kubectl apply -f cronjob.yaml  运行
Warning: batch/v1beta1 CronJob is deprecated in v1.21+, unavailable in v1.25+; use batch/v1 CronJob   版本 太低
[root@server2 ~]# kubectl api-versions  查看版本

在这里插入图片描述

[root@server2 ~]# kubectl get pod   每分钟运行
NAME                   READY   STATUS      RESTARTS   AGE
hello-27465276-mtdsr   0/1     Completed   0          2m5s
hello-27465277-9pnb9   0/1     Completed   0          65s
hello-27465278-5qbsj   0/1     Completed   0          5s
[root@server2 ~]# kubectl logs hello-27465278-5qbsj  查看日志里的输出
Tue Mar 22 02:38:01 UTC 2022
Hello from the Kubernetes cluster
[root@server2 ~]# kubectl delete  -f cronjob.yaml   删除
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐