05-k8s-Deployment控制器

摘要

本文内容转自网络,个人学习记录使用,请勿传播

在Kubernets中部署应用的流程

image-20210901132220655

制作镜像

通过Dockerfile制作镜像并存储在镜像仓库中

使用Deployment控制器基于制作好的镜像部署服务

1
2
kubectl create deployment web --image=nginx-custom
kubectl get deployment,pods

使用service发布pod

1
2
kubectl expose deployment web --port=80 --type=NodePort --target-port=8080 --name=web
kubectl get service

通过资源清单进行服务编排(YAML)

yaml文件格式

K8s是一个容器编排引擎,使用YAML文件编排要部署应用,因此在学习之前,应先了解YAML语法格式:

  • 缩进表示层级关系
  • 不支持制表符tab缩进,使用空格缩进
  • 通常开头缩进 2 个空格
  • 字符后缩进 1 个空格,如冒号、逗号等
  • --- 表示YAML格式,一个文件的开始
  • #注释

通过资源清单创建Deployment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: apps/v1 # 控制器的定义
kind: Deployment
metadata:
name: web
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: web
template: # 被控制的对象
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:1.17.10


# 上面的资源清单等同于
kubectl create deployment web --image=nginx:1.17.10 --replicas=3 -n default
apiVersion API版本
kind 资源类型
metadata 资源元数据
spec 资源规格
replicas 副本(实例)数量
selector 标签选择器,与下面metadata.labels保持一致
template Pod模板
metadata Pod元数据
spec Pod规格
containers 容器配置

通过资源清单创建Service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: Service
metadata:
name: web
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: web
type: NodePort

# 上面的资源清单等同于
kubectl expose deployment web --port=80 --target-port=8080 --type=NodePort -n default

service里的selector要与deployment中的matchLabels保持一样。

port Service端口,通过ClusterIP访问用
targetPort 镜像内服务端口,例如nginx镜像是80
selector 标签选择器,与Deployment中标签保持一致
type Service类型

通过资源清单创建资源

1
2
3
4
# 创建和更新
kubectl apply -f xxx.yaml
# 删除
kubectl delete -f xxx.yaml

通过命令生成资源清单

1
2
3
4
# 通过创建命令获取资源清单
kubectl create deployment nginx --image=nginx:1.17.10 -o yaml --dry-run=client > my-deploy.yaml
# 通过get命令导出已存在的资源清单
kubectl get deployment nginx -o yaml > my-deploy.yaml

查看资源清单的帮助信息

1
2
kubectl explain pods.spec.containers
kubectl explain deployment

matchLabelslabels的注意事项

  • 两边标签保持一样
  • 标签可以写多个
  • 标签与其他应用保持唯一
  • 标签一般怎么写:一般根据应用程序属性写,例如应用名称、项目名称

Deployment工作负责均衡器

Deployment是最常用的K8s工作负载控制器(Workload Controllers),是K8s的一个抽象概念,用于更高级层次对象,部署和管理Pod。其他控制器还有DaemonSet、StatefulSet等。

image-20210901134051784

deployment主要用于多副本的无状态服务,如web应用、api服务、微服务等

主要功能

  • 管理Pod和ReplicaSet
  • 具有上线部署、副本设定、滚动升级、回滚等功能
  • 提供声明式更新,例如只更新一个新的Image

应用生命周期管理流程

image-20210901134151921

应用部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
kubectl create deployment web --image=nginx:1.16 --replicas=3 --dry-run=client -o yaml > web.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web
name: web
spec:
replicas: 3 # pod副本预期数量
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web # pod副本的标签
spec:
containers:
- image: nginx:1.16
name: nginx

kubectl apply -f web.yaml

replicas:副本数量,即多少个Pod(多少个应用实例)

应用升级

应用升级有三种方式

  • 修改yaml文件并重新应用yaml文件
    • kubectl apply -f web.yaml
  • 通过命令更新镜像版本
    • kubectl set image deployment/web nginx=nginx:1.17.10
  • 通过系统编辑器编辑应用
    • kubectl edit deployment/web

image-20210901134703267

滚动升级:K8s对Pod升级的默认策略,通过使用新版本Pod逐步更新旧版本Pod,实现零停机发布,用户无感知。

滚动升级

滚动升级再k8s中的实现

  • 1个Deployment
  • 2个ReplicaSet

image-20210901134814188

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 滚动升级的过程
初次部署:
Normal ScalingReplicaSet 28m deployment-controller Scaled up replica set web-7995df6956 to 3

第一次升级,由java-demo升级到nginx:1.16
Normal ScalingReplicaSet 18m deployment-controller Scaled up replica set web-545c8dd8d8 to 1
Normal ScalingReplicaSet 17m deployment-controller Scaled down replica set web-7995df6956 to 2
Normal ScalingReplicaSet 17m deployment-controller Scaled up replica set web-545c8dd8d8 to 2
Normal ScalingReplicaSet 17m deployment-controller Scaled down replica set web-7995df6956 to 1
Normal ScalingReplicaSet 17m deployment-controller Scaled up replica set web-545c8dd8d8 to 3
Normal ScalingReplicaSet 16m deployment-controller Scaled down replica set web-7995df6956 to 0

第二次升级,由nginx:1.16升级到nginx:1.17
Normal ScalingReplicaSet 11m deployment-controller Scaled up replica set web-5ffdd58fff to 1
Normal ScalingReplicaSet 10m deployment-controller Scaled down replica set web-545c8dd8d8 to 2
Normal ScalingReplicaSet 10m deployment-controller Scaled up replica set web-5ffdd58fff to 2
Normal ScalingReplicaSet 9m44s (x3 over 10m) deployment-controller (combined from similar events): Scaled down replica set web-545c8dd8d8 to 0

旧版本:545c8dd8d8 nginx:1.16
新版本:5ffdd58fff nginx:1.17

滚动升级步骤:
5ffdd58fff scale-up 扩容为1个Pod副本
545c8dd8d8 scale-dwon 缩容为2个Pod副本
5ffdd58fff scale-up 扩容为2个Pod副本
545c8dd8d8 scale-dwon 缩容为1个Pod副本
5ffdd58fff scale-up 扩容为3个Pod副本
545c8dd8d8 scale-dwon 缩容为0个Pod副本

RS在其中不断调谐副本数量,实现滚动策略。

水平扩缩容

通过修改replicas的值可以直接对pod进行扩缩容

1
2
kubectl scale deployment web --replicas=10
# 或者修改yaml文件中的值,然后重新apply yaml文件

image-20210901134945225

回滚

1
2
3
4
5
6
# 查看历史发布版本
kubectl rollout history deployment/web
# 回滚上一个版本
kubectl rollout undo deployment/web
# 回滚历史指定版本
kubectl rollout undo deployment/web --to-revision=2

回滚是重新部署某一次部署时的状态,即当时版本所有配置

k8s内部的回滚记录并不是十分晚上,一般我们可以通过外部管理资源清单版本的方式实现历史版本的记录

下线删除

1
2
kubectl delete deploy/web
kubectl delete svc/web

滚动升级与回滚实现机制

image-20210901140234786

用途

  • Pod副本数量管理,不断对比当前Pod数量与期望Pod数量
  • Deployment每次发布都会创建一个RS作为记录,用于实现回滚

replicaSet

replicaSet(RS):副本集,是一个控制器,具体是管理Pod副本的,他是deployment小弟,是滚动升级的执行者

  • 滚动升级执行者
  • 发布版本记录者

DeployMent 声明式更新

什么是声明式更新?

声明式区别于命令式,它描述目标性质,让计算机明白目标,而非流程。而命令式则需要用具体的做法来明确的指出每一步该怎么做。

声明式更新指的是DeployMent更新服务时只会针对声明的字段对应的资源属性进行更新。比如:apply 命令可以用yaml文件中声明的字段来更新Deployment。不仅更新镜像,而且还添加了就绪探针,以及在yaml中添加或修改的其他声明。

如果新的yaml也包含 replicas 字段,当它与现有Deployment中的数量不一致时,那么 apply 操作才会对Deployment进行扩容。也就是说:

使用 kubectl apply 更新Deployment时如果不期望副本数被更改,则不用在YAML文件中添加 replicas 这个字段。

滚动更新

有两个参数可用用来配置滚动更新策略:

  • maxUnavailable表示在更新过程中,最多有多少个 Pod 不可用(这个数值也可以是百分比,例如 20% 表示最多有 20% 的 Pod 不可用)。譬如说,如果设置maxUnavailable为 1,那么更新过程会分多次进行,每次都是先销毁 1 个旧的 Pod,然后创建 1 个新的 Pod 替换它。
  • 在更新的过程,如果需要保证服务的 100% 可用,可以使用maxSurge,同时将maxUnavailable设置为 0。譬如说,将maxSurge设置为 1,同时将maxUnavailable设置为 0,那么更新过程会分多次进行,每次都是先创建 1 个新的 Pod,如果新的 Pod 可用了,这时才会替换掉旧的 Pod。