Kubernetes 理解笔记之“控制器模型” Deployment


本文是自己在理解 Deployment 过程中的笔记,重在理解,对于细节可能并不十分详尽,但会涉及一些实践。



补充:Kubernetes 中的“对象”和“控制器模式”

1、容器编排

在 Kubernetes 中,Pod 对象作为容器的进一步组合和封装,用来更好地描述应用,而对于这些对象的”编排“(调度、安排、管理)逻辑则是由控制器(Controller)来完成,也就是说容器编排的核心就是利用”控制器模式“来最终操作 Pod 对象,要么就是创建、更新一些 Pod(或者其他的 API 对象、资源),要么就是删除一些已经存在的 Pod(或者其他的 API 对象、资源)。

2、控制器模式

核心就是”控制循环“。用代码表示:

// 针对一种待编排的对象 X,它有一个对应的控制器:
for {
  // 实际状态,往往来自于 Kubernetes 集群本身
  实际状态 := 获取集群中对象X的实际状态(Actual State)
  // 期望状态,一般来自于用户提交的 YAML 文件
  期望状态 := 获取集群中对象X的期望状态(Desired State)
  if 实际状态 == 期望状态{
    什么都不做
  } else {
    执行编排动作,将实际状态调整为期望状态
  }
}

3、“一切皆对象”

Kubernetes 的控制器其实也是一种对象,设计原理就是“用一种对象管理另一种对象”。所以,既然也是 API 对象,就会有各个字段,使用也就可以 YAML 配置操作,属性实际上都是由上半部分的控制器定义(包括期望状态),加下半部分的被控制对象的模板组成的。
例如 Deployment :
Deployment YAML

Deployment 理解

1、Deployment 能干什么?

一个承接应用部署的云平台必须具备的能力,首先想到的应该就是”作业副本水平扩展/收缩“和”版本升级控制“了,这点在 Kubernetes 中便是通过 Deployment 这个控制器对象实现。

2、Deployment 如何实现功能?

Deployment 实际上是一个两层控制器,实际操作的是 ReplicaSet 对象,然后由 ReplicaSet 来操作 Pod 对象实现编排。

如图,首先它通过 ReplicaSet 的个数来描述应用的版本,每改动一次 Pod 模板就创建一个新的 ReplicaSet;然后,它再通过 ReplicaSet 的属性(比如 replicas 的值),来保证 Pod 的副本数量。
注:一个 ReplicaSet 对象,其实就是由副本数目的定义和一个 Pod 模板组成的。(它的定义其实是 Deployment 的一个子集),如下:

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 使用实例

以一个 nginx 服务器来实现水平扩展和升级操作,YAML 文件(nginx-deployment.yaml)如下:

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

1、部署及查看命令

# 部署
$ kubectl create -f nginx-deployment.yaml


# 查看 Deployment 状态信息,看到刚开始还没有完全部署
$ kubectl get deployments
NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3         0         0            0           1s

# 实时查看 Deployment 对象的状态变化
$ kubectl rollout status deployment/nginx-deployment
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment.apps/nginx-deployment successfully rolled out

# 查看 Deployment 状态信息,完全部署完成
$ kubectl get deployments
NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3         3         3            3           20s

# 查看 Deployment 的 Events,了解流程
$ kubectl describe deployment nginx-deployment

2、将副本数从3个扩展到4个

# 扩展
$ kubectl scale deployment nginx-deployment --replicas=4
deployment.apps/nginx-deployment scaled

3、将 nginx 版本从1.7.9升级到1.9.1

第一种:修改了 Deployment 的 Pod 模板,“滚动更新”就会被自动触发

$ kubectl edit deployment/nginx-deployment
... 
    spec:
      containers:
      - name: nginx
        image: nginx:1.9.1 # 1.7.9 -> 1.9.1
        ports:
        - containerPort: 80
...
deployment.extensions/nginx-deployment edited

第二种:直接修改 nginx-deployment 所使用的的镜像

$ kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
deployment.extensions/nginx-deployment image updated

其他:控制滚动升级的策略

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
...
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1

在上面这个 RollingUpdateStrategy 的配置中,maxSurge 指定的是除了 DESIRED 数量之外,在一次“滚动”中,Deployment 控制器还可以创建多少个新 Pod;而 maxUnavailable 指的是,在一次“滚动”中,Deployment 控制器可以删除多少个旧 Pod。

4、将 nginx 版本进行回滚

# 回滚上一个版本
$ kubectl rollout undo deployment/nginx-deployment
deployment.extensions/nginx-deployment

# 回滚到指定版本
# (1)先查看
$ kubectl rollout history deployment/nginx-deployment # --revision=2 可以查看对应版本具体的API细节
deployments "nginx-deployment"
REVISION    CHANGE-CAUSE
1           kubectl create -f nginx-deployment.yaml --record
2           kubectl edit deployment/nginx-deployment
3           kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
# (2)再选版本回滚
$ kubectl rollout undo deployment/nginx-deployment --to-revision=2
deployment.extensions/nginx-deployment

5、多次执行更新操作,但只升级一次

# 让这个 Deployment 进入了一个“暂停”状态
$ kubectl rollout pause deployment/nginx-deployment
deployment.extensions/nginx-deployment paused

# --- 
# 随意使用 kubectl edit 或者 kubectl set image 指令,修改这个 Deployment 的内容了
# ---

# 把这个 Deployment“恢复”回来,触发“滚动更新”
$ kubectl rollout resume deploy/nginx-deployment
deployment.extensions/nginx-deployment resumed

参考:

《深入剖析Kubernetes | 极客时间》张磊,容器编排和Kubernetes作业管理 16 17

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值