Deployment是新一代用于Pod管理的对象,与Replication Controller相比,它提供了更加完善的功能,使用起来更加简单方便。
注:本文进行的相关操作是基于k8s 1.2.2版本执行的。
我们可以使用下面的yaml文件来创建一个Deployment:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
track: stable
spec:
containers:
- name: nginx
image: index.tenxcloud.com/docker_library/nginx:1.7.9
ports:
- containerPort: 80
从上面的例子中可以发现Deployment与RC的定义基本相同,需要注意的是apiVersion和kind是有差异的。
使用kubectl get可以查询Deployment当前状态:
$ kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 3 3 3 2h
其中DESIRED为期望的Pod数量,CURRENT为当前的数量,UP-TO-DATE为已更新的数量,AVAILABLE为已运行的数量。通过这四个数量我们可以了解到Deployment目前的状态。Deployment会自动处理直到四个数量达到一致,而在Deployment更新过程中CURRENT、UP-TO-DATE和AVAILABLE会根据不同情况发生变化。
Deployment更新分为两种情况:
通过kubectl edit指令更新Deployment,可以将例子中的nginx镜像版本改成1.9.1来触发一次rolling-update。期间通过kubectl get来查看Deployment的状态,可以发现CURRENT、UP-TO-DATE和AVAILABLE会发生变化。
kubectl delete指令可以用来删除Deployment。需要注意的是通过API删除Deployment时,对应的RS和Pods不会自动删除,需要依次调用删除Deployment的API、删除RS的API和删除Pods的API。
Replica Set(简称RS)是k8s新一代的Pod controller。与RC相比仅有selector存在差异,RS支持了set-based selector(可以使用in、notin、key存在、key不存在四种方式来选择满足条件的label集合)。Deployment是基于RS实现的,我们可以使用kubectl get rs命令来查看Deployment创建的RS:
$ kubectl get rs
NAME DESIRED CURRENT AGE
nginx-deployment-1564180365 3 3 6s
nginx-deployment-2035384211 0 0 36s
由Deployment创建的RS的命名规则为“<Deployment名称>-<pod template摘要值>”。由于之前的操作中我们触发了一次rolling-update,因此会查看到两个RS。更新前后的RS都会保留下来。
与RC相同,只需要修改.spec.replicas就可以实现Pod的弹性伸缩。
如果设置Deployment的.spec.strategy.type==Recreate时,更新时会将所有已存在的Pod杀死后再创建新Pod。与RC不同的是,修改Deployment的Pod template后更新操作将会自动执行,无需手动删除旧Pod。
与RC相比,Deployment提供了更完善的rolling-update功能:
$ kubectl get rs
NAME DESIRED CURRENT AGE
nginx-deployment-1564180365 2 2 25s
nginx-deployment-2035384211 0 0 36s
nginx-deployment-3066724191 2 2 6s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-1564180365-70iae 1/1 Running 0 25s
nginx-deployment-1564180365-jbqqo 1/1 Running 0 25s
nginx-deployment-3066724191-08mng 0/1 ImagePullBackOff 0 6s
nginx-deployment-3066724191-eocby 0/1 ImagePullBackOff 0 6s
$ kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 3 4 2 4 2h
$ kubectl get rs
NAME DESIRED CURRENT AGE
nginx-deployment-1569886762 2 2 2h
nginx-deployment-2041090608 0 0 2h
nginx-deployment-956404068 2 2 2h
除了提供完善的更新功能外,Deployment还支持回退到历史版本(曾经更新过的版本)。Deployment的更新回退是基于RS和revision号来实现的:
Deployment用户手册:
http://kubernetes.io/docs/user-guide/deployments/
Replica Set用户手册:
http://kubernetes.io/docs/user-guide/replicasets/
set-based selector:
http://kubernetes.io/docs/user-guide/labels/#label-selectors
Deployment API:
http://kubernetes.io/docs/api-reference/extensions/v1beta1/operations/
canary部署示例:
http://kubernetes.io/docs/user-guide/managing-deployments/#canary-deployments