深入剖析k8s中常见的控制器

2022-04-22  本文已影响0人  文景大大

本文是《深入剖析k8s》学习笔记的第三篇,主要对k8s中的控制器进行分析和讲解。

pod是k8s操作的最小单元,操作pod的工作都是由控制器controller完成的,对应k8s中的组件就是kube-controller-manager,其下常见的控制器类型有:

控制器的yaml文件一般分为两个部分,上半部分是关于控制器的定义,下半部分是关于被控制对象,也就是pod的定义:

## 上半部分,定义控制器
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  # 管理标签为app=nginx的pod
  selector:
    matchLabels:
      app: nginx
  # 确保被管理的对象数量始终为3
  replicas: 3
  ## 下半部分,定义被控制的对象,也就是pod
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

Deployment、ReplicaSet、Pod三者之间是一种层层控制的关系,ReplicaSet通过控制器模式来保证pod的数量永远等于指定的个数,而Deployment同样也通过控制器的模式来操作ReplicaSet。如此,Deployment可以很方便地实现如下两个特性(并不只是Deployment控制器的功能):

StatefulSet主要是为了满足需要维持应用之间拓扑状态、稳定应用各自的网络状态、保持应用各自存储状态的情形而设计的。

DaemonSet控制器确保k8s集群中的每个节点有且仅有一个定义的pod运行。那么它是如何实现这个功能的呢?

建议在设置DaemonSet控制器时,限制守护pod的资源占用上线,避免守护容器过度占用宿主机的资源,影响用户容器的正常运行。

前面所说的Deployment、StatefulSet、DaemonSet都是一种Long Running Task,即长在线业务,这些应用一旦运行起来,除非出错或者停止,它的容器进程会一直保持在running的状态。然而现实中有种业务是执行完成就结束,不需要一直在线运行的,这种业务被称为离线业务,Batch Job,就是我们接下来要介绍的Job和CronJob。

如下是一个Job的yaml定义代码,它也是直接管理pod,其中的部分字段含义如下:


apiVersion: batch/v1
kind: Job
metadata:
  name: test-job
spec:
 # 定义pod模板
  template:
    spec:
      # 定义pod中容器
      containers:
      - name: test01
        image: resouer/ubuntu-bc 
        # 需要在容器中执行的任务,执行完毕就退出
        command: ["sh", "-c", "echo 'scale=10000; 4*a(1)' | bc -l "]
      # pod的重启策略,通常有Never和OnFailure
      restartPolicy: Never
  # 任务失败重试次数,默认为6
  backoffLimit: 4

Job还支持任务的并行执行,主要通过如下两个参数来控制并行的策略:

CronJob是Job的控制器,通过控制Job来控制pod,只是比Job多了调度cron表达式的功能。它所用的cron表达式是unix cron风格的,支持5位,分别代表分、时、日、月、星期,比如*/1 * * * *就表示每隔1分钟就创建一个Job,但是并不限制已经创建Job的结束时间,所以可能就会出现多个Job同时在运行的情况,此时可以通过如下的字段来进行约束:

上一篇 下一篇

猜你喜欢

热点阅读