关于kubernetes:Kubernetes-认识下Pod的管理者

2次阅读

共计 7352 个字符,预计需要花费 19 分钟才能阅读完成。

大家好,我是小菜,后面几篇文章咱们曾经从 k8s 集群的搭建而后到 k8s 中 NameSpace 再说到了 k8s 中 Pod 的应用,如果还干到意犹未尽,那么接下来的 Pod 控制器 同样是一道硬菜!
死鬼~ 看完记得给我来个三连哦!

本文次要介绍 k8s 中 pod 控制器的应用

如有须要,能够参考

如有帮忙,不忘 点赞

微信公众号已开启,小菜良记,没关注的同学们记得关注哦!

前文回顾:

  • 《k8s 集群搭建》不要让贫困扼杀了你学 k8s 的趣味!
  • 万字正告 – k8s 入门,理当 Pod 后行!

既然有 pod 的存在,那便须要对 pod 进行治理,控制器又怎么了少的了,那么接下来的工夫交给小菜,带你一探到底!

Pod 控制器

一、前头预热

咱们曾经分明了 Pod 是 k8s 中最小的治理单元。想想咱们之前是怎么创立 pod,动动小脑袋,隐约想起如同有 3 种形式!1. 命令式对象治理 2. 命令式对象配置 3. 申明式对象配置。如果能想到这三种,阐明上篇没白学!然而这三种的创立形式,咱们都是围绕 pod 开展的,不论是通过命令间接创立,还是通过 yaml 文件配置完再生成,咱们生成的 Kind 都是间接指明 Pod,好像咱们对 pod 的认知也局限于此了。然而明天,小菜就带你意识点不一样的货色,咱们能够通过 Pod 管理器 来创立 pod!

1)概念

什么是 pod 控制器呢?下面只是简略说了能够用来创立 pod,难道作用也仅此而已,那我何必又多此一举呢~

Pod 控制器,意如其名。就是用来管制 pod 的,它是作为治理 pod 的中间层,应用 pod 控制器之后,只须要通知 pod 控制器,我想要几个 pod,想要什么样的 pod,它便会为咱们创立出满足条件的 pod,并确保每一个 pod 资源都是处于用户冀望的指标状态,如果 pod 资源在运行中呈现故障,它便会基于指定的策略从新编排 pod

相当于控制器也就是一个管家,能够更好的为咱们治理 pod。

通过 pod 控制器创立的 pod 还有个最大的不同点,那便是:如果通过间接创立进去的 pod,这种 pod 删除后也就真的删除了,不会重建。而通过 pod 控制器创立的 pod,删除后还会基于指定的策略从新创立!

pod 控制器 也分为很多种类型,k8s 中反对的控制器类型如下:

  • ReplicaSet:保障正本数量统一维持在期望值,反对 pod 数量扩缩容 和 镜像版本升级
  • Deployment: 通过管制 ReplicaSet 来管制 Pod,反对滚动降级和回退版本
  • Horizontal Pod Autoscaler:能够依据集群负载主动程度调整 pod 的数量
  • DaemonSet: 在集群中的指定 Node 上运行且仅运行一个正本,个别用于守护过程类的工作
  • Job:它创立进去的 pod 只有实现工作就会立刻退出,不须要重启或重建,用于执行一次性工作
  • Cronjob: 它创立的 pod 负责周期性工作管制,不须要继续后盾运行
  • StatefulSet: 治理有状态的利用

这么多控制器,看了也别慌,接下来咱们一个个意识过来~

二、实际操作

1)ReplicaSet

ReplicaSet 简称 rs,它的次要作用便是保障肯定数量的 pod 失常运行,它会继续监听这些 pod 的运行状态,一旦 pod 产生故障,就会重启或重建,同时它还反对对 pod 数量的扩缩容和镜像版本的升降级。

咱们来看下 RS 的资源清单:

apiVersion: apps/v1   # 版本号
kind: ReplicaSet       # 类型
metadata:             # 元数据信息
  name:               # 名称
  namespace:          # 命名空间
  labels:             # 标签
    key: value
spec:                  # 详细描述
  replicas:           # 正本数
  selector:           # 选择器,通过它指定该控制器治理那些 Pod
    matchLabels:      # labels 匹配规定
      app: 
    matchExpressions:
    - key: xxx
      operator: xxx
      values: ['xxx', 'xxx']
  template:       # 模板,当正本数量有余时,会依据以下模板创立 Pod 正本
    metadata:
      labels:
        key: value
    spec:
      containers:
      - name: 
        image:
        ports:
        - containerPort: 

咱们这里须要新理解的属性如下:

  • spec.replicas: 正本数量。以后 rs 会创立进去的 pod 数量,默认为 1
  • spec.selector: 选择器。建设 pod 控制器和 pod 之间的关联关系,在 pod 模板上定义 label,在控制器上定义选择器,就能够让 pod 归属于哪个控制器底下
  • spec.template: 模板。以后控制器创立 pod 所应用的的模板,外面定义内容与上节说到的 pod 定义是一样的
创立 RS

咱们编写一个 yaml 试着创立一个 RS 控制器:

通过 kubectl create -f rs.yaml 后能够发现曾经存在了两个 pod,阐明正本数量失效,当咱们删除一个 pod,过一会便会主动启动一个 pod!

扩缩容

既然 RS 创立的时候能管制 pod 的正本数量,当然在运行的时候也可能动静扩缩容。

间接批改

咱们通过以下命令,可能间接编辑 rs 的 yaml 文件

kubectl edit rs rs-ctrl -n cbuc-test

replicas 数量改为 3,保留退出后,能够发现正在运行的 pod 数量曾经变成了 3 个。

命令批改

除了以上通过批改 yaml 的形式,咱们也能够间接通过命令的形式批改

kubectl scale rs rs-ctrl --replicas=2 -n cbcu-test

以上命令咱们是借助 scale 指令的帮忙批改 pod 的正本数量。

镜像更新

除了能够管制正本数量,还能够进行镜像的降级。咱们下面运行 Pod 应用的镜像是 nginx:1.14.1 如果咱们想要降级镜像版本号同样有两种办法:

间接批改

咱们通过以下命令,可能间接编辑 rs 的 yaml 文件

kubectl edit rs rs-ctrl -n cbuc-test

编辑镜像版本号后保留退出,能够发现正在运行的 pod 应用的镜像曾经变了

命令批改

解决以上通过批改 yaml 的形式,咱们也能够间接通过命令的形式批改

kubectl set image rs rs-ctrl nginx=nginx:1.17.1 -n cbuc-test

格局如下:

kubectl set image rs 控制器名称 容器名称 = 镜像名称: 镜像版本 -n 命名空间
删除镜像

如果咱们不想要应用该控制器了,最好的形式便是将其删除。咱们能够依据资源清单删除

kubectl delete -f rs.yaml

也能够间接删除

kubectl delete deploy rs-ctrl -ncbuc-test

然而咱们须要分明的是,默认状况下,控制器删除后,底下所管制的 pod 也会对应删除,然而有时候咱们只是想单纯的删除控制器,而不想删除 pod,就得借助命令选项--cascade=false

kubectl delete rs rs-ctrl -n cbuc-test --cascade=false

2)Deployment

Deployment 控制器简称 Deploy,这个控制器是在 kubernetes v1.2 版本之后开始引入的。这种控制器并不是间接治理 pod,而是通过治理 ReplicaSet 控制器 来间接治理 pod

由图可知,Deployment的性能只会更加弱小:

  • 反对 ReplicaSet 所有性能
  • 反对公布的进行、持续
  • 反对滚动降级和回滚版本

三大利器,将开发拿捏死死地~ 咱们来看下资源清单是如何配置的:

从资源清单中咱们能够看出,ReplicaSet 中有的,Deployment 都有,而且还减少了许多属性

创立 Deploy

筹备一份 deploy 资源清单:

而后通过 kubectl create -f deploy-ctrl.yaml 创立 pod 控制器,查看后果:

扩缩容

扩缩容的形式和 ReplicaSet 一样,有两种形式,这里简略带过

间接批改
kubectl edit deploy deploy-ctrl -n cbuc-test

replicas 数量改为 3,保留退出后,能够发现正在运行的 pod 数量曾经变成了 3 个。

命令批改
kubectl scale deploy deploy-ctrll --replicas=2 -n cbcu-test
镜像更新

Deployment反对两种更新策略: 重建更新 滚动更新,能够通过 strategy 指定策略类型, 反对两个属性:

strategy:# 指定新的 Pod 替换旧的 Pod 的策略,反对两个属性:type:# 指定策略类型,反对两种策略
    Recreate:# 在创立出新的 Pod 之前会先杀掉所有已存在的 Pod
    RollingUpdate:# 滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本 Pod
  rollingUpdate:# 当 type 为 RollingUpdate 时失效,用于为 RollingUpdate 设置参数,反对两个属性
    maxUnavailable:# 用来指定在降级过程中不可用 Pod 的最大数量,默认为 25%。maxSurge:# 用来指定在降级过程中能够超过冀望的 Pod 的最大数量,默认为 25%。

失常来说 滚动更新 会比拟敌对,在更新过程中更加趋向于“无感” 更新

版本回退

Deployment 还反对版本升级过程中的暂停、持续以及版本回退等诸多性能,这些都与 rollout 无关:

应用形式:

  • history

显示降级历史记录

kubectl rollout history deploy deploy-ctrl -ncbuc-test

  • pause

暂停版本升级过程

kubectl rollout pause deploy deploy-ctrl -ncbuc-test
  • restart

重启版本升级过程

kubectl rollout restart deploy deploy-ctrl -ncbuc-test
  • resume

持续曾经暂停的版本升级过程

kubectl rollout resume deploy deploy-ctrl -ncbuc-test
  • status

显示以后降级状态

kubectl rollout status deploy deploy-ctrl -ncbuc-test
  • undo

回滚到上一级版本

kubectl rollout undo deploy deploy-ctrl -ncbuc-test

3)Horizontal Pod Autoscaler

看名字就感觉这个不简略,该控制器简称 HPA,咱们之前是手动管制 pod 的扩容或缩容,然而这中形式并不智能,咱们须要随时随地察看资源状态,而后管制正本数量,这是一个相当费时费力的工作~ 因而咱们想要可能存在一种可能自动控制 Pod 数量的控制器来帮忙咱们监测 pod 的应用状况,实现 pod 数量的主动调整。而 K8s 也为咱们提供了 Horizontal Pod Autoscaler – HPA

HPA 能够获取每个 pod 的利用率,而后和 HPS 中定义的指标进行比照,同时计算出须要伸缩的具体数量,而后对 pod 进行调整。

如果须要监测 pod 的负载状况,咱们须要 metrics-server 的帮忙,因而咱们首先须要先装置 metrics-server

# 装置 git
yum install -y git
# 获取 mertrics-server
git clone -b v0.3.6 https://github.com/kubernetes-incubator/metrics-server
# 批改 metrics-server deploy
vim /root/metrics-server/deploy/1.8+/metrics-server-deployment.yaml
# 增加上面选项
hostNetwork: true
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6
args:
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP

而后间接创立即可:

kubectl apply -f /root/metrics-server/deploy/1.8+/

装置完结后咱们便能够应用以下命令查看每个 node 的资源应用状况了

kubectl top node

查看 pod 资源应用状况

kubectl top pod -n cbuc-test

而后咱们便能够创立 HPA,筹备好资源清单:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-ctrl
  namespace: cbuc-test
spec:
  minReplicas: 1        # 最小 Pod 数量
  maxReplicas: 5           # 最大 Pod 数量
  targetCPUUtilzationPercentage: 3   # CPU 使用率指标
  scaleTargetRef:         # 指定要管制 deploy 的信息
    apiVersion: apps/v1
    kind: Deployment
    name: deploy-ctrl
# 创立 hpa
[root@master /]# kubectl create -f hpa-deploy.yaml
# 查看 hpa
[root@master /]# kubectl get hpa -n dev

到这里咱们就创立好了一个 HPA,它能够动静对 pod 进行扩缩容,这里就不做测试了,有趣味的同学能够进行压测,看看后果是否如本人所冀望的~

4)DaemonSet

DaemonSet 控制器简称 DS,它的作用便是能够保障在集群中的每一台(或指定)节点上都运行一个正本。这个作用场景个别是用来做日志采集或节点监控。

如果一个 Pod 提供的性能是节点级别的(每个节点都须要且只须要一个),那么这类 Pod 就适宜应用 DaemonSet 类型的控制器创立

特点:

  • 每向集群增加一个节点时,指定的 Pod 正本也将会被增加到该节点上
  • 当节点从集群中移除时,Pod 也将被回收

资源清单模板

其实不难发现,该清单跟 Deployment 简直统一,因而咱们无妨大胆猜想,这个控制器就是针对 Deployment 改进的懒人工具,能够主动帮咱们创立 Pod~

实战清单:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: pc-daemonset
  namespace: dev
spec:
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
      spec:
      containers:
      - name: nginx
        image: nginx:1.14-alpine

通过该清单创立后,咱们能够发现在每个 Node 节点上都创立了 nginx pod~

5)Job

Job,意如其名,该控制器的工作便是 负责批量解决(一次要解决指定数量工作)短暂的一次性(每个工作仅运行一次就完结)的工作。

特点:

  • Job 创立的 Pod 执行胜利完结时,Job 会记录胜利完结的 pod 数量
  • 当胜利完结的 pod 达到指定的数量时,Job 将实现执行

资源清单模板:

这里重启策略是必须指明的,且只能为 Never 或 OnFailure,起因如下:

  • 如果指定为 OnFailure,则 job 会在 pod 呈现故障时重启容器,而不是创立 pod,failed 次数不变
  • 如果指定为 Never,则 job 会在 pod 呈现故障时创立新的 pod,并且故障 pod 不会隐没,也不会重启,failed 次数加 1
  • 如果指定为 Always 的话,就意味着始终重启,意味着 job 工作会反复去执行了,当然不对,所以不能设置为
    Always

实战清单:

apiVersion: batch/v1
kind: Job
metadata:
  name: job-ctrl
  namespace: cbuc-test
  labels:
    app: job-ctrl
spec:
  manualSelector: true
  selector:
    matchLabels:
      app: job-pod
  template:
    metadata:
      labels:
        app: job-pod
    spec:
      restartPolicy: Never
      containers:
      - name: test-pod
        image: cbuc/test/java:v1.0
        command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 2;done"]

通过观察 pod 状态能够看到,pod 在运行结束工作后,就会变成 Completed 状态

6)CronJob

CronJob控制器简称 CJ,它的作用是以 Job 控制器为治理单位,借助它治理 pod 资源对象。Job 控制器定义的工作在创立时便会立即执行,但 cronJob 控制器能够管制其运行的 工夫点 反复运行 的形式。

资源清单模板:

其中 并发执行策略 有以下几种:

  • Allow: 容许 Jobs 并发运行
  • Forbid: 禁止并发运行,如果上一次运行尚未实现,则跳过下一次运行
  • Replace: 替换,勾销以后正在运行的作业并用新作业替换它

实战清单:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cj-ctrl
  namespace: cbuc-test
  labels:
    controller: cronjob
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    metadata:
    spec:
      template:
        spec:
          restartPolicy: Never
          containers:
           - name: test
            image: cbuc/test/java:v1.0
            command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep3;done"]

从后果上看咱们也曾经胜利实现了定时工作,每秒执行了一次~

END

这篇咱们介绍了 Pod 控制器的应用,一共有 6 种控制器,不晓得看完后,你还记住几种呢~ 老样子,实际出真知,凡事还是要上手练习能力记得更牢哦~ K8s 仍未完结,咱们还有 Service、Ingress 和 Volumn 还没介绍!路漫漫,小菜与你一起求索~

明天的你多致力一点,今天的你就能少说一句求人的话!

我是小菜,一个和你一起学习的男人。 💋

微信公众号已开启,小菜良记,没关注的同学们记得关注哦!

正文完
 0