第10节 Deployment
❤️💕💕新时代拥抱云原生,云原生具有环境统一、按需付费、即开即用、稳定性强特点。Myblog:http://nsddd.top
[TOC]
Deployment
⚠️ Deployment:控制pod,使pod具有多个副本,自愈,扩缩容等能力~
deployment and pod?
Pod是单一亦或一组容器的合集
Pod是k8s的最小调度单位,一个Pod中可以有多个containers,彼此共享网络等,这是k8s的核心概念。
deployment是pod版本管理的工具 用来区分不同版本的pod
从开发者角度看,deployment顾明思意,既部署,对于完整的应用部署流程,除了运行代码(既pod)之外,需要考虑更新策略,副本数量,回滚,重启等步骤,
deployment,StatefulSet是Controller,保证Pod一直运行在你需要的状态。
有一次性的也就是job,有定时执行的也就是crontabjob,有排号的也就是sts
用deployment创建有何不同
# 清除所有pod,比较下面两条命令有啥不同
kubectl delete pod my-nginx-7fb96c846b-cnhbz my-nginx-7fb96c846b-g55km my-nginx-7fb96c846b-m9rjp myapp mynginx -n default
kubectl run mynginx --image=nginx #第一条
kubectl create deployment mytomcat --image=tomcat:8.5.68 #第二条
🚀 结果如下:
📜 对上面的解释:
可能我们现在没办法看出来很大的区别,但是我们使用delete
删除这个deployment
部署tomcat
会怎么样?
kubectl delete pod mytomcat-dc7db794-mkfxn mynginx
可以看出是没有办法删除掉的,因为删除后k8s又拉取了,这个功能是很强大的~yyds
这样的话即使机器宕机了也是不会影响的~
如果想要真正的删除怎么办?
我们可以使用deploy
查看部署(deployment简写):
[root@k8s-master01 ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
my-nginx 3/3 3 3 42h
mytomcat 1/1 1 1 10m
接下来可以删除了
[root@k8s-master01 ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
my-nginx 3/3 3 3 42h
mytomcat 1/1 1 1 10m
[root@k8s-master01 ~]# kubectl delete deploy mytomcat
deployment.apps "mytomcat" deleted
[root@k8s-master01 ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
my-nginx 3/3 3 3 42h
多副本
我们可以指定副本个数,比如说下面指定三份:
kubectl create deployment my-dep --image=nginx --replicas=3
📜 对上面的解释:
- UP-TO-DATE:表示成功启动的个数
- AVAILABLE:表示一共副本的总数
当然同样的我们可以使用
dashboard
可视化界面进行部署~
⚡ 我们还可以用下面命令打印pod
详细信息:
kubectl get pod -owide
每台机器都创建了一台,同样的,每台机器的ip
是不一样的~
工作负载-deployment扩容缩容能力
⚡ 将现有的机器(因为满足不了需求)多部署几台pod,这个过程叫做扩容。同样的缩容就是将一些pod下线(流量高峰期过了)
扩缩容
技巧
我们可以动态查看pod情况
watch -n 1 kubectl get pod
缩容为两份
kubectl scale deploy/my-nginx --replicas=2
扩容为三份
kubectl scale deploy/my-nginx --replicas=3
注意:你是可以扩容多份(即使你的服务器没有这么多)
你可以直接修改deplot配置文件达到扩缩容
kubectl edit deploy my-nginx
提示
当然你也可以用可视化界面实现(点击缩放:可以实现扩容和缩容)
yaml 声明式创建
自愈和故障转移
自愈和故障转移
当我们有一台pod
出现问题,depoyment
会感知到错误,然后将其修复(杀死重启)。
也有一种情况:某一个机器突然宕机或者下线了,整个机器没办法运行,此时depoyment
会将这个机器的所有pod
转移到其他机器正常运行,这个过程叫做故障转移。
depoyment滚动和更新能力
🚸 如果pod有新的版本,我们怎么样去升级pod?
v1 --> v2
注意⚠️
我们是不会同时更新所有的pod,因为这样的话需要停机维护,成本很大。
我们使用的方式是滚动更新,一个pod更新完了再更新下一个。
这样就不需要停机维护了~ 也不会影响正常运行
滚动更新
命令:
--record
:显示更新的效果
kubectl set image deploy/my-nginx nginx=1.16.1 --record
升级前效果:
kubectl get pod -w #可以观察到实时的更新状态
升级后效果:
版本回退
查看当前的pod版本:
image
表示对应的当前镜像版本号
[root@k8s-master01 ~]# kubectl get deploy/my-nginx -o yaml |grep image
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"nginx"},"name":"my-nginx","namespace":"default"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"nginx"}},"template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx","ports":[{"containerPort":80}]}]}}}}
kubernetes.io/change-cause: kubectl set image deploy/my-nginx nginx=1.16.1 --record=true
- image: 1.16.1
imagePullPolicy: IfNotPresent
查看历史记录:
[root@k8s-master01 ~]# kubectl rollout history deployment/my-nginx
deployment.apps/my-nginx
REVISION CHANGE-CAUSE
1 <none>
2 kubectl set image deploy/my-nginx nginx=1.16.1 --record=true
两次版本:
- 部署
my-nginx
产生的<none>
- 版本升级镜像产生的内容
回滚到上一次
我们使用rollout
命令
kubectl rollout undo deploy/my-dep --to-revision=1
其他工作负载
工作负载是在kubernetes上运行的应用程序
无论你的负载是单一组件还是由多个一同工作的组件构成,在Kubernetes中你可以在一组Pods中运行它。在Kuberneres中,pod代表的是集群上处于运行状态的一组容器。
Kubernetes Pods有确定的生命周期。例如,当某Pod在你的集群中运行时,Pod运行所在的节点出现致命错误时,所有该节点上的Pods都会失败。Kubernetes将这类失败视为最终状态:即使该节点后来恢复正常运行,你也需要创建新的Pod来恢复应用。
不过,为了让用户的日子略微好过一点,你并不需要直接管理每个Pod。相反,你可以使用负载资源来替你管理一组Pods。这些资源配置控制器来确保合适类型的、处于运行状态的Pod个数是正确的,与你所指定的状态相一致。
常用的工作负载控制器:
Deployment
:无状态应用部署(微服务)StatefulSet
:有状态应用部署(redis、mysql,提供存储、网络等)DaemonSet
:确保所有Node运行同一个Pod(守护型应用部署,比如日志收集组件)Job
:一次性任务CronJob
:定时任务
在平常我们是不会直接的创建pod
,而是使用工作负载来创建pod
⚠️注意
我们所有的部署(mysql、redis、tomcat)都是没办法通过浏览器访问的,所以没有办法看到效果,或许我们可以通过内网的地址访问(curl)
[root@k8s-master01 ~]# curl 100.66.195.43
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
END 链接
✴️版权声明 © :本书所有内容遵循CC-BY-SA 3.0协议(署名-相同方式共享)©