Kubernetes 控制器介绍
控制器是K8S中非常重要的存在,每种控制器都处理不同的任务,它主要用来控制Pod的状态和行为.
为什么要使用控制器
K8S 是容器资源管理和调度平台,容器跑在Pod里,Pod是K8S里最小的单元。所以,这些Pod作为一个个单元我们肯定需要去操作它的状态和生命周期。那么如何操作?这里就需要用到控制器了.
Kubernetes中,应用一般分为无状态应用、有状态应用、守护型应用、批处理应用这四种。
无状态应用:应用实例不涉及事务交互,不产生持久化数据存储在本地,并且多个应用实例对于同一个请求响应的结果是完全一致的。举例:nginx或者tomcat
有状态应用:有状态服务可以说是需要数据存储功能的服务或者指多线程类型的服务、队列等。举例:mysql数据库、kafka、redis、zookeeper等。
守护型应用:类似守护进程一样,长期保持运行,监听持续的提供服务。举例:ceph、logstash、fluentd等。
批处理应用:工作任务型的服务,通常是一次性的。举例:运行一个批量改文件夹名字的脚本。
控制器 (工作负载) 类型
(1). Deployment
(2). StatefulSet
(3). DaemonSet
(4). Job
(5). CronJob
K8S控制器介绍
一、 Deployment
1. Deployment介绍
• 部署无状态应用
• 管理Pod 和 ReplicaSet(用于管理pod副本数,版本的控制 一个隐藏控制器)
• 具有上线部署、副本设定、滚动升级、回滚等功能
• 提供声明式更新(指定更新某个字段,两个用户同时更新会合并更新),例如只更新一个新的Image
2. Deployment应用
主要应用无状态应用,如Web服务,Nginx和tomcat
apiVersion: apps/v1 kind: Deployment # 定义是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
二. SatefulSet
1. SatefulSet介绍
部署有状态应用, 解决Pod独立生命周期,保持Pod启动顺序和唯一性
(1). 稳定,唯一的网络标识符,持久存储
(2). 有序,优雅的部署和扩展、删除和终止
(3). 有序,滚动更新
应用场景:数据库 (Mysql、zookeper)
那么StatefulSet如何做到Pod的稳定、有序?具体有了哪些内在机制和方法?主要概况起来有这几个方面:
给Pod一个唯一和持久的标识(例:Pod name)
给予Pod一份持久化存储
部署Pod都是顺序性的,0 ~ N-1
扩容Pod必须前面的Pod还存在着
终止Pod,后面Pod也一并终止
举个例子:创建了zk01、zk02、zk03 三个Pod,zk01就是给的命名,如果要扩容zk04,那么前面01、02、03必须存在,否则不成功;如果删除了zk02,那么zk03也会被删除.
2.SatefulSet应用
创建一个headless servive 和 statefulset及pod, 在创建statefulset时指定 serviceName,serviceName是用于保持Pod身份, Pod 删除重建pod NAME 不会变化。
# cat states.yaml apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1beta1 kind: StatefulSet metadata: name: nginx-statefulset namespace: default spec: serviceName: nginx replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
创建及查看pod:
# kubectl create -f states.yaml # kubectl get pod NAME READY STATUS RESTARTS AGE nginx-statefulset-0 1/1 Running 0 98s nginx-statefulset-1 1/1 Running 0 96s nginx-statefulset-2 1/1 Running 0 92s
3. 无状态与有状态服务的区别
无状态:
(1) deployment任务所有pod都是一样的
(2) 不用考虑pod启动的顺序要求
(3) 不用考虑在哪个node上运行
(4) 随意扩容/缩容
有状态:
(1) pod 之间有关系,数据完全不一致,如etcd节点之间的关系,配置不一致
(2) 实例之间不对等的关系,以及依靠外部存储的应用
(3) StatefulSet是有身份的(唯一网络标识符)
(4) 有序,优雅的部署和扩展、删除和终止
(5) 有序,滚动更新
StatefulSet身份(唯一网络标识符)三要素:
• 域名
• 主机名
• 存储(PVC)
ClusterIP A记录格式: <service-name>.<namespace-name>.svc.cluster.local ClusterIP=None A记录格式: <statefulsetName-index>.<service-name>.<namespace-name>.svc.cluster.local 示例: nginx-statefulset-0.nginx.default.svc.cluster.local
三. DaemonSet
1. DaemonSet介绍及应用场景
• 在每一个Node上运行一个Pod
• 新加入的Node也同样会自动运行一个Pod
• 应用场景:Agent
实例链接地址:https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/
2. DaemonSet应用
# cat filebeat-daemonset.yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: filebeat-daemonset labels: app: filebeat spec: selector: matchLabels: app: filebeat template: metadata: labels: app: filebeat spec: containers: - name: logs image: nginx:1.15.4 ports: - containerPort: 80 volumeMounts: - name: varlog mountPath: /tmp/log volumes: - name: varlog hostPath: path: /var/log # kubectl create -f filebeat-daemonset.yaml daemonset.apps/filebeat-daemonset created # kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE filebeat-daemonset-987j6 1/1 Running 0 3m9s 172.17.31.12 10.40.6.210 <none> filebeat-daemonset-pjlh4 1/1 Running 0 3m9s 172.17.59.11 10.40.6.213 <none> # kubectl exec -it filebeat-daemonset-987j6 bash root@filebeat-daemonset-987j6:/# ls /tmp/log/
四. Job批处理
Job分为普通任务(Job)和定时任务(CronJob)
1. 普通任务(Job)
• 一次性执行
应用场景:离线数据处理,视频解码等业务
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 # kubectl get pod NAME READY STATUS RESTARTS AGE nfs-client-provisioner-6b94d96994-bhc5r 1/1 Running 0 8d pi-vg7t9 0/1 Completed 0 4m34s # kubectl log pi-vg7t9
2. 定时任务(CronJob)
定时任务,像Linux的Crontab一样。
• 循环定时任务
应用场景:通知,备份
# cat cronjob.yaml 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 # kubectl create -f ronjob.yaml # kubectl get cronjob \NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE hello */1 * * * * False 1 15s 5m53s # kubectl get pod NAME READY STATUS RESTARTS AGE hello-1561304400-hbh9j 0/1 Completed 0 99s hello-1561304460-l9tnh 0/1 Completed 0 39s # kubectl log hello-1561304460-l9tnh log is DEPRECATED and will be removed in a future version. Use logs instead. Sun Jun 23 15:41:10 UTC 2019 Hello from the Kubernetes cluster
五. 小结
Deployment 无状态部署
StatefulSet 有状态部署
DaemonSet 守护进程部署
Job & CronJob 批处理
参考文档:https://www.jianshu.com/p/aaae5ea7f7ff

浙公网安备 33010602011771号