Dployment是用来控制pod的。如果我们之前使用命令kubectl run mynginx --image=nginx也能创建拥有一个ngx容器的一个pod,但是如果我们想一次性创建100个pod副本,就要用Deployment去创建pod副本。
接下来我先删除之前创建的pod。
1.自愈能力
使用kubectl create deployment mytomcat --image=tomcat:8.5.68创建一个pod
和kubectl run mynginx --image=nginx创建pod有啥区别?
先说结论:删除的效果不同,使用传统的方式创建的pod,使用kubectl delete pod pod名 删除就真的删除了,而使用kubectl create deployment mytomcat --image=tomcat:8.5.68创建的pod使用命令删除后,k8s立马会新建一个pod。也就是说Deployment方式创建的pod有自愈能力,这也是k8s非常强大的地方。看下图
先使用Deployment方式创建一个pod,观察pod的名称是5hczs后缀,然后我删除这个pod。
删除pod。可以看到我删除pod之后,k8s有立马创建一个后缀名为6n8vl的pod,说了使用Deployment方式创建的pod即使删除了也会拥有自愈能力。使用这种方式创建的pod,我们不怕宕机和应用崩溃。
2.多副本
使用命令 kubectl create deployment my-dep --image=nginx --replicas=3,replicas=3表示创建3份,看下图。my-dep有3份且容器正在创建中
创建完成可以看到 kubectl get pod
查看dashboard
2.1 删除deploy
kubectl delete deployment xxx(xxx为my-dep)
删除之后发现my-dep不存在了,pod也不存在了
2.2 使用可视化页面创建多副本应用
查看pod在节点上部署的详细信息
kubectl get pod -owide
我集群这里只有2个工作节点,如果有5台工作节点,那么一般情况每个节点都各有一个pod。假设我们又7个工作节点,这时候假如n2挂了(n2上有2个pod,my-deploy-01创建的pod在n2上也就会挂了),这时候k8s就会在另外两个节点上创建2pod,这时候pod的个数还是5个,这就是k8s强大的自愈能力
3.pod扩容及缩容
3.1扩容
当应用遇到流量洪峰,我们需要对应用进行扩容来分担应用的压力,使用该命令对pod进行扩容
kubectl scale --replicas=5 deployment/my-dep
接下来看实际命令执行的结果,可以看到在原来的基础上有新增了2个pod
3.2缩容
当我们流量峰值过去之后,我们也可以进行缩容
我们也可以使用该命令kubectl edit deployment my-dep 也可以进行缩容,使用该命令会打开一个ymal文件,然后找到replicas标签对其进行修改,然后退出并保存。k8s就会对pod做出调整,看下图
k8s也可以做到动态扩缩容,k8s是自己根据应用去判断是否要扩缩容。
4.pod自愈和故障转移
4.1自愈
当我们集群的某个节点的pod内的容器应用出现运行异常(比如OOM),这时候该pod可能会崩溃了[图中红色部分],这时候k8s集群会感知到该pod崩溃了然后尝试去重启该pod,如果重启成功就成功了。
pod重启成功之后,整个集群又是健康的
4.2故障转移
当我们某个节点挂掉了宕机了【图中空白色部分】,则该节点上的pod也随之崩溃,这时候k8s就会将该节点上的pod转移到其他的节点上运行
例如这时候就将节点4上的pod转移到节点3
4.3 滚动更新
简而言之就是不停机更新。看下图,当前应用是V1版本【黑色的部分】,并且黑的箭头是有源源不断的流量访问过来,我们的pod准备要升级到v2版本
正在升级成v2版本【下图灰色部分的pod表示正在创建】
v2应用的pod创建成功,变成绿色,然后就可以下线v1节点的pod
版本更新命令:kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record kubectl rollout status deployment/my-dep,或者修改ymal配置文件命令kubectl edit deployment/my-dep
4.4版本回退
#历史记录 kubectl rollout history deployment/my-dep
#查看某个历史详情 kubectl rollout history deployment/my-dep --revision=2
#回滚(回到上次) kubectl rollout undo deployment/my-dep
#回滚(回到指定版本) kubectl rollout undo deployment/my-dep --to-revision=2
5.工作负载总结
除了Deployment,k8s还有
StatefulSet
、DaemonSet
、Job
等 类型资源。我们都称为 工作负载
。
有状态应用使用 StatefulSet
部署,无状态应用使用 Deployment
部署
kubernetes.io/zh/docs/con…