k8s Pod控制器类型与部署实例
1、控制器
Pod控制器是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试 进行重启,当根据重启策略无效,则会重新新建pod的资源。
pod分类和控制器类型
Pod的分类:
自主式Pod:Pod退出后不会被创建
控制器管理的Pod:在控制器的生命周期里,始终要维持Pod的副本数目
控制器类型:
Replication Controller和ReplicaSet
Deployment
DaemonSet
StatefulSet
Job
CronJob
HPA全称Horizontal Pod Autoscaler
replication、controller(复制控制器RC)和replicaset(副本集RS)控制器
Replica Set 是下一代的 Replication Controller,官方推荐使用ReplicaSet。
Replica Set 和 Replication Controller 的唯一区别是选择器的支持,ReplicaSet支持新的基于集合的选择器需求。
ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。
虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制。
Deployment控制器(部署)
Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法。
典型的应用场景:
用来创建Pod和ReplicaSet
滚动更新和回滚
扩容和缩容
暂停与恢复
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要求。
StatefulSet控制器(有状态服务集)
StatefulSet是用来管理有状态应用的工作负载API对象。实例之间有不对等关系,以及实例对外部数据有依赖关系的应用,称为“有状态应用"
StatefulSet用来管理Deployment和扩展一组Pod,井且能为这些Pod提供*序号和唯一性保证*。
StatefulSets 对于需要满足以下一个或多个需求的应用程序很有价值:
稳定的、唯一的网络标识符。
稳定的、持久的存储。
有序的、优雅的部署和缩放。
有序的、自动的滚动更新。
job、cronjob和hpa控制器
Job:
执行批处理任务,仅执行一次任务,保证任务的一个或多个Pod成功结束
Cronjob:
Cron-Job 创建基于时间调度的Jobs。
一个CronJob对象就像crontab (crontable)文件中的一行,它用Cron格式进行编写,并周期性地在给定的调度时间执行Job。
HPA:
根据资源利用率自动调整service中Pod数量,实现Pod水平自动缩放。
2. 控制器的部署和实例
控制器,之前的pod都是自主式的pod,在删除之后,pod就没有了,没有控制器去维护它
控制器管理的pod:在控制器的生命周期里,始终维持pod的副本数目
ReplicaSet应用(副本集)
vim rs.yaml
apiVersion: apps/v1 #api版本定义
kind: ReplicaSet #定义资源类型为ReplicaSet
metadata: #元数据定义
name: replicaset-example
spec: #ReplicaSet的规格定义
replicas: 2 #定义副本数量为2个
selector: #标签选择器,定义匹配pod的标签
matchLabels:
app: nginx
template: #pod的模板定义
metadata: #pod的元数据定义
labels: #定义pod的标签,需要和上面定义的标签一致,也可以多出其他标签
app: nginx
spec: #pod的规范定义
containers: #容器定义
- name: nginx #容器名称
image: nginx #容器镜像
kubectl apply -f rs.yaml
每个容器起来之后,都会有app:nginx标签 rs去匹配pod,标签必须和底下的容器标签一致
注意:在使用指定控制器时,尽量使用apply来创建pod,apply支持更新而create不支持
kubectl get pod
kubectl get rs
可以看到一次运行了2个pod
测试pod的拉伸,直接将yaml文件中副本的个数修改就可
把副本数量修改至现在的3个,可以看到重新更改文件时,直接成功
replicas: 3
缩减时,也直接更改副本个数就可以。
缩减时也可以直接在文件中修改(又改为2个),可以看到副本数量又变回2个。
Deployment应用
一个Deployment控制器为Pods和ReplicaSets提供描述性的更新方式。
先删除上面的实验:kubectl delete -f rs.yaml
kubectl get pod
vi nginx_deployment.yaml
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
kubectl apply -f de.yaml
kubectl get pod --show-labels
测试拉伸
测试做拉伸,和rs没有什么区别,因为拉伸本身就是由rs来维护的,副本的数量就是由rs来控制的
测试滚动更新,只需要在yaml文件中将myapp的版本改为v2即可
[kubeadm@server1 manifest]$ vim nginx_deployment.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还存在,并没有被删除掉,这是为了便于回滚
集群内部访问,更新成功
可以看到更新成功 回滚:与更新的方法相同,只需要修改文件内容的版本。回滚会直接使用原来的rs(更新时并没有删除)
回滚的时候,直接使用的是原来的rs,保留pod
DaemonSet应用
DaemonSet确保全部(或者某些)节点上运行一个Pod的副本。当有节点加入集群时,也会为他们新增一个Pod。当有节点从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod。
首先拉取zabbix镜像并上传到harbor仓库
vi zabbix_daemon.yaml
apiVersion: apps/v1 #api版本定义
kind: DaemonSet #定义资源类型为ReplicaSet
metadata: #元数据定义
name: daemonset-example
labels:
k8s-app: zabbix-agent
spec: #DaemonSet的规格定义
selector: #标签选择器,定义匹配pod的标签
matchLabels:
name: zabbix-agent
template: #pod的模板定义
metadata: #pod的元数据定义
labels: #定义pod的标签,需要和上面定义的标签一致,也可以多出其他标签
name: zabbix-agent
spec: #pod的规范定义
containers: #容器定义
- name: zabbix-agent #容器名称
image: zabbix/zabbix-agent #容器镜像
测试:
DaemonSet控制器不需要rs来维护副本。DaemonSet确保每个节点运行一个pod副本。当有节点新加入集群时,也会为他们新增一个pod。当节点从集群删除时,对应的pod会被回收。如果删除DaemonSet会删除它创建的所有pod
测试删除一个pod
我们可以看到:删除后,DaemonSet控制器会自动再启动一个pod
job控制器
job比较适合做计算类的操作
kubectl api-resources |grep job
首先拉取per镜像,上传至私有仓库
计算圆周率:
apiVersion: batch/v1 #api版本定义
kind: Job #定义资源类型为ReplicaSet
metadata: #元数据定义
name: job-example
labels:
k8s-app: job-example
spec: #DaemonSet的规格定义
template: #pod的模板定义
metadata: #pod的元数据定义
name: job-example
spec: #pod的规范定义
containers: #容器定义
- name: pi
image: perl
command: ["perl"]
args: ["-Mbignum=bpi","-wle","print bpi(2000)"]
restartPolicy: Never
kubectl apply -f job.yaml #计算的结果在日志中
Cronjob应用
vim cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-example
spec:
schedule: "* * * * *" #分时日月周
jobTemplate:
spec:
template:
spec:
containers:
- name: cronjob
image: busybox
args:
- /bin/sh
- -c
- date;echo Hello from k8s cluster
restartPolicy: OnFailure
kubectl get pod
kubectl get pod
kubectl logs cronjob-example-1587266520-g6ckb
从图可以看出,一分钟创建一个pod并执行echo Hello from k8s cluster
原文地址:https://www.cnblogs.com/dyjey/p/15104220.html
- 一键清理应用数据或者清除应用缓存的方法
- 开发者必知:谷歌做了一个艰难的决定
- React编程思想
- 基于 React + Webpack 的音乐相册项目(下)
- Python中Keras深度学习库的回归教程
- Apache Spark 1.1中的统计功能
- 一次关闭所有Activity和连续点击两次返回键关闭程序的方法
- 解决TextView排版混乱或者自动换行的问题
- 怎样设置EditText内部文字被锁定不可删除和修改,而文字只能在后面输入
- 教你如何使用微信网页版“抓取”微信撤回消息
- 移动开发之实现图片轮播效果
- 浅谈Andorid开发中的MVP模式
- jsp标准标签库整理(JSTL)
- java Map的简单运用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 华为提出十大数学挑战!解出一个就是年薪百万!
- 一道 Google 的面试题
- 生产实践 | 基于 Flink 的短视频生产消费监控
- 图数据库调研
- Swift 类构造器的使用
- 「网络IO套路」当时就靠它追到女友
- 起个简单枯燥的标题:找出连续差相同的数字
- 10分钟带你搞懂代理模式、静态代理、JDK+CGLIB动态代理
- 握草!某程序员竟然在深夜偷偷在代码里下毒!
- 自然资源部贡献的Landuse数据(2000、2010、2020)
- LoRa节点开发——SDK整体设计思路
- 01 . Nginx简介及部署
- 02 . Nginx平滑升级和虚拟主机
- LoRa节点开发——LoRaWAN节点入网代码详解
- 03 . Nginx日志配置及日志切割