专栏首页宝哥的专栏Kubernetes系列学习文章 - 五种控制器(七)
原创

Kubernetes系列学习文章 - 五种控制器(七)

| 导语 K8S的控制器是非常重要的存在,每种控制器都处理不同的任务,它主要用来控制Pod的状态和行为。

一、为什么要有控制器

K8S是容器资源管理和调度平台,容器跑在Pod里,Pod是K8S里最小的单元。所以,这些Pod作为一个个单元我们肯定需要去操作它的状态和生命周期。那么如何操作?这里就需要用到控制器了。

这里一个比较通俗的公式:应用APP = 网络 + 载体 + 存储

这里应用一般分为无状态应用、有状态应用、守护型应用、批处理应用这四种。

无状态应用:应用实例不涉及事务交互,不产生持久化数据存储在本地,并且多个应用实例对于同一个请求响应的结果是完全一致的。举例:nginx或者tomcat

有状态应用:有状态服务可以说是需要数据存储功能的服务或者指多线程类型的服务、队列等。举例:mysql数据库、kafka、redis、zookeeper等。

守护型应用:类似守护进程一样,长期保持运行,监听持续的提供服务。举例:ceph、logstash、fluentd等。

批处理应用:工作任务型的服务,通常是一次性的。举例:运行一个批量改文件夹名字的脚本。

这些类型的应用服务如果是安装在传统的物理机或者虚拟机上,那么我们一般会通过人肉方式或者自动化工具的方式去管理编排。但是这些服务一旦容器化了跑在了Pod里,那么就应该按照K8S的控制方式来管理了。上一篇文章我们讲到了编排,那么K8S靠什么具体的操作来做编排?答案就是这些控制器。

二、K8S有哪些控制器

既然应用的类型有上面说的这些无状态、有状态的,那么K8S肯定要实现一些控制器来专门处理对应类型的应用。总体来说,K8S有五种控制器,分别对应处理无状态应用、有状态应用、守护型应用和批处理应用。

1. Deployment

Deployment中文意思为部署、调度,通过Deployment我们能操作RS(ReplicaSet),你可以简单的理解为它是一种通过yml文件的声明,在Deployment 文件里可以定义Pod数量、更新方式、使用的镜像,资源限制等。无状态应用都用Deployment来创建,例:

apiVersion: extensions/v1beta1
kind: Deployment   # 定义是Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.8.0
        ports:
        - containerPort: 80

2. StatefulSet

StatefulSet的出现是K8S为了解决 “有状态” 应用落地而产生的,Stateful这个单词本身就是“有状态”的意思。之前大家一直怀疑有状态应用落地K8S的可行性,StatefulSet很有效解决了这个问题。有状态应用一般都需要具备一致性,它们有固定的网络标记、持久化存储、顺序部署和扩展、顺序滚动更新等等。总结两个词就是需要稳定、有序。

那么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也会被删除。

3. DaemonSet

Daemon本身就是守护进程的意思,那么很显然DaemonSet就是K8S里实现守护进程机制的控制器。比如我们需要在每个node里部署fluentd采集容器日志,那么我们完全可以采用DaemonSet机制部署。它的作用就是能确保全部(或者你指定的node数里)运行一个fluentd Pod副本。当有 node加入集群时,也会为他们新增一个 Pod 。当有 node从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。

所以,你可以想象,DaemonSet 特别适合运行那些静默后台运行的应用,而且是连带性质的,非常方便。

4. Job

Job就是任务,我们不用K8S,批处理的运行一些自动化脚本或者跑下ansible也是经常的事儿。那么在K8S里运行批处理任务我们用Job即可。执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。

5. CronJob

在IT环境里,经常遇到一些需要定时启动运行的任务。传统的linux里我们执行定义crontab即可,那么在K8S里我们就可以用到CronJob控制器。其实它就是上面Job的加强版,带时间定点运行的。

例子:每一分钟输出一句,2019-08-25 08:08:08 Hello K8S!

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 K8S!
          restartPolicy: OnFailure

总结:以上就是K8S五种控制器的介绍,这五种控制器的存在对标的就是四种类型应用的编排处理。有人会问这五种控制器到底怎么用呢?很简单,还是通过编写运行YAML文件来操控。网上有很多控制器运行的YAML例子,你参考一个部署一个,基本其他的你也会了。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Kubernetes系列学习文章 - 学习K8S的基础(三)

    | 导语 上一篇文章我们讲解了什么是kubernetes(K8S) ,你对K8S的概念目前已经有个初步的了解。很多同学估计想开始着手学习了,这篇文章我们来了解...

    宝哥@devops运维
  • Kubernetes系列学习文章 - 网络实现(八)

    | 导语 前面介绍了很多K8S的概念以及架构方面的东西,这里我们说说K8S的网络。云计算里面的网络向来是复杂的,因为里面牵扯到硬件网络跟虚拟网络的交互。尤其是...

    宝哥@devops运维
  • Kubernetes系列学习文章 - 什么是K8S?(二)

    | 导语 上一篇文章我们讲解了什么是“容器云” ,也许你会问我们用什么技术手段来实现容器云?很简单,就是上篇文章结尾说的 "docker + kubernet...

    宝哥@devops运维
  • shiro(2)-架构与配置

    认证就是用户确认身份的过程,确认登录的用户身份能够操作的内容。 使用shiro认证分为以下几个步骤: 1,得到主体的认证和凭据。 // let's login ...

    cloudskyme
  • 【OCP最新题库解析(052)--题27】Your database is configured in archivelog

    Which clause or clauses ensure that no media recovery is required when the table...

    小麦苗DBA宝典
  • iscsi多路径存储方式

    如果存储服务器到交换机只有一条线路的时候,那么一条线路出线故障,整个就没法使用了,所以多线路可以解决这个问题,避免单点故障。

    胡齐
  • apache shiro 在spring 的使用

     <!-- SECURITY begin -->         <dependency>             <groupId>org.apache....

    爱明依
  • 用 WebScrapy 爬取即刻关注/被关注列表

    在即刻看见即友说用 WebScrapy 爬取了关注列表和被关注列表,感觉很爽,我评论了一句我觉得我可以写一个教程,然后就有人问我怎么搞了。骚话不说,教程来了。

    伪君子
  • 桥接模式

    桥接模式要把握的很重要的一点就是:类的继承关系和类的组合/聚合关系,何时应该考虑使用何种关系。是不是在编程过程中一味地使用类的继承关系就代表这就是面向对象编程了...

    用户1148394
  • Synchronized内置锁

    多个线程之间共享资源就会发成数据上的冲突,我们往往会使用Synchronized关键字来实现锁

    彼岸舞

扫码关注云+社区

领取腾讯云代金券