0
点赞
收藏
分享

微信扫一扫

K8S-[二]Deployment控制器

MaxWen 2021-09-26 阅读 77

工作负载控制器(Workload Controllers)是K8s的一个抽象概念,用于更高级层次对象,部署和管理Pod。
常用工作负载控制器:
• Deployment : 无状态应用部署
• StatefulSet : 有状态应用部署
• DaemonSet : 确保所有Node运行同一个Pod
• Job : 一次性任务
• Cronjob : 定时任务

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


Deployment控制器

功能:

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

应用场景:网站、API、微服务

一. 部署

第一次写deploy的yaml可以用命令导出的方式获取模板,在进行删减。

kubectl create deployment web --image=nginx:1.15 -o yaml > deploy.yaml

最终版deployment的yaml:
deploy就是管理Pod的,所以关于对Pod管理的配置都可以放在这个配置文件,如资源配额(resource),污点容忍(tolrations),健康检查(linvenessProbe)等

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy  #deployment控制器名,也是以后创建完Pod,pod名字的前缀
  namespace: default
spec:
  replicas: 2 #期望创建pod副本的数量
  selector:
    matchLabels:
      app: nginx-pod     #定义 pod 的标签,app=nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod  #定义 pod 的标签,app=nginx-pod 要和selector的标签一致
    spec:
      #这块区域下是pod具体配置,可以配置调度策略等等。
      containers:
      - image: nginx:1.15
        name: mynginx
        resources: {}

部署:

kubectl apply -f deploy.yaml

查看:


暴露到外部访问:

kubectl expose deployment nginx-deploy --port=85 --target-port=80 --type=NodePort
[root@k8s-master pod_yml]# kubectl get svc
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
nginx-deploy     NodePort    10.103.100.155   <none>        85:32149/TCP   6s

输入http://NodeIP:32149访问

二.滚动升级

应用的升级其实就是换个镜像,更新镜像的三种方式
• kubectl apply -f xxx.yaml
• kubectl set image deployment/web nginx=nginx:1.16 (这个好处是这样回滚的时候可看到版本记录)
• kubectl edit deployment/web

滚动升级:K8s对Pod升级的默认策略,通过使用新版本Pod逐步更新旧版本Pod,实现零停机发布,用户无感知。

原理: 对Pod的升级,是先启动一个新的pod ,并启动。如果配了健康检查会在健康检查后完全没问题,出现running状态,才删掉一个旧pod。在启动一个新的,在删掉一个旧的。反复下去,这一切也都是deployment控制的。滚动升级在k8s中,也是由1个deployment 和 2个 replicaset 实现的。2个replicaset分别控制 增加新启动Pod副本数量;减少原pod的副本数量。 加一减一的原则。达到用户无感知。

升级:将nginx 1.15 升级到1.18

集群内部访问一下service的集群IP,看下nginx此时版本是1.15

[root@k8s-node2 ~]# curl 10.104.95.173 -I
HTTP/1.1 200 OK
Server: nginx/1.15.12

编辑delpoy.yaml,修改镜像版本为1.18

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - image: nginx:1.18
        name: mynginx
        resources: {}
        livenessProbe:
          httpGet:
            path: /index.html
            port: 80
          initialDelaySeconds: 10 #启动容器后多少秒健康检查
          periodSeconds: 10 #以后间隔多少秒检查一次
应用:
kubectl apply -f  delpoy.yaml
查看过程:

图中可看到,k8s先启动了2个新pod, 在新pod成功运行后,再删除一个旧的。直到最后成功更新2个Pod。


[root@k8s-node2 ~]# curl 10.104.95.173 -I
HTTP/1.1 200 OK
Server: nginx/1.18.0
可设置滚动更新策略:
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数量是可用状态。

回滚到上一版本:

kubectl rollout undo deployment nginx-deploy

三.水平扩容(启动多实例,提高并发)

deployment中replicas参数控制Pod副本数量


两种方式:
  • 1.修改yaml文件中的replicas值,在进行apply
    1. 命令: kubectl scale deployment 控制器名 --replicas=期望pod副本数
扩容:现在我有两个Pod ,想扩容到5个。
 kubectl scale deployment nginx-deploy --replicas=5

关于ReplicaSet

ReplicaSet控制器用途:
• Pod副本数量管理,不断对比当前Pod数量与期望Pod数量,一直循环这个过程。
• Deployment每次发布都会创建一个RS作为记录,用于实现回滚

所以刚才实现扩容都是ReplicaSet控制器做的。
可以查看ReplicaSet(RS)的信息

kubectl get rs #查看RS记录
kubectl describe rs nginx-deploy-6447c4cd45 #具体rs的信息记录
kubectl rollout history deployment nginx-deploy #版本对应RS记录

四. 下线

项目的下线很简单。删除对应的deploy控制器,svc 即可。
如果是用deploy创建的pod,那么直接删除Pod 是不起作用的,还会被拉起来,反复循环。这都是因为上面说的deployment控制器中的replicaset 一直在循环一个动作 : 对比当前pod数量是否和期望的一样,不一样就拉起。所以不能直接删除pod。

 kubectl delete deploy nginx-deploy 

 kubectl delete svc nginx-deploy 

定时任务CronJob

CronJob用于实现定时任务,像Linux的Crontab一样。
• 定时任务
应用场景:通知,备份
cronjob.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello-cron
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello word
          restartPolicy: OnFailure

每过一分钟会启动这个pod,执行定义的命令

[root@k8s-master pod_yml]# kubectl get pod 
NAME                          READY   STATUS      RESTARTS   AGE
hello-cron-1623743640-v9kd2   0/1     Completed   0          2m32s
hello-cron-1623743700-qp4s8   0/1     Completed   0          92s
hello-cron-1623743760-wbv6k   0/1     Completed   0          32s

[root@k8s-master pod_yml]# kubectl logs hello-cron-1623743760-wbv6k
Tue Jun 15 07:56:18 UTC 2021
Hello word
举报

相关推荐

0 条评论