Deployment同样也是Kubernetes系统的一个核心概念,主要职责和RC一样的都是保证Pod的数量和健康,二者大部分功能都是完全一致的,我们可以看成是一个升级版的RC控制器,Deployment还具有以下新特性:

  • RC的全部功能:Deployment具备上面描述的RC的全部功能
  • 事件和状态查看:可以查看Deployment的升级详细进度和状态
  • 回滚:当升级Pod的时候如果出现问题,可以使用回滚操作回滚到之前的任一版本
  • 版本记录:每一次对Deployment的操作,都能够保存下来,这也是保证可以回滚到任一版本的基础
  • 暂停和启动:对于每一次升级都能够随时暂停和启动

现在官方也都是推荐使用Deployment来管理Pod的,比如一些官方组件kube-dns、kube-proxy也都是使用的Deployment来管理的。

一个Deployment拥有多个RS,而一个RS拥有一个或多个Pod。一个Deployment控制多个RS主要是为了支持回滚机制,每当Deployment操作时,Kubernetes会重新生成一个RS并保留,以后有需要的话就可以回滚至之前的状态。

示例

vim test.taml

apiVersion: apps/v1 
kind: Deployment
metadata:
name: nginx-deploy
labels:
k8s-app: nginx-demo
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80

kubectl create -f test.yaml #创建deployment
kubectl get deployments #查看deployments信息
kubectl get rs #查看rs信息
kubectl get pod --show-labels #查看带标签信息的pod

滚动升级

vim test.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
labels:
k8s-app: nginx-demo
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.13.3 #修改版本
ports:
- containerPort: 80
minReadySeconds: 5 #Kubernetes在等待设置的时间后才进行升级
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 #升级过程中最多可以比原先设置多出的POD数量
maxUnavailable: 1 #升级过程中最多有多少个POD处于无法提供服务的状态

kubectl apply -f test.yaml #更新配置

kubectl rollout status deployment/nginx-deploy #查看更新状态

kubectl describe deployment/nginx-deploy #查看全部更新信息

kubectl rollout pause deployment/nginx-deploy #暂停更新
kubectl rollout resume deployment/nginx-deploy #继续更新

回滚

kubectl rollout history deployment nginx-deploy #查看deployment升级历史

kubectl rollout history deployment nginx-deploy --revision=3 #查看第三个revison信息

kubectl rollout undo deployment nginx-deploy #回退到上一个版本

kubectl rollout undo deployment nginx-deploy --to-revision=2 #回退到第2个版本