什么是控制器

kubernetes 中有很多中controller,其相当于一个状态机,用来控制Pod的状态和行为。

控制器类型

ReplicationController(RC) && ReplicationSet(RS)

用来确保容器应用的副本数维持在用户的期望数目。容器异常,创建新的,删除旧的。
新版本Kubernets 官方抛弃RC使用RS ,因为RS支持集合式selector(通过标签),标签作用

Delpoyment

RS不支持滚动更新(rolling-update),而Deployment支持.但是Deployment不直接负责Pod创建。Deployment为RS 和Pod 提供声明式方法,举例演示

Deployment应用场景:

  • 定义Deployment为了创建Pod和RS
  • 滚动升级,应用回滚
  • 扩容,缩容
  • 暂停继续

    Deployment控制滚动更新过程示例:

  1. Deployment 创建RS
  2. Deployment创建新版本的RS(副本)
  3. RS(副本)创建pod(新版本),创建完毕RS删除pod
  4. 至此完成滚动更新,回滚亦是如此

image.png

Horizontal Pod Autoscaling

不算一种控制器,可以成为其他控制器操作的指标,其可以说是其他控制器的附属。仅适用于Deployment 和ReplicationSet

  • v1版本仅支持根据Pod的CPU利用率扩容
  • v1alpha版本支持根据内存和用户自定义的metric扩缩容

statefulSet

为了解决有状态服务的问题

  • 稳定的持久化存储,Pod 重新调度之后依然可以访问相同的持久化数据,基于PVC 实现
  • 稳定的网络标志,调度之后PodName和HostName 不变,基于Headless Servcie 实现
  • 有序部署,pod部署扩展顺序执行,下一个Pod的运行建立在之前的Pod都是Running和Ready状态。基于init containers实现
  • 有序收缩

DaemonSet

保证部分或者全部Node上运行一个Pod副本。新Node加入集群,会为其新增一个Pod,删除DaemonSet会删除他创建的所有Pod.移除node会删除DaemonSet为其创建的Pod.

应用场景:

  • 运行集群存储Daemon,每个Node上运行glusterd,ceph.
  • 每个Node上运行日志收集Daemon,例如fluentd或者logsatsh
  • 为每个Node运行监控Daemon,例如Prometheus Node Exporter.

Job

负责批处理任务,仅执行一次的任务。

Cron Job

version >=1.8

  • 定时执行一次任务
  • 周期给定时间点运行

目标

RS和Pod关系

RSMakePod.yaml

  1. apiVersion: apps/v1
  2. kind: ReplicaSet
  3. metadata:
  4. name: frontend
  5. spec:
  6. replicas: 3 # 期望副本数
  7. selector: # 标签选择器
  8. matchLabels:
  9. tier: frontend
  10. template:
  11. metadata:
  12. labels:
  13. tier: frontend
  14. spec:
  15. containers:
  16. - name: redis
  17. image: redis:latest
  18. ports:
  19. - containerPort: 80
  20. env:
  21. - name: GET_HOST_FROM
  22. value: dns

此时查看pod:kubectl get pods
image.png
让我们删除这些pod(kubectl delete pod -all) 然后再查看会发现Pod被新增了(kubectl get pods ).RS 帮我们维持pod稳定在我们期望的一个状态( replicas: 3
image.png
查看标签信息pod (get pod —show-labels)
image.png
强制修改其中的一个pod标签名字(kubectl label pod frontend-nn8v4 tier=frontend2),会发现此时pod 变成了四个。
image.png
这时候我们删除所有pod ,会发现标签为frontend的pod 数目被维持在期望值,而标签为frontend2 的pod则因为没有被管理而被删除了
image.png
此时在做一次强制修改标签的操作,然后删除此RS(kubectl delete rs frontend ),会发现只有名字frontend的RS下的pod被删除,其他未被此RS的Pod不受影响。
这能看出RS通过标签去管理自己旗下的pod,不匹配的pod不在自己的管理范围。

Deployment操作Pod

deployment.yaml。

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-deployment
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: nginx
  9. replicas: 3
  10. template:
  11. metadata:
  12. labels:
  13. app: nginx
  14. spec:
  15. containers:
  16. - name: nginx
  17. image: nginx:latest
  18. ports:
  19. - containerPort: 80
  1. kubectl create -f deployment.yaml --record
  2. # record 帮助查看revision的变化,比如查看deployment history的时候

查看Deployment/RS/pod

  1. kubectl get pod --all --show-labels

image.png 扩容:将pod期望数目扩充至7个,可以看见这个pod 数量变化,但是RS没有变化

  1. kubectl scale deploy nginx-deployment --replicas=7

image.png
更新镜像

  1. kubectl set image deployment/nginx-deployment nginx:1.9.1

此时会触发新的RS的创建。
image.png
回滚:我们将版本回滚至第一个版本.

  1. kubectl rollout undo deployment/nginx-deployment

image.png
获取上一次回滚的退出码
image.png
rollout常用命令

  1. kubectl rollout status deployment/deployname # 查看回滚状态
  2. kubectl rollout history deployment/deployname # 查看回滚历史
  3. kubectl rollout undo deployment/deployname --to-revision=2 #回滚至某个版本
  4. kubectl rollout pause deployment/deployname # 暂停更新

DaemonSet

  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4. name: daemonset-test
  5. labels:
  6. app: daemonset
  7. spec:
  8. selector:
  9. matchLabels:
  10. name: daemonset-test
  11. template:
  12. metadata:
  13. labels:
  14. name: daemonset-test
  15. spec:
  16. containers:
  17. - name: busybox
  18. image: busybox

删除此pod ,会发现为了保持单个node1个副本的数量,会重新创建pod

Job&& CronJob

  1. apiVersion: batch/v1
  2. kind: Job
  3. metadata:
  4. name: pi
  5. spec:
  6. template:
  7. spec:
  8. containers:
  9. - name: pi
  10. image: perl
  11. command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
  12. restartPolicy: Never
  13. backoffLimit: 4
  1. apiVersion: batch/v1beta1
  2. kind: CronJob
  3. metadata:
  4. name: hello
  5. spec:
  6. schedule: "*/1 * * * *"
  7. jobTemplate:
  8. spec:
  9. template:
  10. spec:
  11. containers:
  12. - name: hello
  13. image: busybox
  14. imagePullPolicy: IfNotPresent
  15. command:
  16. - /bin/sh
  17. - -c
  18. - date; echo Hello from the Kubernetes cluster
  19. restartPolicy: OnFailure