Kubernetes:深入了解Deployment
kuberntes部署应用最常用的一个控制器,Deployment可以部署无状态应用,像web、api就是无状态应用
Pod与controllers的关系
pod对象作为一个最小的调度单元,很少直接创建,一般使用控制器来完成一个应用的部署,控制器在集群上管理和运行容器的对象,这个对象是高级的,pod是一个抽象,不是一个实际存在的,抽象管理其他容器,为了亲密性的应用而存在的,控制器能完成更高级更负责的功能,比如弹性伸缩、滚动升级。
控制器还有另一个学名叫工作负载,通过标签相互的关联对象
controllers: 在集群上管理和运行容器的对象
通过label-selector相关联
Pod通过控制器实现应用的运维,如伸缩、滚动升级等
Deployment功能与应用场景
部署无状态应用
管理Pod和ReplicaSet
具有上线部署、副本设定、滚动升级、回滚等功能
提供声明式更新、例如只更新一个新的Image
应用场景:Web服务、微服务
使用Deployment部署应用
[root@k8s01 yml]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: web
spec:
selector:
matchLabels:
app: web
replicas: 3
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
[root@k8s01 yml]# kubectl create -f deployment.yaml
deployment.apps/nginx-deployment created
[root@k8s01 yml]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-79cfcb457-bqcfg 1/1 Running 0 34s
nginx-deployment-79cfcb457-k6n9z 1/1 Running 0 34s
nginx-deployment-79cfcb457-mqvvp 1/1 Running 0 34s
[root@k8s01 yml]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 57s
[root@k8s01 yml]#
应用升级
这是一个滚动升级的操作,现在部署了三个副本他会先起一个容器,这个容器为新的镜像,当新的镜像容器为运行的状态他将打标记的旧的容器删除掉,以此类推,升级第二个容器,最终将旧的容器替换为新的
[root@k8s01 yml]# kubectl set image deployments.apps nginx-deployment nginx=nginx:1.16.1
deployment.apps/nginx-deployment image updated
[root@k8s01 yml]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-7bfdd85555-hfw74 1/1 Running 0 47s
nginx-deployment-7bfdd85555-qclqj 1/1 Running 0 37s
nginx-deployment-7bfdd85555-s99vf 1/1 Running 0 41s
[root@k8s01 yml]#
查看升级状态
[root@k8s01 yml]# kubectl rollout status deployment nginx-deployment
deployment "nginx-deployment" successfully rolled out
[root@k8s01 yml]#
应用回滚
[root@k8s01 yml]# kubectl rollout undo deployment nginx-deployment
deployment.apps/nginx-deployment rolled back
[root@k8s01 yml]#
#回滚指定版本
[root@k8s01 yml]# kubectl rollout undo deployment nginx-deployment --to-revision=1
deployment.apps/nginx-deployment rolled back
[root@k8s01 yml]#
应用扩容
[root@k8s01 yml]# kubectl scale deployment nginx-deployment --replicas=5
deployment.apps/nginx-deployment scaled
[root@k8s01 yml]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-79cfcb457-fq9n8 1/1 Running 0 8m52s
nginx-deployment-79cfcb457-hh87r 1/1 Running 0 8m44s
nginx-deployment-79cfcb457-hksbw 1/1 Running 0 83s
nginx-deployment-79cfcb457-hxdnd 1/1 Running 0 83s
nginx-deployment-79cfcb457-pc64r 1/1 Running 0 8m41s
[root@k8s01 yml]#
应用缩容
[root@k8s01 yml]# kubectl scale deployment nginx-deployment --replicas=2
deployment.apps/nginx-deployment scaled
[root@k8s01 yml]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-79cfcb457-fq9n8 1/1 Running 0 9m49s
nginx-deployment-79cfcb457-hh87r 1/1 Running 0 9m41s
[root@k8s01 yml]#
replicasets
每一次创建一个deployment都会创建一个rs,而rs会去关联多个pod,rs对判断副本和当前运行的副本数进行比对,帮deployment控制副本数的功能,和历史版本记录的功能
滚动更新时,触发了一个滚动更新策略,创建一个新的rs,用新的镜像起Pod,在滚动升级期间新pod都会被关联到services,新创建的pod准备就绪了,会删除一个旧rs下的pod在创建一个新pod,直到就的pod为0
[root@k8s01 yml]# kubectl get replicasets
NAME DESIRED CURRENT READY AGE
nginx-deployment-5db69b7577 0 0 0 50m
nginx-deployment-79cfcb457 2 2 2 84m
nginx-deployment-7bfdd85555 0 0 0 49m
[root@k8s01 yml]#