k8s之Pod控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)

1.控制器

Pod控制器是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试 进行重启,当根据重启策略无效,则会重新新建pod的资源。

Pod 的分类:
自主式 Pod:Pod 退出后不会被创建
控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目

控制器类型:
Replication Controller和ReplicaSet
Deployment
DaemonSet
StatefulSet
Job
CronJob
HPA全称Horizontal Pod Autoscaler

(1) Replication Controller和ReplicaSet
ReplicaSet 是下一代的 Replication Controller,官方推荐使用ReplicaSet。
ReplicaSet 和 Replication Controller 的唯一区别是选择器的支持,ReplicaSet 支持新的基于集合的选择器需求。
ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。
虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制

(2) Deployment
Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法。
典型的应用场景:
用来创建Pod和ReplicaSet
滚动更新和回滚
扩容和缩容
暂停与恢复

(3) DaemonSet
DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod 。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。

DaemonSet 的典型用法:
在每个节点上运行集群存储 DaemonSet,例如 glusterd、ceph。
在每个节点上运行日志收集 DaemonSet,例如 fluentd、logstash。
在每个节点上运行监控 DaemonSet,例如 Prometheus Node Exporter、zabbix agent等

一个简单的用法是在所有的节点上都启动一个 DaemonSet,将被作为每种类型的 daemon 使用。

一个稍微复杂的用法是单独对每种 daemon 类型使用多个 DaemonSet,但具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求。

(4) StatefulSet
StatefulSet 是用来管理有状态应用的工作负载 API 对象。实例之间有不对等关系,以及实例对外部数据有依赖关系的应用,称为“有状态应用”

StatefulSet 用来管理 Deployment 和扩展一组 Pod,并且能为这些 Pod 提供序号和唯一性保证

StatefulSets 对于需要满足以下一个或多个需求的应用程序很有价值:
稳定的、唯一的网络标识符。
稳定的、持久的存储。
有序的、优雅的部署和缩放。
有序的、自动的滚动更新。

(5) Job
执行批处理任务,仅执行一次任务,保证任务的一个或多个Pod成功结束。

(6) CronJob
Cron Job 创建基于时间调度的 Jobs。

一个 CronJob 对象就像 crontab (cron table) 文件中的一行,它用 Cron 格式进行编写,并周期性地在给定的调度时间执行 Job。

(7) HPA
根据资源利用率自动调整service中Pod数量,实现Pod水平自动缩放。

2. 控制器的部署和实例

控制器,之前的pod都是自主式的pod,在删除之后,pod就没有了,没有控制器去维护它

控制器管理的pod:在控制器的生命周期里,始终维持pod的副本数目

2.1 ReplicaSet

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-example
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx

每个容器起来之后,都会有app:nginx标签
rs去匹配pod,标签必须和底下的容器标签一致

k8s之Pod控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)_第1张图片
测试pod的拉伸,直接将yaml文件中副本的个数修改就可

把副本数量修改至现在的3个,可以看到重新更改文件时,直接成功

replicas: 3

k8s之Pod控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)_第2张图片

缩减时,也直接更改副本个数就可以。

测试更改某个pod的标签

[kubeadm@server1 manifest]$ kubectl get pod --show-labels 
NAME                       READY   STATUS    RESTARTS   AGE     LABELS
replicaset-example-6vtfm   1/1     Running   0          17m     app=nginx
replicaset-example-s6sjj   1/1     Running   0          17m     app=nginx
replicaset-example-whm7w   1/1     Running   0          2m33s   app=nginx
test                       1/1     Running   2          20h     run=test
[kubeadm@server1 manifest]$ 

更改标签

[kubeadm@server1 manifest]$ kubectl label pod replicaset-example-6vtfm app=myapp --overwrite 
pod/replicaset-example-6vtfm labeled
[kubeadm@server1 manifest]$ 

之前是3个pod,由于改了标签,控制器又启了一个pod,控制自己维护的标签的pod始终是3个

k8s之Pod控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)_第3张图片
rs是控制pod的副本的,一直将pod控制在期望状态。当pod数目不足时,会创建某些数量的pod,其他已经修改标签的会变成一个自主式的pod。

删除指定的pod:

此时该pod会被永久删除,不会再被重建

[kubeadm@server1 manifest]$ kubectl get pod
NAME                       READY   STATUS    RESTARTS   AGE
replicaset-example-6vtfm   1/1     Running   0          23m
replicaset-example-k8vtv   1/1     Running   0          4m19s
replicaset-example-s6sjj   1/1     Running   0          23m
replicaset-example-whm7w   1/1     Running   0          8m52s
test                       1/1     Running   2          20h
[kubeadm@server1 manifest]$ kubectl delete pod replicaset-example-6vtfm
pod "replicaset-example-6vtfm" deleted
[kubeadm@server1 manifest]$ 

测试先更改标签,再恢复标签会怎么样

k8s之Pod控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)_第4张图片
k8s之Pod控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)_第5张图片

当恢复标签时,rs会把刚刚拉起的pod删除,因为rs维护的副本数目就是3

2.2 Deployment

清除实验环境

k8s之Pod控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)_第6张图片

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-nginx
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: reg.westos.org/k8s/myapp:v1
        ports:
        - containerPort: 80
[kubeadm@server1 manifest]$ kubectl apply -f de.yaml 
deployment.apps/deployment-nginx created
[kubeadm@server1 manifest]$ kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
deployment-nginx-84f7d65dcf-294q8   1/1     Running   0          6s
deployment-nginx-84f7d65dcf-dqp7h   1/1     Running   0          6s
test                                1/1     Running   2          20h
[kubeadm@server1 manifest]$ 

k8s之Pod控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)_第7张图片
deployment-nginx是deployment的name,84f7d65dcf-dqp7h是下层的rs

k8s之Pod控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)_第8张图片
测试拉伸

测试做拉伸,和rs没有什么区别,因为拉伸本身就是由rs来维护的,副 本的数量就是由rs来控制的

测试滚动更新,将myapp的版本改为v2即可

[kubeadm@server1 manifest]$ vim de.yaml 
[kubeadm@server1 manifest]$ kubectl apply -f de.yaml 
deployment.apps/deployment-nginx configured
[kubeadm@server1 manifest]$ kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
deployment-nginx-69ccd78d6b   2         2         2       6s
deployment-nginx-84f7d65dcf   0         0         0       13m
[kubeadm@server1 manifest]$ 

原来的rs还存在,并没有被删除掉,这是为了便于回滚

集群内部访问,更新成功

k8s之Pod控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)_第9张图片

测试回滚

k8s之Pod控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)_第10张图片

回滚的时候,直接使用的是原来的rs,保留pod

k8s之Pod控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)_第11张图片

查看回滚的状态

k8s之Pod控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)_第12张图片

2.3 DaemonSet

harbor仓库中拉取zabbix镜像,上传至harbor仓库

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-example
  labels:
    app: zabbix-agent
spec:
  selector:
    matchLabels:
      name: zabbix-agent
  template:
    metadata:
      labels:
        name: zabbix-agent
    spec:
      containers:
      - name: zabbix-agent
        image: reg.westos.org/k8s/zabbix/zabbix-agent

k8s之Pod控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)_第13张图片
DaemonSet确保全部节点上运行一个pod的副本,当有节点加入集群时,也会 为他们新增一个pod。当有节点从集群移除时,这些pod也会被回收。删除DaemonSet将会删除它创建的所有pod

测试删除一个pod

k8s之Pod控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)_第14张图片
2.4 job控制器

在harbor仓库中拉取per镜像,上传至私有仓库

job比较适合做计算类的操作

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: reg.westos.org/k8s/perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

k8s之Pod控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)_第15张图片
k8s之Pod控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)_第16张图片

2.5 Cronjob

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob-example
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: cronjob
            image: reg.westos.org/k8s/busyboxplus
            args:
            - /bin/sh
            - -c
            - date; echo Hello from k8s cluster
          restartPolicy: OnFailure

-w 实时监控状态

k8s之Pod控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)_第17张图片

你可能感兴趣的:(linux企业实战)