公有云容器化指南:腾讯云TKE实战与应用
上QQ阅读APP看书,第一时间看更新

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文件来操作。网上有很多控制器运行的例子,我们只要参考样例自己部署一个,其他的类型也就会了。