1. 什么是Deployment
Deployment 是 Kubernetes 众多工作负载中的一种,用于控制 Pod,使 Pod 拥有多副本、自愈、扩缩容等能力,可以简单理解为 Pod 的控制器。
利用 Deployment 也可以创建 Pod,下面来比较一下两种方式创建 Pod 的区别。
方式一:使用 kubectl run 创建 Pod
kubectl run my-nginx --image=nginx -n hello-world
方式二:使用 kubectl create deployment 创建 Pod
kubectl create deployment my-tomcat --image=tomcat:8.5.68 -n hello-world
如果此时要删除上面创建的 Pod ,对于方式一创建的,很简单,直接执行下面的这行语句即可:
kubectl delete pod my-nginx -n hello-world
而要删除方式二创建的 Pod ,我们还能用下面的这行语句吗?
kubectl delete pod my-tomcat -n hello-world
这么做,是删不掉的。因为每删除一次,k8s 又会自动创建一个新的 my-tomcat 的 Pod(Deployment自愈能力的体现)。
原因在于方式二是通过 Deployment 的方式创建的 Pod(以部署一个应用的方式)。
如果要删除方式二创建的 Pod,可以通过下面的步骤进行:
# 第一步,获取deploy(部署)列表信息
kubectl get deploy -n hello-world
# 第二步,通过删除deploy(部署)的方式删除Pod
kubectl delete deploy my-tomcat -n hello-world
2. Deployment的各种能力
2.1 多副本能力
副本:可以理解为对于一个应用而言,将它运行在一个 Pod 上就是起一个副本,将它运行在多个 Pod 上,就是起了多个副本。
下面通过两种方式,来实现多副本的能力。
方式一:命令行方式
# 通过部署的方式,创建nginx的3个副本
kubectl create deployment nginx-base --image=nginx --replicas=3 -n hello-world
# 查看部署列表信息
kubectl get deploy -n hello-world
# 删除本次部署(即同时删除3个Pod)
kubectl delete deploy nginx-base -n hello-world
方式二:yaml文件方式
(1)写一个 yaml 文件,例如 nginx-base.yaml
apiVersion: apps/v1 # 版本号
kind: Deployment # 资源类型
metadata:
labels:
app: nginx-base # 标签名称
name: nginx-base # 本次部署的名字
namespace: hello-world # 命名空间
spec:
replicas: 3 # 副本数量
selector:
matchLabels:
app: nginx-base
template:
metadata:
labels:
app: nginx-base
spec:
containers:
- image: nginx # 容器的镜像名称
name: nginx # 容器名
(2)执行 nginx-base.yaml 文件
kubectl apply -f nginx-base.yaml
2.2 扩缩容能力
扩容:遇到流量高峰,需要增加副本数量,降低当前负载
缩容:流量高峰过去,不需要这么多副本,减少数量
方式一:命令行方式
# 将nginx-base的副本数量扩容到5个
kubectl scale --replicas=5 deployment/nginx-base -n hello-world
# 将nginx-base的副本数量缩减到2个
kubectl scale --replicas=2 deployment/nginx-base -n hello-world
方式二:修改yaml方式
打开对应的 yaml 文件,修改副本发数量,然后保存退出即可。
(1)打开文件
kubectl get deploy
kubectl edit deployment nginx-base
(2)编辑文件
apiVersion: apps/v1 # 版本号
kind: Deployment # 资源类型
metadata:
labels:
app: nginx-base # 标签名称
name: nginx-base # 本次部署的名字
namespace: hello-world # 命名空间
spec:
replicas: 2 # 副本数量
selector:
matchLabels:
app: nginx-base
template:
metadata:
labels:
app: nginx-base
spec:
containers:
- image: nginx # 容器的镜像名称
name: nginx # 容器名
(3)保存退出
2.3 自愈及故障转移能力
自愈能力:假设某个 Pod 发生故障,不能正常对外提供服务,此时 k8s 会自动杀死该 Pod ,然后再将该 Pod 重新启动。
转移能力:假设某个 Pod 所在的结点 node-01 发生了宕机,整个服务器坏掉,不能正常使用,当 k8s 经过一小段时间(可能是5分钟)检测后,发现该服务器确实不能提供服务了,那么 k8s 会自动在其它结点上重新创建 node-01 结点里面的所有 Pod ,以达到正常对外提供服务的目的。
2.4 滚动更新能力
k8s 在更新集群应用时,对于每个结点上的 Pod ,会先启动一个新的 Pod ,然后再停掉对应的老的 Pod,如此循环,直至实现每个结点上的 Pod 的更新,才算完成本次集群应用的更新。
方式一:命令行方式
kubectl set image deployment/nginx-base nginx=nginx:1.16.1 --record -n hello-world
kubectl rollout status deployment/nginx-base -n hello-world
方式二:修改yaml方式
打开对应的 yaml 文件,修改副本发数量,然后保存退出即可。
(1)打开文件
kubectl get deploy
kubectl edit deployment nginx-base
(2)编辑文件
apiVersion: apps/v1 # 版本号
kind: Deployment # 资源类型
metadata:
labels:
app: nginx-base # 标签名称
name: nginx-base # 本次部署的名字
namespace: hello-world # 命名空间
spec:
replicas: 2 # 副本数量
selector:
matchLabels:
app: nginx-base
template:
metadata:
labels:
app: nginx-base
spec:
containers:
- image: nginx:1.16.1 # 容器的镜像名称
name: nginx # 容器名
(3)保存退出
2.5 版本回退能力
如果对当前这次部署不满意,无法正常提供服务,k8s可以回滚到之前的历史版本。
#历史记录
kubectl rollout history deployment/nginx-base -n hello-world
#查看某个历史详情
kubectl rollout history deployment/nginx-base --revision=2
#回滚到上次版本
kubectl rollout undo deployment/nginx-base -n hello-world
#回滚到指定版本
kubectl rollout undo deployment/nginx-base --to-revision=2 -n hello-world
3. 工作负载
除了 Deployment 外,k8s 还有 StatefulSet 、DaemonSet 、Job 等类型的工作负载。
有状态应用使用 StatefulSet 部署,无状态应用使用 Deployment 部署。