Pod控制器之Deployment
简介:
Deployment 是 Kubernetes v1.2 引入的新概念,引入的目的是为了更好的解决 Pod 的编排问题。为此,Deployment 在内部使用了 Replica Set 来实现目的,无论从 Deployment 的作用与目的、它的 YAML 定义,还是从它的具体命令操作来看,都可以把它看做 RC 的一次升级两者的相似度超过 90%。
Deplyment 相对于 RC 的嘴个最大升级时可以随时知道当前 Pod “部署” 的进度。实际上由于一个 Pod 的创建、调度、绑定节点以及在目标 Node 上启动对应的容器这一完整过程需要一定的时间,所以期待系统启动 N 个 Pod 副本的目标状态,实际上是一个连续变化的 “部署过程” 导致的最终状态。
Deployment 的典型使用场景有以下几个。
创建一个 Deployment 对象来生成对应的 Replica Set 并完成 Pod 副本的创建过程。
检查 Deployment 的状态来部署动作是否完成(Pod 副本的数量是否达到预期的值)。
更新 Deployment 以创建新的 Pod(比如镜像升级)。
如果当前 Deployment 不稳定,则回滚到一个早先的 Deployment 版本。
暂停 Deployment 以便于下一次性修改多个 PotTemplateSpec 的配置项,之后再回复 Deployment,进行新的发布。
扩展 Deployment 以应对高负载。
查看 Deployment 的状态,以此作为发布是否完成的指标。
清理不在需要的旧版本 ReplicaSets。
Deployment 的定义与 Replica Set 的定义很类似,除了 API 声明与 Kind 类型等有所区别:
ReplicaSet:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-repset
Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
创建一个Deployment
vim deploy-daem.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-myapp
namespace: default
spec:
replicas:2
selector:
matchLabels:
app: myapp
release: cancay
template:
metadata:
labels:
app:myapp
release: cancay
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
deploy实现更新应用时可以直接通过编辑配置文件来实现,直接修改配置文件中的replicas的数量然后使用apply创建,apply可以执行多次,create只能创建一次,apply可以把每一次的变化同步到etcd当中或者同步到apiserver当中,apiserver发现它与etcd中不同从而改变etcd从而实现他的期望状态
--record参数可以记录当前版本的Deployment都执行过哪些命令。
使用patch命令打补定的方式扩容
[root@k8s-master daem]# kubectl patch deployments.apps deploy-myapp -p '{"spec":{"replicas": 5}}'
deployment.apps/deploy-myapp patched
[root@k8s-master daem]# kubectl get pods
NAME READY STATUS RESTARTS AGE
deploy-myapp-74c58c54f5-4bh62 1/1 Running 0 5m55s
deploy-myapp-74c58c54f5-dnsx5 1/1 Running 0 5m52s
deploy-myapp-74c58c54f5-vn6b9 1/1 Running 0 7s
deploy-myapp-74c58c54f5-wjpwn 1/1 Running 0 5m54s
deploy-myapp-74c58c54f5-zfk74 1/1 Running 0 7s
liveness-httpget 1/1 Running 3 2d5h
poststart-pod 1/1 Running 7 6h2m
readiness-httpget-pods 1/1 Running 2 2d4h
使用set image方式更新版本
使用打补丁的方式修改更新策略
[root@k8s-master daem]# kubectl patch deployments.apps deploy-myapp -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge": 1,"maxUnavailable":0}}}}'
deployment.apps/deploy-myapp patched
[root@k8s-master daem]# kubectl set image deploy deploy-myapp myapp=ikubernetes/myapp:v3 && kubectl rollout pause deployment deploy-myapp
deployment.apps/deploy-myapp image updated
deployment.apps/deploy-myapp paused
因为使用了pause参数暂停了更新只更新一个,会一直暂停下去,成为金丝雀发布,
监控观察:
也可以通过kubectl rollout status deployment deploy-myapp监测
等确认好没有问题就继续更新,使用kubectl rollout resume 继续更新
kubectl rollout resume deployment deploy-myapp
使用rollout undo版本回滚:
undo默认是回滚到上一个版本 如果需要回滚到更早的版本可以使用--to-revision参数在指定回滚的版本号
[root@k8s-master ~]# kubectl rollout undo deployment deploy-myapp --to-revision=1
deployment.apps/deploy-myapp rolled back
回滚到第一版
查看rs已经回滚到第一版了