控制器
控制器都遵循k8s项目中的一个通用编排模式:控制循环
遵循以下伪代码:
for {
实际状态 := 获取集群中对象 X 的实际状态(Actual State)
期望状态 := 获取集群中对象 X 的期望状态(Desired State)
if 实际状态 == 期望状态{
什么都不做
} else {
执行编排动作,将实际状态调整为期望状态
}
}
实际状态:可以通过:心跳汇报、监控系统以及控制器主动收集等
期望状态:一半来自于用户提交的YAML文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mIziGh8b-1646402447545)(D:\application\study\programme\郑泽涛学习记录\深入剖析k8s\第五章\pic\1.png)]
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
ReplicaSet
Deployment控制器实际操作的对象是ReplicaSet,ReplicaSet再去控制Pod(kubectl get rs)
Deployment 控制 ReplicaSet(版本),ReplicaSet 控制 Pod(副本数)
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-set
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
分析以下Deployment
apiVersion: 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.7.9
ports:
- containerPort: 80
kubectl scale
可以通过kubectl scale实现水平扩展以及水平收缩
kubectl scale deployment nginx-deployment --replicas=4
deployment.apps/nginx-deployment scaled
查看nginx-deployment创建后的状态信息
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 4/4 4 4 81s
- DESIRED:用户期望的 Pod 副本个数(spec.replicas 的值);
- CURRENT:当前处于 Running 状态的 Pod 的个数;
- UP-TO-DATE:当前处于最新版本的 Pod 的个数,所谓最新版本指的是 Pod 的 Spec 部分与 Deployment 里 Pod 模板里定义的完全一致;
- AVAILABLE:当前已经可用的 Pod 的个数,即:既是 Running 状态,又是最新版本,并且已经处于 Ready(健康检查正确)状态的 Pod 的个数。
kubectl rollout status
kubectl rollout status可以实时查看 Deployment 对象的状态变化
kubectl edit
如果修改了Deployment中的Pod模板,将会触发滚动更新。
通过kubectl edit修改
kubectl edit deployment nginx-deployment
Deployment 的控制器,实际上控制的是 ReplicaSet 的数目,以及每个 ReplicaSet 的属性
kubectl rollout undo
把 Deployment 回滚到上一个版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2//回到指定版本
kubectl rollout history
查看每次 Deployment 变更对应的版本
kubectl rollout history deployment/nginx-deployment --revision=2//查看细节
Kubernetes 项目还提供了一个指令,使得我们对 Deployment 的多次更新操作,最后 只生成一个 ReplicaSet
kubectl rollout pause
使 Deployment 进入“暂停”状态,对 Deployment 的所有修改,都不会触发新的“滚动更新”,也不会创建新的 ReplicaSet
对 Deployment 修改操作都完成之后,只需要再执行一条 kubectl rollout resume 指令,就可以把这个 Deployment“恢复”回来
spec.revisionHistoryLimit
暂停”状态,对 Deployment 的所有修改,都不会触发新的“滚动更新”,也不会创建新的 ReplicaSet
对 Deployment 修改操作都完成之后,只需要再执行一条 kubectl rollout resume 指令,就可以把这个 Deployment“恢复”回来
spec.revisionHistoryLimit
Deployment 对象有一个字段,叫作 spec.revisionHistoryLimit,就是 Kubernetes 为 Deployment 保留的“历史版本”个数。如果把它设置为 0,就不能做回滚操作了。