deployment部署pod,也是通过yaml文件的方式部署。deployment通过yaml文件定义需要deploy名称,需要几个pod协助运行,拉取的镜像版本等内容。一般来说一个deployment管理一个pod模板,比如前端和后端就需要分开管理。实际上deployment在底层是利用了replicaset的对象,replicaset直接管理pod。
部署一个deployment:
编写yaml文件–deploy.yaml:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hello-deploy
spec:
replicas: 10
selector:
matchLabels:
app: hello-world
minReadySeconds: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-pod
image: nigelpoulton/k8sbook:latest
ports:
- containerPort: 8080
apiversion:指定api版本
kind:指定类型,这里是deployment
metadata:deployment的标签,定义了它的名字为hello-deploy
spec:spec一下都是pod相关的内容。
replicas:副本数量,就是pod数量
selector:deploy管理这个pod的选择标签。这里定义了一个标签app:hello-world
minReadySeconds:最小的准备时间。意思就是每个副本创建之间最小间隔时间,这里为10s
strategy:更新策略。type:更新类型为RollingUpdate。
RollingUpdate:这里有两个定义maxUnavailable和maxSurge。maxUnavailable是最大的不可用的副本,maxSurge是最大的超过期望的副本数的数量。这里两个都为1,意思是我们deploy定义的副本数是10,一般来说就有10个副本同时可用,但是更新的时候,拿一个来更新操作(maxUnavailable),就只有9个可用,同时创建一个新的更新pod(maxSurge),就会出现11个副本数。最终结果就是同时有两个pod更新,11-9=2。如果一个1,一个0的话,应该是一次一个的更新。分别对应下面的两个值。这里我调成了一个1,一个0,所有最大不超过10副本数为0,但是不可用的可以少一个为9。
template是pod模板,下面有个containers是定义容器,指定镜像和名称等。
使用kubectl apploy来是deploy.yaml应用至集群:
kubectl apply -f deploy.yaml
查看该deploy集群情况:
kubectl apply -f deploy.yaml
kubectl describe deploy hello-deploy
查看replicaset:
kubectl get rs
滚动更新
假如我们对我们之前的deploy.ment部署的版本做了更新,并将新的版本做成了一个镜像,取名为nigelpoulton/k8sbook:edge,现在我们需要将应用进行升级。
修改deploy.yaml文件,只需要将容器镜像改成image: nigelpoulton/k8sbook:edge即可,其他不用修改。
升级操作:
kubectl apply -f deploy.yaml --record
加入前面两个参数为1,1的话,这里只能两个两个更新,而且设置了间隔时间为10s,才能下次两个更新。
查看更新过程:
kubectl rollout status deploy hello-deploy
也可以使用:
kubectl get deploy
应用回滚
升级的使用了–record参数,kubernetes会维护该deployment的历史版本,可以查看历史版本信息:
kubectl rollout history deployment hello-deploy
前面数字是版本号,版本1是初始版本,2是更新后的版本,操作命令也被记录下来。
这里说一下replicaset,升级后回滚都和它有关,当应用升级后,会产生新的replicaset,但是旧的replicaset还存在,而且保留之前的配置信息。所以当回滚的时候就是启用旧的replicaset进行回滚操作。
查看replicaset:
kubectl get rs
可以看到旧的rs已经没有pod存在。
进行回滚:
kubectl rollout undo deployment hello-world --to-revision=1
这就完成回滚操作了,但是这样和配置文件的镜像内容不符,规范来说还需手动修改yaml文件的镜像内容。
如果需要删除该deployment的话,执行:
kubectl delete -f deploy.yaml