深入剖析Kubernetes--第五章:Kubernetes编排原理_控制器_Deployment

控制器

控制器都遵循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

  1. DESIRED:用户期望的 Pod 副本个数(spec.replicas 的值);
  2. CURRENT:当前处于 Running 状态的 Pod 的个数;
  3. UP-TO-DATE:当前处于最新版本的 Pod 的个数,所谓最新版本指的是 Pod 的 Spec 部分与 Deployment 里 Pod 模板里定义的完全一致;
  4. 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,就不能做回滚操作了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值