2.7 五种Kubernetes控制器
Kubernetes控制器是非常重要的存在,不同的控制器负责处理不同的任务,它们主要用来控制Pod的状态和行为。
2.7.1 为什么要有控制器
Kubernetes是容器资源管理和调度平台,容器在Pod里运行,Pod是Kubernetes的最小单元。我们要操作Pod的状态和生命周期,就需要用到控制器。
有一个比较通俗的公式:应用=网络+载体+存储。应用组成可以用图2-16表示。
图2-16 应用组成
这里的应用一般分为无状态应用、有状态应用、守护型应用和批处理应用4种。
1.无状态应用
应用实例不涉及事务交互,不产生持久化数据,并且多个应用实例对于同一个请求响应的结果是完全一致的,例如Nginx、Tomcat。
2.有状态应用
有状态应用需要数据存储功能的服务或多线程类型的服务、队列等支持,例如MySQL数据库、Kafka、Redis、ZooKeeper。
3.守护型应用
守护进程保持长期运行,监听持续提供服务,例如Ceph、Logstash、Fluentd。
4.批处理应用
工作任务型的应用通常是一次性的,例如运行一个批量改文件夹名字的脚本。
以上这些类型的应用如果是安装在传统的物理机或者虚拟机上,我们一般会通过手动或自动化工具的方式去管理编排。但是这些应用一旦容器化运行在Pod里,就应该按照Kubernetes的控制方式来管理。在2.6节中,我们讲到了编排,Kubernetes是通过什么工具具体操作编排的呢?答案就是控制器。
2.7.2 Kubernetes有哪些控制器
既然应用的类型分为无状态和有状态,那么Kubernetes肯定要实现一些控制器来专门处理对应类型的应用。总体来说,Kubernetes有5种控制器,分别对应处理无状态应用、有状态应用、守护型应用和批处理应用。
1.Deployment
Deployment的中文意思为部署、调度,我们可以简单地将其理解为一种通过YAML文件的声明,在Deployment文件里可以定义Pod数量、更新方式、使用的镜像、资源限制等,通过Deployment我们能操作RS(ReplicaSet)。无状态应用都用Deployment创建。
apiVersion: extensions/v1beta1kind: Deployment # 定义是Deploymentmetadata: name: nginx-deploymentspec: replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.8.0 ports: - containerPort: 80
2.StatefulSet
StatefulSet的出现使Kubernetes实现了“有状态”应用落地,Stateful这个单词本身就是“有状态”的意思。之前大家一直怀疑有状态应用落地Kubernetes的可行性,StatefulSet有效解决了这个问题。有状态应用一般都需要具备一致性,它们有固定的网络标记、持久化存储、顺序部署和扩展、顺序滚动更新。
StatefulSet通过以下几个方面实现Pod的稳定、有序。
1)给Pod一个唯一和持久的标识(如Pod名称)。
2)给Pod一份持久化存储。
3)部署Pod都是顺序性的,0~N-1。
4)扩容Pod时,前面的Pod必须还存在着。
5)终止Pod时,后面Pod也一并终止。
举个例子:创建3个Pod,分别是zk01、zk02、zk03,如果要扩容zk04,那么前面zk01、zk02、zk03必须存在,否则扩容不成功;如果删除了zk02,那么zk03也会被删除。
3.DaemonSet
Daemon本身就是守护进程的意思,那么很显然,DaemonSet就是Kubernetes里实现守护进程机制的控制器。比如我们需要在每个节点里部署Fluentd采集容器日志,就可以采用DaemonSet机制部署,它的作用就是确保全部节点(或者指定的节点数)里运行一个Fluentd Pod副本。当有节点加入集群时,也会新增一个Pod;当有节点从集群移除时,这些Pod也会被回收;删除DaemonSet将会删除它创建的所有Pod。
所以,DaemonSet特别适合运行那些静默在后台运行的应用,而且是连带性质的,非常方便。
4.Job
Job就是任务,我们时常批处理运行一些自动化脚本或者Ansible,在Kubernetes里我们用Job运行批处理任务。
5.CronJob
在IT环境里,经常遇到一些需要定时启动任务。传统的Linux里我们运行定义crontab即可,在Kubernetes里用CronJob控制器定时启动任务。其实CronJob就是上面Job的加强版,带时间定点运行功能。
例子:每一分钟输出一句“2019-08-25 08:08:08 Hello Kubernetes!”
apiVersion: batch/v1beta1 kind: CronJob # 定义CronJob类型 metadata: name: hello spec: schedule: "*/1 * * * *" # 定义定时任务运行 jobTemplate: spec: template: spec: containers: - name: hello image: busybox args: - /bin/sh - -c - date; echo Hello Kubernetes! restartPolicy: OnFailure
以上就是对Kubernetes的5种控制器的介绍,这5种控制器对应4种类型应用的编排处理。这5种控制器到底怎么用呢?很简单,还是通过编写、运行YAML文件来操作。网上有很多控制器运行的例子,我们只要参考样例自己部署一个,其他的类型也就会了。