工作负载控制器(Deployment,DaemonSet,Job

2021-11-17  本文已影响0人  小李飞刀_lql

控制器的作用

• 管理Pod对象
• 使用标签与Pod关联
• 控制器实现了Pod的运维,例如滚动更新、伸缩、副本管理、维护Pod状态等

常用工作负载控制器

• Deployment : 无状态应用部署
• StatefulSet : 有状态应用部署
• DaemonSet : 确保所有Node运行同一个Pod
• Job : 一次性任务
• Cronjob : 定时任务

Deployment

功能

• 管理Pod和ReplicaSet
• 具有上线部署、副本设定、滚动升级、回滚等功能
• 提供声明式更新,例如只更新一个新的Image

使用流程

1636943814660.png

部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: web
        image: nginx:1.16
----------------------------------------------------------------------
[root@k8smaster control]# kubectl apply -f web.yaml 
deployment.apps/web created

[root@k8smaster control]# kubectl expose deployment web --port=80 --target-port=80 --type=NodePort
service/web exposed

[root@k8smaster control]# kubectl get svc             
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
web          NodePort    10.105.130.47   <none>        80:31249/TCP   78s

[root@k8smaster control]# kubectl get ep
NAME         ENDPOINTS                                            AGE
kubernetes   192.168.153.21:6443                                  15d
web          10.244.249.50:80,10.244.249.53:80,10.244.249.62:80   2m5s
        

滚动升级

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: web
        image: nginx:1.17
----------------------------------------------------------------------
[root@k8smaster control]# kubectl describe deployment web
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  12m    deployment-controller  Scaled up replica set web-84b7cd6c7c to 3
  Normal  ScalingReplicaSet  3m11s  deployment-controller  Scaled up replica set web-6fbb9b87dd to 1
  Normal  ScalingReplicaSet  22s    deployment-controller  Scaled down replica set web-84b7cd6c7c to 2
  Normal  ScalingReplicaSet  22s    deployment-controller  Scaled up replica set web-6fbb9b87dd to 2
  Normal  ScalingReplicaSet  21s    deployment-controller  Scaled down replica set web-84b7cd6c7c to 1
  Normal  ScalingReplicaSet  21s    deployment-controller  Scaled up replica set web-6fbb9b87dd to 3
  Normal  ScalingReplicaSet  19s    deployment-controller  Scaled down replica set web-84b7cd6c7c to 0
1636945487783.png
001 K8s对Pod升级的默认策略
002 通过使用新版本Pod逐步更新旧版本Pod
003 实现零停机发布,用户无感知

滚动更新策略:
spec:
  replicas: 3
  revisionHistoryLimit: 10 # RS历史版本保存数量
  selector:
    matchLabels:
      app: web
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate

maxSurge:滚动更新过程中最大Pod副本数,确保在更新时启动的Pod数量比期望(replicas)Pod数量最大多出25%

maxUnavailable:滚动更新过程中最大不可用Pod副本数,确保在更新时最大25% Pod数量不可用,即确保75% Pod数量是可用状态

水平扩缩容

001 修改yaml里replicas值,再apply
002 kubectl scale deployment web --replicas=5

-------------------------------------------------------------------------------
[root@k8smaster control]# kubectl scale deployment web --replicas=5
deployment.apps/web scaled
[root@k8smaster control]# kubectl get pod
NAME                   READY   STATUS    RESTARTS   AGE
web-6fbb9b87dd-4dmfn   1/1     Running   0          7s
web-6fbb9b87dd-gf2dw   1/1     Running   0          14m
web-6fbb9b87dd-kswvb   1/1     Running   0          11m
web-6fbb9b87dd-pv4hc   1/1     Running   0          7s
web-6fbb9b87dd-smzgn   1/1     Running   0          11m

[root@k8smaster control]# kubectl get ep
NAME         ENDPOINTS                                                       AGE
kubernetes   192.168.153.21:6443                                             15d
web          10.244.249.49:80,10.244.249.54:80,10.244.249.6:80 + 2 more...   22m

ReplicaSet

001 Pod副本数量管理,不断对比当前Pod数量与期望Pod数量
002 Deployment每次发布都会创建一个RS作为记录,用于实现回滚
003 kubectl get rs -o wide #查看RS记录
004 kubectl describe rs web-6fbb9b87dd  找出相应的镜像版本和升级版本
004 kubectl rollout history deployment web #版本对应RS记录


[root@k8smaster control]# kubectl get rs -o wide
NAME             DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES       SELECTOR
web-6fbb9b87dd   5         5         5       18m   web          nginx:1.16   app=nginx,pod-template-hash=6fbb9b87dd
web-84b7cd6c7c   0         0         0       27m   web          nginx:1.15   app=nginx,pod-template-hash=84b7cd6c7c

[root@k8smaster control]# kubectl describe rs web-6fbb9b87dd
  deployment.kubernetes.io/revision: 2
  Containers:
   web:
    Image:        nginx:1.16

回滚

001 kubectl rollout history deployment/web # 查看历史发布版本
002 kubectl rollout undo deployment/web # 回滚上一个版本
003 kubectl rollout undo deployment/web --to-revision=2 # 回滚历史指定版本


[root@k8smaster control]# kubectl rollout history deployment web
deployment.apps/web 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

[root@k8s-master control]# kubectl rollout undo deployment web --to-revision=1  
deployment.apps/web rolled back

[root@k8s-master control]# kubectl rollout undo deployment web 
deployment.apps/web rolled back

删除

001 kubectl delete deploy/web
002 kubectl delete svc/web

[root@k8smaster control]# kubectl delete deploy web
deployment.apps "web" deleted
[root@k8smaster control]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        15d
web          NodePort    10.105.130.47   <none>        80:31249/TCP   37m
[root@k8smaster control]# kubectl delete svc web
service "web" deleted

DaemonSet

功能

001 在每一个Node上运行一个Pod
002 新加入的Node也同样会自动运行一个Pod

应用场景

001 网络插件(kube-proxy、calico)、其他Agent

示例

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat
  namespace: kube-system
spec:
  selector:
    matchLabels:
      name: filebeat
  template:
    metadata:
      labels:
        name: filebeat
    spec:
      tolerations:
      - effect: NoSchedule
        operator: Exists
      containers:
      - name: log
        image: elastic/filebeat:7.3.2
        
 -----------------------------------------------------------------------------
 001 配置污点容忍是可以分配到master节点上
 
[root@k8smaster DaemonSet]# kubectl apply -f filebeat.yaml 
daemonset.apps/filebeat created
查看
[root@k8smaster DaemonSet]# kubectl get pod -n kube-system -o wide  |grep filebeat
filebeat-4rl4r Running 10.244.249.4  k8snode1
filebeat-ppxxp Running 10.244.16.145 k8smaster

#查看daemonset
[root@k8smaster DaemonSet]# kubectl get daemonset -n kube-system
NAME          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR       
filebeat      2         2         2       2            2 
 
#删除 daemonset
[root@k8smaster DaemonSet]# kubectl delete daemonset filebeat -n kube-system
daemonset.apps "filebeat" deleted

Job

功能

001 一次性执行
002 应用场景:离线数据处理,视频解码等业务

示例

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
      
-----------------------------------------------------------------------------------
001 因为是一次性执行,无论成功还是失败,都不执行第二个,所以【restartPolicy: Never】
002 只执行一次,执行完状态是Completed

[root@k8smaster job]# kubectl get pod
NAME       READY   STATUS      RESTARTS   AGE
pi-267pf   0/1     Completed   0          6m34s

[root@k8smaster job]# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
pi     1/1           4m57s      7m24s

[root@k8smaster job]# kubectl logs pi-267pf
3.1415926535897932384626433832795028841971693993751...

[root@k8smaster job]# kubectl delete job pi
job.batch "pi" deleted

CronJob

功能

001 用于实现定时任务 
002 应用场景:通知,备份

示例

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello aliang
          restartPolicy: OnFailure
---------------------------------------------------------------------------
[root@k8smaster CronJob]#  kubectl get cronjob
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        42s             74s

#每一分钟生成一个pod
[root@k8smaster CronJob]# kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
hello-1636964640-nnfrr   0/1     Completed           0          2m17s
hello-1636964700-pbwkw   0/1     Completed           0          76s
hello-1636964760-klb6s   0/1     ContainerCreating   0          16s

#查看日志
[root@k8smaster CronJob]# kubectl logs  hello-1636964760-klb6s   
Mon Nov 15 08:26:21 UTC 2021
Hello aliang

#删除cronjob
[root@k8smaster CronJob]# kubectl delete cronjob hello
cronjob.batch "hello" deleted
上一篇 下一篇

猜你喜欢

热点阅读