项目的生命周期
创建------>发布------>更新------>回滚------>删除
为什么宿主机不能直接与pod映射
![](https://i-blog.csdnimg.cn/direct/2cd4304332d44fadbb32888ff0684773.png)
![](https://i-blog.csdnimg.cn/direct/2718e6c5db684ebcb06d2f9f1cef3681.png)
为什么宿主机不能直接与pod映射,中间要有集群?
service一旦和控制器的标签关联之后,会自动的发现该控制器pod的变化自动的获取pod的数量和ip地址的变化。
service既可以关联一个控制器,也可以关联多个控制器,也可以关联pod。
pod是不断变化的,service是不变的。所以必须要有一个中间的状态。
service的类型
1、ClusterIP:当设置控制器的暴露端口时,不指定type,默认就是clusterip,是service的默认类型。访问这个IP可以直接访问pod,但是外部的请求是不能直接到达的。仅限于集群内部的通信。
2、NodePort:需要在创建的时候指定端口类型:--type=NodePort,一旦设定NodePort,会在每个节点上都开放一个端口,每个节点上的端口都是相同的,NodePort的端口号的范围30000-32767
3、LoadBalancer:这个地址一般是云平台服务商提供的地址,仅限于公有云服务平台上设置的service。可以通过这个地址直接访问,实现负载均衡。
4、ExternalName:不能提供负载均衡的服务,service映射到集群外的域名,不涉及后端的pod负载均衡。(一般不用,了解即可)
pod的镜像更新-set
![](https://i-blog.csdnimg.cn/direct/64e0027460ab42259bab726cf22cb01b.png)
- deployment的更新方式是滚动更新,也更新其中一部分,然后更新所有
pod的镜像更新就是修改pod的镜像文件
![](https://i-blog.csdnimg.cn/direct/c3aa3d1374ec49598c055c3a5995e87b.png)
pod的镜像回滚-rollout
回滚用于命令行控制。可以回滚到上一次的操作,也可以隔代。
查看更新过的历史版本
![](https://i-blog.csdnimg.cn/direct/7f9e4d4abbb84b189bf631e8054f4abb.png)
- 更新时加上record可以记录版本
- 数字越大表示最近的版本
pod的镜像回滚
![](https://i-blog.csdnimg.cn/direct/7a6b833f54b748bbb19550150288d1c9.png)
项目的发布3种方式
蓝绿发布
把应用服务器分为蓝组和绿组。
要先升级蓝组,先把蓝组从负载均衡中移除出去,绿组继续为用户提供服务。升级蓝组,蓝组升级完毕之后,加入到负载均衡当中,把绿组移除,再升级绿组完成之后,再把绿组加入到负责均衡当中去。
特点:
1、如果升级有问题,影响范围比较大。
2、发布策略简单
3、用户无感知,平滑过度。
早期成本是比较高的,现在有了负载均衡之后,成本也降低了。
金丝雀发布
在升级的时候,先升级一小部分,然后暂停整个升级,一部分是新的,另一大部分还是旧的。
筛选出一小部分用户在新的版本上应用,观察,如果没有问题再把剩余的部分全部更新到新的版本。
特点:
1、一旦出现问题,影响范围很小,调整和修复也很快。
2、充分评估了版本的性能,稳定,出问题的话对用户的体验影响也很小。
3、用户无感知,平滑过渡。
滚动更新
k8s的deploymen的t默认更新方式。
yaml文件
基于yml文件创建pod
配置pod.yml文件
![](https://i-blog.csdnimg.cn/direct/9bab30a6efcf44019170e61284a73ead.png)
运行yml文件创建pod
![](https://i-blog.csdnimg.cn/direct/3fd5baa7d2f64c1f9ad5cabd835f5c5d.png)
删除基于yml文件的pod
![](https://i-blog.csdnimg.cn/direct/0736a5b4a61f43fdabed2b74cba71de7.png)
- 删除yml文件会删除基于这个yml文件创建的pod
基于yml文件创建deployment
配置deployment.yml文件
![](https://i-blog.csdnimg.cn/direct/fa2c36955be54099b789e46a8b0e9fe4.png)
运行之后可以看出,由deployment控制器创建的pod成功。
![](https://i-blog.csdnimg.cn/direct/05a0ed44f85d45c6bee9ee21328ba994.png)
也可以直接暴露宿主机的端口做映射,但是这种方式只能映射node节点的80端口而不能映射master的端口。
![](https://i-blog.csdnimg.cn/direct/a58caef3c89a427898efaccd06afe463.png)
如果想要所有节点都做映射,需要将kind:deployment换成daemonset,并删除下面的副本才可以。
基于yml文件创建service
配置service.yml文件
![](https://i-blog.csdnimg.cn/direct/4daf8fb304e44773a9f033d13c3c87fc.png)
- 可以在targetPort下面,添加nodePort: 30001,指定宿主机暴露端口
运行之后可以看出,给上面创建deployment的pod创建了对外服务。
![](https://i-blog.csdnimg.cn/direct/d48c3ccad32a4e54840c0c36c19f1a95.png)
当然也可以把deployment和service的yml文件写在一起,用---分割符分开,可以直接创建pod并建立对外服务。
pod内容器的重启策略
基于控制器创建的pod重启策略只能是Always(默认策略),如果用其他策略只能使用基于pod创建的yaml文件。
![](https://i-blog.csdnimg.cn/direct/123f9d60e2d74397ab473fd592fbc808.png)
当pod内的容器启动失败或者运行时报错的重启策略:
- Always:默认模式,一直重启(自愈机制的核心)
- Never:都不重启,docker就是Never
- OnFailure:只有状态是非0才会重启,是0不重启
command和args
command和args都会覆盖的原有容器的命令输出。
类似于docker的cmd和entrypoint,command和args级别比cmd和entrypoint要高。
args也会给command传参数,在非传参的情况下,只能有一个command,args。
command术lagrs在个yaml文件中,非传参的情况下,只能存在一个,表示容器的启动命令,
会覆盖原容器的启动命令。
1、在创建pod时,使用OnFailure策略,可以使用command和args进行传参。
![](https://i-blog.csdnimg.cn/direct/6eba072fd1da41199155566fcebbe95c.png)
![](https://i-blog.csdnimg.cn/direct/3ab4dc54799b492b9f8709f2ece16f59.png)
2、command和args具体用法
![](https://i-blog.csdnimg.cn/direct/7841097aa84c4118964efc3e9a9229f5.png)
![](https://i-blog.csdnimg.cn/direct/4fee85a9e30849bca5d97e5668201d1e.png)
这里使用command和args都行。