深入理解常用控制器

Pod与controllers的关系

  • controllers:在集群上管理和运行容器的对象
  • 通过label-selector相关联
  • Pod通过控制器实现应用的运维,如伸缩,滚动升级等

image.png

一般在部署应用的时候很少直接部署pod,都是通过控制器来部署。

Deployment

Deployment功能: 

  • 部署无状态应用

无状态和有状态部署的区别

无状态服务,K8S使用RC(或更新的Replica Set)来保证一个服务的实例数量,如果说某个Pod实例由于某种原因Crash了,RC会立刻用这个Pod的模版新启一个Pod来替代它,由于是无状态的服务,新启的Pod与原来健康状态下的Pod一模一样。在Pod被重建后它的IP地址可能发生变化,为了对外提供一个稳定的访问接口,K8S引入了Service的概念。一个Service后面可以挂多个Pod,实现服务的高可用。

普通有状态服务,和无状态服务相比,它多了状态保存的需求。Kubernetes提供了以Volume和Persistent Volume为基础的存储系统,可以实现服务的状态保存。

有状态集群服务,与普通有状态服务相比,它多了集群管理的需求。K8S为此开发了一套以Pet Set为核心的全新特性,方便了有状态集群服务在K8S上的部署和管理。具体来说是通过Init Container来做集群的初始化工作,用 Headless Service 来维持集群成员的稳定关系,用动态存储供给来方便集群扩容,最后用Pet Set来综合管理整个集群。

  • 管理Pod和ReplicaSet 
  • 具有上线部署、副本设定、滚动升级、回滚等功能
  • 提供声明式更新,例如只更新一个新的Image 应用场景:Web服务,微服务
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
          - containerPort: 80
kubectl apply -f nginx-deployment.yaml
kubectl expose deployment nginx-deployment  --port=80 --type=NodePort --target-port=80 --name=web

image.png

image.png

image.png

curl k8s-node1:31109
curl k8s-node2:31109

#创建
kubectl create deployment web --image=nginx:1.14
kubectl get deploy,pods
#发布
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web
kubectl get service
#升级
kubectl set image deployment/web nginx=nginx:1.15
kubectl rollout status deployment/web
#回滚
kubectl rollout history deployment/web
kubectl rollout undo deployment/web
kubectl rollout undo deployment/web --to-revision=2  #revision表示具体第几次发布
#扩容/缩容
kubectl scale deployment nginx-deployment --replicas=10

当执行升级应用,rs采用的是k8s的默认滚动更新机制

kubectl set image deployment/nginx-deployment nginx=nginx:1.15

kubectl describe deploy nginx-deployment 

image.png

应用回滚版本

image.png

image.png

执行回滚,应用的版本 从 nginx:1.15 回滚到 nginx:latest

image.png

执行具体版本回滚,应用会准确的回滚到具体版本,nginx:1.15对应的revision 为2

image.png

image.png

应用扩容 将原先的 3副本 扩容成 5副本

image.png

image.png

应用缩容,将原先的5副本缩容为3副本

image.png

deployment 是使用最广泛的一种控制器

DaemonSet

DaemonSet功能:

• 在每一个Node上运行一个Pod

• 新加入的Node也同样会自动运行一个Pod

应用场景:Agent

image.png

DaemonSet 官网:https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: zabbix-daemonset
  namespace: default
spec:
  selector:
    matchLabels:
      app: zabbix
  template:
    metadata:
      labels:
        app: zabbix
    spec:
      containers:
        - name: zabbix
          image: zabbix/zabbix-agent
          ports:
          - containerPort: 80

image.png

Job

Job分为普通任务(Job)和定时任务(CronJob)

• 一次性执行

应用场景:离线数据处理,视频解码等业务

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

image.png

计算pi

image.png

job官网:https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/

CronJob

定时任务,像Linux的Crontab一样。

• 定时任务

应用场景:通知,备份

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 from the Kubernetes cluster
          restartPolicy: OnFailure

image.png

image.png

 
 
原文地址:https://www.cnblogs.com/benjamin77/p/12446749.html