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

 

posted @ 2018-08-13 18:05  梦徒  阅读(2272)  评论(0)    收藏  举报