K8s的Deployment将Pod部署成无状态的应用程序,它只关心Pod的数量、Pod更新方式、使用的镜像和资源限制等。由于是无状态的管理方式,因此Deployment中没有角色和顺序的概念,换句话说:Deployment中没有状态。
通过使用Deployment,可以让开发人员上线部署Pod、设置Pod的副本、实现Pod的升级与回滚。通过在yaml文件中描述Deployment的目标是什么,Deployment控制器就会自动完成对Pod和Replica Set的管理。Kubernetes运行创建一个新的Deployment,也可以用一个新的Deployment替换旧的Deployment。
提示:ReplicaSet是下一代复本控制器,它可以独立使用。但在Kubernetes中主要是被Deployment作为协调Pod的创建、更新和删除。当使用Deployment控制器时,它会自动创建ReplicaSets,并对其进行管理。
视频讲解如下:
K8s中的Deployment控制器 |
---|
【赵渝强老师】K8s中的Deployment控制器 |
Deployment、ReplicaSet和Pod之间的关系可以通过下图来说明。
下面的描述了创建和更新Deployment的过程。
- 创建Deployment的过程:Deployment将创建ReplicaSet。ReplicaSet在后台根据指定的副本数创建Pod,并检查Pod的状态以确定Pod启动成功还是失败。
- 更新Deployment的过程:当用户更新Deployment时,Kubernetes会创建一个新的ReplicaSet。Deployment会将Pod从旧的ReplicaSet迁移到新的ReplicaSet中。如果迁移失败或者Pod不稳定,Deployment会自动回滚到上一个版本。如果迁移成功,Deployment将清除旧的不必要的ReplicaSet。
在掌握的Deployment控制器的作用后,这里将通过一个示例来演示如何使用Deployment控制管理Pod。
(1)创建deployment-demo.yaml文件,并输入下面的内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-demo
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
其中的参数含义如下表所示。
(2)通过运行以下命令创建 Deployment。
kubectl apply -f deployment-demo.yaml
(3)查看创建的Deployment和ReplicaSet信息。
kubectl get deployments,replicaset,pod
提示:这条命令可以简写为下面的形式:
kubectl get deploy,rs,pod
输出的信息如下图所示:
(4)查看每个Pod自动生成的标签,如下图所示。
kubectl get pods --show-labels
(5)修改yaml文件来实现更新的目的。下面的yaml文件将Nginx的版本升级到了1.9.1,并将Pod的副本数改成了4。
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-demo
labels:
app: nginx
spec:
replicas: 4
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.9.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
提示:这里也可以使用命令行的方式来实现更新,例如:
kubectl set image deploy deployment-demo nginx=nginx:1.9.1
(6)通过运行以下命令重新应用 Deployment。
kubectl apply -f deployment-demo.yaml
(7)获取Deployment的信息。
kubectl describe deployments deployment-demo
输出的部分信息如下:
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx:1.9.1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
(8)执行下面的命令,将Nginx的版本更新到1.7.9。
kubectl --record deployment.apps/deployment-demo \
set image deployment.apps/deployment-demo nginx=nginx:1.7.9
提示:为了能够追溯修改历史记录,这里使用了–record参数。
(9)获取Deployment的信息。
kubectl describe deployments deployment-demo
# 输出的部分信息如下。这里看出这里的Nginx版本又回到了1.7.9.
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx:1.7.9
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
(10)执行命令追溯修改的历史。
kubectl rollout history deployment deployment-demo
# 输出的信息如下:
deployment.extensions/deployment-demo
REVISION CHANGE-CAUSE
2 <none>
3 kubectl deployment.apps/deployment-demo \
set image deployment.apps/deployment-demo \
nginx=nginx:1.7.9 --record=true
(11)执行命令将回滚到版本2。
kubectl rollout undo deployment deployment-demo --to-revision=2
(12)重新获取Deployment的信息。
kubectl describe deployments deployment-demo
# 输出的部分信息如下。这里看出这里的Nginx版本又回到了1.9.1。
Pod Template:
Labels: app=nginx
Containers:
nginx:
Image: nginx:1.9.1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
(13)下面的命令将对Deployment进行缩放操作。
kubectl scale deployment deployment-demo --replicas=7
(14)下面的命令将暂停和恢复Deployment
kubectl rollout pause deployment deployment-demo
kubectl rollout resume deployment deployment-demo
提示:可以在更新Deployment之前暂停Deployment,等待更新完成后在恢复它。这允许在暂停和恢复之间应用多个修补程序,而不会触发不必要的Deployment。