Controller作用及分类
controller用于控制pod
控制器主要分为:
Deployments 部署无状态应用,控制pod升级,回退
ReplicaSet 副本集,控制pod扩容,裁减
ReplicationController(相当于ReplicaSet的老版本,现在建议使用Deployments加ReplicaSet替代RC)
StatefulSets 部署有状态应用,结合Service、存储等实现对有状态应用部署
DaemonSet 守护进程集,运行在所有集群节点(包括master), 比如使用filebeat,node_exporter
Jobs 一次性
Cronjob 周期性
Deployment
创建deployment类型应用
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx # deployment名
spec:
replicas: 1 # 副本集,deployment里使用了replicaset
selector:
matchLabels:
app: nginx # 匹配的pod标签,表示deployment和rs控制器控制带有此标签的pod
template: # 代表pod的配置模板
metadata:
labels:
app: nginx # pod的标签
spec:
containers: # 以下为pod里的容器定义
- name: nginx
image: nginx:1.15-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
版本升级
kubectl set image deployment deploy-nginx nginx=nginx:1.16-alpine --record
--record 表示会记录下来
版本回退
1, 查看版本历史信息
kubectl rollout history deployment deploy-nginx
2, 定义要回退的版本(还需要执行才是真的回退版本)
kubectl rollout history deployment deploy-nginx --revision=1
3, 执行回退
kubectl rollout undo deployment deploy-nginx --to-revision=1
副本扩容
kubectl scale deployment deploy-nginx --replicas=2
副本裁减
kubectl scale deployment deploy-nginx --replicas=1
滚动更新
更新策略
删除式更新(Recreate):当更新策略设定为Recreate,在更新镜像时,它会先删除现在正在运行的Pod,等彻底杀死后,重新创建新的RS(ReplicaSet)然后启动对应的Pod,在整个更新过程中,会造成服务一段时间无法提供服务。也称之为单批次更新。 滚动更新(Rolling Update): 滚动更新是默认的更新策略,一次仅更新一批Pod,当更新的Pod就绪后再更新另一批,直到全部更新完成为止;该策略实现了不间断服务的目标,但是在更新过程中,不同客户端得到的响应内容可能会来自不同版本的应用。会出现新老版本共存状态。
删除式更新
1.杀死所有旧版本的Pod,此时Pod无法正常对外提供服务; 2.创建新的RS,启动新的Pod; 3.等待Pod就绪,对外提供服务;
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx-test
namespace: default
spec:
strategy: # 滚动更新策略
type: Recreate # Recreate表示的是删除式更新,也称为单批次更新;
replicas: 2
selector:
matchLabels:
app: nginx-deployment
template:
metadata:
labels:
app: nginx-deployment
spec:
containers:
- name: nginx
image: nginx:1.16
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
滚动更新
滚动更新时,应用升级期间还要确保可用的Pod对象数量不低于阈值以确保可用持续处理客户端的服务请求,变动的方式和Pod对象的数量范围将通过spec.strategy.rollingUpdate.maxSurge和spec.strategy.rollingUpdate.maxUnavailable两个属性同时进行定义
1.创建新的RS,然后根据新的镜像运行新的Pod。
2.删除旧的Pod,启动新的Pod,当新Pod就绪后,继续删除旧Pod,启动新Pod。
3.持续第二步过程,一直到所有Pod都被更新成功。
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx-test
namespace: default
spec:
strategy:
type: RollingUpdate
replicas: 2
selector:
matchLabels:
app: nginx-deployment
template:
metadata:
labels:
app: nginx-deployment
spec:
containers:
- name: nginx
image: nginx:1.16
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
滚动更新参数
maxUnavailable (最大不可用数)
定义:在更新过程中,允许不可用的Pod的最大数量或百分比
作用:控制更新速度,值越大更新越快但风险越高
示例值:数字(如1)或百分比(如25%)
默认值:25%
maxSurge (最大峰值数)
定义:在更新过程中,允许创建的超过期望副本数的Pod的最大数量或百分比
作用:控制资源使用,值越大更新越快但消耗资源越多
示例值:数字(如1)或百分比(如25%)
默认值:25%
通用场景:
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
DaemonSet
DaemonSet介绍
DaemonSet能够让所有(或者特定)的节点运行同一个pod。
当节点加入到K8S集群中,pod会被(DaemonSet)调度到该节点上运行,当节点从K8S集群中被移除,被DaemonSet调度的pod会被移除
如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删除。
如果一个DaemonSet的Pod被杀死、停止、或者崩溃,那么DaemonSet将会重新创建一个新的副本在这台计算节点上。
DaemonSet一般应用于日志收集、监控采集、分布式存储守护进程等
DaemonSet应用案例
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-nginx
spec:
selector:
matchLabels:
name: nginx-ds
template:
metadata:
labels:
name: nginx-ds
spec:
tolerations: # tolerations代表容忍
- key: node-role.kubernetes.io/master # 能容忍的污点key
effect: NoSchedule # kubectl explain pod.spec.tolerations查看(能容忍的污点effect)
containers:
- name: nginx
image: nginx:1.15-alpine
imagePullPolicy: IfNotPresent
resources: # resources资源限制是为了防止master节点的资源被占太多(根据实际情况配置)
limits:
memory: 100Mi
requests:
memory: 100Mi
Job
Job介绍
● 对于ReplicaSet而言,它希望pod保持预期数目、持久运行下去,除非用户明确删除,否则这些对象一直存在,它们针对的是耐久性任务,如web服务等。
● 对于非耐久性任务,比如压缩文件,任务完成后,pod需要结束运行,不需要pod继续保持在系统中,这个时候就要用到Job。
● Job负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。
Job应用案例
apiVersion: batch/v1
kind: Job
metadata:
name: mysql-dump
spec:
template:
metadata:
name: mysql-dump
spec:
nodeName: k8s-master2
containers:
- name: mysql-dump
image: mysql:5.7
command: ["/bin/sh","-c","mysqldump --host=mysql-test -uroot -pabc123 --databases mysql > /root/mysql2022.sql"]
volumeMounts:
- mountPath: "/root"
name: mysql-data
restartPolicy: Never
volumes:
- name: mysql-data
hostPath:
path: /opt/mysqldump
其他参数:
spec:
completions: 10 # 执行job的次数
parallelism: 1 # 执行job的并发数
template:
metadata:
CronJob
CronJob介绍
类似于Linux系统的crontab,在指定的时间周期运行相关的任务
时间格式:分时日月周
CronJob应用案例
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: mysql-dump
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
nodeName: worker02
containers:
- name: c1
image: mysql:5.7
command: ["/bin/sh","-c","mysqldump --host=mysql-test -uroot -pabc123 --databases mysql > /root/mysql`date +%Y%m%d%H%M`.sql"]
volumeMounts:
- name: mysql-data
mountPath: "/root"
restartPolicy: Never
volumes:
- name: mysql-data
hostPath:
path: /opt/mysqldump
StatefulSet
作用
StatefulSet 是用来管理有状态应用的控制器。
StatefulSet 用来管理某Pod集合的部署和扩缩, 并为这些 Pod 提供持久存储和持久标识符。
无状态应用与有状态应用
无状态应用
如nginx
请求本身包含了响应端为响应这一请求所需的全部信息。每一个请求都像首次执行一样,不会依赖之前的数据进行响应。
不需要持久化的数据
无状态应用的多个实例之间互不依赖,可以无序的部署、删除或伸缩
有状态应用
如mysql
前后请求有关联与依赖
需要持久化的数据
有状态应用的多个实例之间有依赖,不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。
特点
稳定的、唯一的网络标识符。 (通过headless服务实现)
稳定的、持久的存储。 (通过PV,PVC,storageclass实现)
有序的、优雅的部署和缩放。
有序的、自动的滚动更新。
创建StatefulSet应用
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: web # statefulset的名称
spec:
serviceName: "nginx"
replicas: 3 # 3个副本
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15-alpine
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "nfs-client" # 与前面定义的storageclass名称对应
resources:
requests:
storage: 1Gi
应用滚动更新
它将按照与 Pod 终止相同的顺序(从最大序号到最小序号)进行,每次更新一个 Pod。
StatefulSet可以使用partition参数来实现金丝雀更新,partition参数可以控制StatefulSet控制器更新的Pod。
kubectl patch sts web -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":2}}}}'
使用patch参数来指定了StatefulSet控制器的partition参数为2,表示当更新时,只有Pod的编号大于等于2的才更新。
kubectl set image sts/web nginx=nginx:latest
如何实现全部更新呢?
kubectl patch sts web -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":0}}}}'
kubectl set image sts/web nginx=nginx:latest
应用扩容与缩容
在StatefulSet扩容时,会创建一个新的Pod,该Pod与之前的所有Pod都是有顺序的,并且新Pod的序号最大。在缩容时,StatefulSet控制器删除的也是序号最大的Pod。
kubectl scale sts web --replicas=4