kubernetes|kubernetes (k8s) k8s 控制器

目录
一、pod控制器介绍
1、Pod与控制器之间的关系
二、Deployment(无状态)
1、Deployment的资源清单文件
2、创建deployment
三、ReplicaSet(RS)
3.1、ReplicaSet的资源清单文件
3.2、有状态和无状态的区别
3.3、常规service和无头服务区别
3.4、案例
小结
四、DaemonSet
五、Job
CronJob
kubernetes|kubernetes (k8s) k8s 控制器
文章图片

一、pod控制器介绍 Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类:

  • 自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建
  • 控制器创建的pod:kubernetes通过控制器创建的pod,这种pod删除了之后还会自动重建
什么是Pod控制器:
Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod。
控制器:又称之为工作负载,分别包含以下类型控制器
  1. ReplicationController:比较原始的pod控制器,已经被废弃,由ReplicaSet替代
  2. ReplicaSet:保证副本数量一直维持在期望值,并支持pod数量扩缩容,镜像版本升级
  3. Deployment:通过控制ReplicaSet来控制Pod,并支持滚动升级、回退版本
  4. Horizontal Pod Autoscaler:可以根据集群负载自动水平调整Pod的数量,实现削峰填谷
  5. DaemonSet:在集群中的指定Node上运行且仅运行一个副本,一般用于守护进程类的任务
  6. Job:它创建出来的pod只要完成任务就立即退出,不需要重启或重建,用于执行一次性任务
  7. Cronjob:它创建的Pod负责周期性任务控制,不需要持续后台运行
  8. StatefulSet:管理有状态应用
1、Pod与控制器之间的关系 controllers:在集群上管理和运行容器的对象通过label-selector相关联
Pod通过控制器实现应用的运维,如伸缩,升级等
kubernetes|kubernetes (k8s) k8s 控制器
文章图片

二、Deployment(无状态) 为了更好的解决服务编排的问题,kubernetes在V1.2版本开始,引入了Deployment控制器。值得一提的是,这种控制器并不直接管理pod,而是通过管理ReplicaSet来间接管理Pod,即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment比ReplicaSet功能更加强
Deployment主要功能有下面几个:
  • 支持ReplicaSet的所有功能
  • 支持发布的停止、继续
  • 支持滚动升级和回滚版本
特点:
  • 部署无状态应用,只关心数量,不论角色等,称无状态
  • 管理Pod和ReplicaSet
  • 具有上线部署、副本设定、滚动升级、回滚等功能
  • 提供声明式更新,例如只更新一个新的image
1、Deployment的资源清单文件
apiVersion: apps/v1 # 版本号 kind: Deployment # 类型 metadata: # 元数据 name: # rs名称 namespace: # 所属命名空间 labels: #标签 controller: deploy spec: # 详情描述 replicas: 3 # 副本数量 revisionHistoryLimit: 3 # 保留历史版本 paused: false # 暂停部署,默认是false progressDeadlineSeconds: 600 # 部署超时时间(s),默认是600 strategy: # 策略 type: RollingUpdate # 滚动更新策略 rollingUpdate: # 滚动更新 maxSurge: 30% # 最大额外可以存在的副本数,可以为百分比,也可以为整数 maxUnavailable: 30% # 最大不可用状态的 Pod 的最大值,可以为百分比,也可以为整数 selector: # 选择器,通过它指定该控制器管理哪些pod matchLabels:# Labels匹配规则 app: nginx-pod matchExpressions: # Expressions匹配规则 - {key: app, operator: In, values: [nginx-pod]} template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本 metadata: labels: app: nginx-pod spec: containers: - name: nginx image: nginx:1.17.1 ports: - containerPort: 80

2、创建deployment创建pc-deployment.yaml,内容如下:
# vim nginx-deployment.yamlapiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.15.4 ports: - containerPort: 80Replicaset是副本数,回滚就是通过此来实现 创建资源 # kubectl create -f nginx-deployment.yaml 查看创建的pod资源、控制器和副本 # kubectl get pods,deploy,rs 查看历史版本 # kubectl rollout history deployment/nginx-deployment

kubernetes|kubernetes (k8s) k8s 控制器
文章图片

kubernetes|kubernetes (k8s) k8s 控制器
文章图片

三、ReplicaSet(RS) ReplicaSet的主要作用是保证一定数量的pod正常运行,它会持续监听这些Pod的运行状态,一旦Pod发生故障,就会重启或重建。同时它还支持对pod数量的扩缩容和镜像版本的升降级。
kubernetes|kubernetes (k8s) k8s 控制器
文章图片

3.1、ReplicaSet的资源清单文件
apiVersion: apps/v1 # 版本号 kind: ReplicaSet # 类型 metadata: # 元数据 name: # rs名称 namespace: # 所属命名空间 labels: #标签 controller: rs spec: # 详情描述 replicas: 3 # 副本数量 selector: # 选择器,通过它指定该控制器管理哪些pod matchLabels:# Labels匹配规则 app: nginx-pod matchExpressions: # Expressions匹配规则 - {key: app, operator: In, values: [nginx-pod]} template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本 metadata: labels: app: nginx-pod spec: containers: - name: nginx image: nginx:1.17.1 ports: - containerPort: 80

在这里面,需要新了解的配置项就是spec下面几个选项:
  1. replicas:指定副本数量,其实就是当前rs创建出来的pod的数量,默认为1
  2. selector:选择器,它的作用是建立pod控制器和pod之间的关联关系,采用的Label Selector机制。在pod模板上定义label,在控制器上定义选择器,就可以表明当前控制器能管理哪些pod了。
  3. template:模板,就是当前控制器创建pod所使用的模板,里面其实就是前一章学过的pod的定义
特点:
  • 解决Pod独立生命周期,保持Pod启动顺序和唯一性
  • 稳定,唯一的网络标识符,持久存储(例如: etcd 配置文件,节点地址发生变化,将无法使用)
  • 有序,优雅的部署和扩展、删除和终止(例如: mysql 主从关系,先启动主,再启动从)
  • 有序,滚动更新
应用场景: 数据库
3.2、有状态和无状态的区别
无状态:
  1. deployment认为所有的pod都是一样的
  2. 不用考虑顺序的要求
  3. 不用考虑在哪个node节点上运行
  4. 可以随意扩容和缩容
有状态:
  1. 实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd, zookeeper
  2. 实例之间不对等的关系,以及依靠外部存储的应用。
3.3、常规service和无头服务区别
service:一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
Headless service无头服务, 不需要cluster-IP,直接绑定具体的Pod的IP(当Pod的IP地址是动态变化时,所以常用于绑定DNS访问)
①Cluster_ip
②NodePort:使用pod所在节点的IP和端口范围
③headless:直接使用pod 的ip暴露出去
④LoadBalancer:负载均衡(F5)
⑤hostport:直接使用宿主机的IP和端口范围
ps:k8s暴露服务的方式主要就3种:ingress loadbalancer(SLB/ALB k8s集群外的负载均衡器Ng、haproxy、KONG、traefil等等)service
3.4、案例
先创建DNS资源
# vim pod.yamlapiVersion: v1 kind: Pod metadata: name: dns-test spec: containers: - name: busybox image: busybox:1.28.4 args: - /bin/sh - -c - sleep 36000 restartPolicy: Never 创建dns资源 # kubectl create -f pod.yaml # kubectl get pods

kubernetes|kubernetes (k8s) k8s 控制器
文章图片

kubernetes|kubernetes (k8s) k8s 控制器
文章图片

再用statefulset控制器类型 创建nginx pod资源,并创建无头服务资源
# vim sts.yaml apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1 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 # kubectl create -f sts.yaml 有状态化创建的pod,是自动进行打标签进行区分 # kubectl get pods # kubectl get pods,svc 验证DNS解析 # kubectl exec -it dns-test.sh 解析pod的唯一域名和自身的IP

kubernetes|kubernetes (k8s) k8s 控制器
文章图片

kubernetes|kubernetes (k8s) k8s 控制器
文章图片

kubernetes|kubernetes (k8s) k8s 控制器
文章图片

小结
StatefulSet与Deployment区别:
StatefulSet创建的pod是有身份的!
身份三要素:
域名 nginx-statefulset-0.nginx
主机名 nginx-statefulset-0
存储 (PVC)
四、DaemonSet 特点:
在每一个Node上运行一个Pod
新加入的Node也同样会自动运行一个Pod
应用场景:Agent、监控
官方案例(监控)Daemonset
示例:
用DaemonSet 控制器类型创建nginx pod资源,没有指定副本replicats,它会根据node节点的个数创建,如果再新加一个node节点,也会给新node节点创建pod

[root@master demo]# vim daemonSet.yaml
【kubernetes|kubernetes (k8s) k8s 控制器】apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.4
ports:
- containerPort: 80

vim daemonSet.yamlapiVersion: apps/v1 kind: DaemonSet metadata: name: nginx-deployment labels: app: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.15.4 ports: - containerPort: 80

kubernetes|kubernetes (k8s) k8s 控制器
文章图片

DaemonSet会在每个node节点都创建一个Pod
kubectl apply -f daemonSet.yaml kubectl get pods

kubernetes|kubernetes (k8s) k8s 控制器
文章图片
kubernetes|kubernetes (k8s) k8s 控制器
文章图片

五、Job Job分为普通任务(Job)和定时任务(CronJob)
一次性执行
应用场景:离线数据处理,视频解码等业务
Jobs | Kubernetes
示例:
重试次数默认是6次,修改为4次,当遇到异常时Never状态会重启,所以要设定次数。
[root@master demo]# vim job.yaml apiVersion: batch/v1 kind: Job metadata: name: pi spec: template: spec: containers: - name: pi image: perl:5.34.0 command: ["perl","-Mbignum=bpi", "-wle", "print bpi(2000)"] restartPolicy: Never backoffLimit: 4

kubernetes|kubernetes (k8s) k8s 控制器
文章图片

在node节点下载perl镜像,因为镜像比较大所以提前下载好
kubernetes|kubernetes (k8s) k8s 控制器
文章图片

创建发布
kubernetes|kubernetes (k8s) k8s 控制器
文章图片

查看日志,看计算结果,结果输出到控制台 结果输出到控制台
kubernetes|kubernetes (k8s) k8s 控制器
文章图片

清除job资源
kubectl get job kubectl delete -f job.yaml

kubernetes|kubernetes (k8s) k8s 控制器
文章图片

CronJob
  1. 周期性任务,像Linux的Crontab一样。
  2. 周期性任务
  3. 应用场景:通知,备份
示例:
# vim 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 busybox 是linux内核镜像 # kubectl create -f cronjob.yaml # kubectl get cronjob NAMESCHEDULESUSPENDACTIVELAST SCHEDULEAGE hello*/1 * * * *False025s # kubectl get pods 查看日志,内容输出到控制台 # kubectl logs hello-1581917340-dzxbj Mon Feb 17 05:29:09 UTC 2020 Hello from the Kubernetes cluster 等待一分钟后又会再执行一次 # kubectl get pods # kubectl logs hello-1581917400-nkb72 最后删除资源,不然第二天服务器宕机 # kubectl delete -f cronjob.yaml

kubernetes|kubernetes (k8s) k8s 控制器
文章图片

kubernetes|kubernetes (k8s) k8s 控制器
文章图片

kubernetes|kubernetes (k8s) k8s 控制器
文章图片

清除cronjob资源
kubectl delete -f cronjob.yaml

kubernetes|kubernetes (k8s) k8s 控制器
文章图片

    推荐阅读