Kubernetes Deployment控制器详解:功能、配置与实验
Kubernetes Deployment控制器详解:功能、配置与实验
Kubernetes(简称K8S)作为容器编排和自动化运维的开源平台,其核心功能之一就是通过控制器来管理多个Pod。本文将详细介绍Kubernetes中的Deployment控制器,包括其功能、配置方法以及实际操作示例。
一、引入Deployment
对于Kubernetes来说,Pod是资源调度的最小单元。Kubernetes主要通过控制器来管理多个Pod,其中Deployment和ReplicaSet(RS)是最常见的控制器类型。它们之间的关系如下图所示:
二、Deployment支持的功能
- 动态水平的弹性伸缩
容器相比虚拟机的最大优势在于可以灵活地进行弹性伸缩。在Kubernetes中,这一功能由控制器实现。Deployment的弹性伸缩本质上是指RS下Pod数量的增加或减少。在创建Deployment时会相应创建一个RS,通过RS实现弹性伸缩的自动化部署,并在很短的时间内完成数量变更。弹性伸缩通过修改YAML文件中的replicas
参数实现,修改后通过apply
命令重新应用即可实现扩容或缩容。
- 支持动态的回滚和滚动更新
定义一个Deployment会创建一个新的RS,通过RS创建Pod。删除Deployment控制器时,也会删除所对应的RS及RS下控制的Pod资源。可以说Deployment是建立在RS之上的一种控制器,可以管理多个RS。每次需要更新Pod时,都会自动生成一个新的RS,把旧的RS替换掉。多个RS可以同时存在,但只有一个RS在运行。新RS里的Pod会依次替换旧RS里的Pod,这个过程大约需要10分钟。Deployment还支持回滚到以前的历史版本。
三、Deployment资源清单文件详解
apiVersion: apps/v1 # 版本
kind: Deployment # 类型
metadata: # Deployment的元数据
name: httpd # Deployment的名字
labels: # 标签
app: httpd # 标签app=httpd
spec: # Pod的信息
replicas: 3 # Pod的副本数
selector: # 标签选择器
matchLabels: # 查找匹配的标签
app: httpd # app=httpd
template: # Pod的模板信息,根据模板信息来创建Pod
metadata: # Pod的元数据
labels: # Pod的标签
app: httpd # 标签app=httpd
spec: # 容器的信息
containers: # 容器
- name: httpd # 容器名
image: httpd # 容器所需的镜像
ports: # 端口
- containerPort: 80 # 容器暴露的端口
当需要查看Deployment资源对象的详细组成时,可以使用以下命令:
kubectl explain deployment
可以一级一级地查看,想查看什么只需要在后面加上.字段名
即可。例如查看Deployment下的spec
字段:
kubectl explain deployment.spec
在编写YAML文件时,需要注意字段之间的等级,每级之间一般用两个空格隔开,文件中不可以出现tab键。当你不清楚要空几个时,可以用kubectl explain
命令查一下,看看你加了几个点,点数2=空格数。如kubectl explain deployment.spec
,有一个点,那就是12=2,需空两个格。
四、滚动更新及回滚实验
- 创建Deployment
- 访问其中一个页面内容
- 滚动更新:更改镜像
- 查看Pod并访问页面内容,可以看到已经改变
- 查看历史版本,实现回滚更新,需要大概等10分钟,才能完全完成
查看Deployment的更新记录:
kubectl rollout history deployment nginx-deployment
查看历史版本2的详细信息:
kubectl rollout history deployment nginx-deployment --revision=2
回滚到历史版本2:
kubectl rollout undo deployment nginx-deployment --to-revision=2
五、弹性伸缩实验
- 创建一个Deployment,4副本:
kubectl apply -f jpzhttpd.yaml
- 缩为3副本:
kubectl apply -f jpzhttpd.yaml