前言
本文介绍了控制器,临时任务与计划任务,Headless服务
一、控制器
控制器是k8s内置的管理工具,可以帮用户实现Pod的自动化部署,自维护,扩容,滚动更新等功能的自动化程序
使用控制器的原因:
1、有大量的Pod需要维护管理
2、需要维护Pod的健康状态
3、控制器可以像机器人一样替用户完成维护管理的工作
Deployment控制器
最常用的无状态服务控制器没有Deployment、ReplicaSet、Pod组成、支持集群扩容缩容、滚动、更新、自动维护Pod可用性及副本数量等功能。
ReplicaSet和Pod由Deployment自动管理,用户无需干预
Deployment控制器
Deployment 资源文件
---
kind : Deployment # 资源对象类型
apiVersion : apps/v1 #版本
metadata : # 元数据
name : myweb # 名称
spec : # 详细定义
replicas : 2 #副本数量
selector : # 定义标签选择器
matchLabels : # 支持matchExpressions表达式语法
app:httpd # 通过标签来确定哪个Pod由它来管理
template : # 定义用来创建Pod的模板
metadata : # Pod元数据
labels : # 名称由控制器生成
app:httpd # 这里只能定义标签
spec : # Pod的详细定义
restarPolicy : Always # 重启策略
containers : # 容器定于
- name : webserver # 容器名称
image : myos:httpd # 创建容器使用的镜像
imagePullPolicy : Always # 镜像下载策略
DaemonSet控制器
无法自定义副本数量
所创建的Pod与node节点绑定
每个node上都会运行一个Pod
当有新Node加入集群时,会为他新增Pod副本,当Node从集群移除时,这些Pod也会被回收,典型:kube-proxy
DaemonSet资源文件
---
kind : DaemonSet # 资源对象类型
apiVersion : apps/v1
metadata :
name : myds
spec :
# replicas : 2 # 删除副本参数
selector :
matchLabels :
app:httpd
template :
metadata :
labels :
app:httpd
spec :
restartPolicy : Always
containers :
- name : webserver
image : myos:httpd
imagePullPolicy : Always
Job/CronJob控制器
Job是一个单任务控制器,负责执行一次任务,保证任务在一个或多个Pod上执行成功
CronJob像Job的升级版,他是基于时间管理的Job控制器
定义Job资源对象
---
kind : Job
apiVersion : batch/v1
metadata :
name : myjob # 资源对象名称
spec : # Job的详细定义
template : # 创建Pod的模板
spec : # Pod的详细定义
restartPolicy : OnFailure # 只支持OnFailure,Never
containers : # 容器定义
- name : myjob # 容器名称
image : myos:8.5 # 创建容器使用的镜像
command : ["/bin/bash"] # 自定义任务,可使用脚本
创建CronJob资源对象
时间定义schedule:分、时、日、月、周
---
kind : CronJob
apiversion : batch/v1
metadata :
name : mycj
spec :
schedule : "* * * * 1-5"
jobTemplate :
spec : # Job详细定义
template: # 创建Pod模板
spec : # Pod详细定义
restartPolicy : OnFailure # 只支持OnFailure,Never
containers: # 容器定义
- name : myjob # 容器名称
image :myos:8.5 # 创建容器时使用的镜像
command :["/bin/bash"] # 自定义任务
args :
- -c
- |
sleep 3 # 脚本
exit $((RANDOM%2)) # 退出状态码,失败后会重新运行
二、高级控制器
StatefulSet控制器
StatefulSet旨在与有状态的应用及分布式系统一起使用,涉及了Headless服务、存储卷、DNS等相关知识点,是一个宽泛而复杂的话题
Headless服务
配置StatefulSet时首先要自定义一个Headless服务
创建Pod时会自动吧<Pod名称>注册为域名
创建StatefulSet资源对象
---
kind : StatefulSet
apiVersion : apps/v1
metadata :
name : mysts
spec :
serviceName: mysvc2
replicas : 2
selector :
matchLabels :
app:httpd
template :
metadata :
labels :
app:httpd
spec :
restartPolicy :Always
containers :
- name : webserver
image : myos:httpd
imagePullPolicy : Always
HPA控制器
HorizontalPodAutoscaling简称HPA,可在k8s集群中基于CPU利用率或其他应用程序提供的度量指标实现水平自动伸缩功能,自动缩放Pod的数量
控制器会周期性的获取平均利用率
与目标值相比较后 来调整副本数量
创建Deployment
---
kind: Deployment
apiVersion : apps/v1
metadata :
name : myweb
spec :
replicas :1
selector :
matchLabels :
app:httpd
templates :
metadata :
labels :
app:httpd
spec :
restartPOlicy : Always
containers :
- name : webserver
image : myos:httpd
imagePullPolicy : Always
resources :
requests :
cpu:200m
创建ClusterIP
---
kind : Service
apiversion : v1
metadata :
name : websvc
spec :
type : ClusterIP
clusterIP : 10.245.1.80
selector :
app:httpd
ports :
- protocol : TCP
port :80
targetPort : 80
创建HorizontalPodAutoscaling控制器
---
kind : HorizontalPodAutoscaler # 资源对象类型
apiVersion : autoscaling/v1 # 版本
metadata : # 元数据
name : myweb # 资源对象名称
spec : # 详细定义
minReplicas : 1 # 最小创建副本数
maxReplicas : 5 #最大创建副本数
targetCPUUtilizationPercentage : 50 # 警戒值,以百分比计算
scaleTargetRef : # 监控的资源对象
kind : Deployment # 资源对象文件
apiVersion : apps/v1 # 版本
name : myweb # 资源对象文件