你们好,我是小菜,前面几篇文章咱们已经从 k8s 集群的搭建而后到 k8s 中NameSpace 再说到了 k8s 中 Pod 的使用,若是还干到意犹未尽,那么接下来的 Pod 控制器 一样是一道硬菜!
死鬼~看完记得给我来个三连哦!java
本文主要介绍
k8s中pod控制器的使用
node若有须要,能够参考nginx
若有帮助,不忘 点赞 ❥git
微信公众号已开启,小菜良记,没关注的同窗们记得关注哦!github
前文回顾:shell
既然有 pod 的存在,那便须要对pod 进行管理,控制器又怎么了少的了,那么接下来的时间交给小菜,带你一探到底!vim
咱们已经清楚了Pod是 k8s 中最小的管理单元。想一想咱们以前是怎么建立 pod,动动小脑壳,隐约想起好像有3种方式!1. 命令式对象管理 2. 命令式对象配置 3. 声明式对象配置 。 若是能想到这三种,说明上篇没白学!可是这三种的建立方式,咱们都是围绕 pod 展开的,无论是经过命令直接建立,仍是经过 yaml文件配置完再生成,咱们生成的 Kind
都是直接指明 Pod
,仿佛咱们对 pod 的认知也局限于此了。可是今天,小菜就带你认识点不同的东西,咱们能够经过 Pod管理器 来建立 pod!api
什么是 pod 控制器呢?上面只是简单说了能够用来建立 pod,难道做用也仅此而已,那我何须又画蛇添足呢~微信
Pod 控制器,意如其名。就是用来控制 pod的,它是做为管理 pod 的中间层,使用 pod 控制器以后,只须要告诉 pod 控制器,我想要几个pod,想要什么样的pod,它便会为咱们建立出知足条件的 pod,并确保每个 pod 资源都是处于用户指望的目标状态,若是 pod 资源在运行中出现故障,它便会基于指定的策略从新编排 pod
至关于控制器也就是一个管家,能够更好的为咱们管理 pod。并发
经过 pod 控制器建立的 pod还有个最大的不一样点,那即是:若是经过直接建立出来的 pod,这种 pod 删除后也就真的删除了,不会重建。而经过 pod 控制器建立的pod,删除后还会基于指定的策略从新建立!
pod控制器 也分为不少种类型,k8s 中支持的控制器类型以下:
这么多控制器,看了也别慌,接下来咱们一个个认识过去~
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:
咱们这里须要新了解的属性以下:
咱们编写一个 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
Deployment 控制器简称 Deploy,这个控制器是在kubernetes v1.2版本以后开始引入的。这种控制器并非直接管理 pod,而是经过管理 ReplicaSet 控制器 来间接管理 pod
由图可知,Deployment的功能只会更增强大:
三大利器,将开发拿捏死死地~咱们来看下资源清单是如何配置的:
从资源清单中咱们能够看出,ReplicaSet 中有的,Deployment 都有,并且还增长了许多属性
准备一份 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
有关:
使用方式:
显示升级历史记录
kubectl rollout history deploy deploy-ctrl -ncbuc-test
暂停版本升级过程
kubectl rollout pause deploy deploy-ctrl -ncbuc-test
重启版本升级过程
kubectl rollout restart deploy deploy-ctrl -ncbuc-test
继续已经暂停的版本升级过程
kubectl rollout resume deploy deploy-ctrl -ncbuc-test
显示当前升级状态
kubectl rollout status deploy deploy-ctrl -ncbuc-test
回滚到上一级版本
kubectl rollout undo deploy deploy-ctrl -ncbuc-test
看名字就感受这个不简单,该控制器简称 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 进行扩缩容,这里就不作测试了,有兴趣的同窗能够进行压测,看看结果是否如本身所指望的~
DaemonSet 控制器简称 DS ,它的做用即是能够保证在集群中的每一台(或指定)节点上都运行一个副本。这个做用场景通常是用来作日志采集或节点监控。
若是一个Pod提供的功能是节点级别的(每一个节点都须要且只须要一个),那么这类Pod就适合使用 DaemonSet 类型的控制器建立
特色:
资源清单模板:
其实不难发现,该清单跟 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~
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状态
CronJob控制器简称 CJ,它的做用是以 Job 控制器为管理单位,借助它管理 pod 资源对象。Job 控制器定义的任务在建立时便会马上执行,但 cronJob 控制器能够控制其运行的 时间点及 重复运行 的方式。
资源清单模板:
其中 并发执行策略 有如下几种:
实战清单:
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 还没介绍!路漫漫,小菜与你一同求索~
今天的你多努力一点,明天的你就能少说一句求人的话!
我是小菜,一个和你一块儿学习的男人。
💋
微信公众号已开启,小菜良记,没关注的同窗们记得关注哦!