导读
本文给你分享我在K8S生产环境上部署微服务项目遇到的问题:
1、限制了容器资源,还经常被杀死?
2、滚动更新之健康检查重要性
3、滚动更新之流量的丢失
先说一下第一个问题,限制容器资源,还经常去杀死的原因?
就是说部署的java应用,不一会就重启了,其实重启就是在重建了,这就意味着你的pod是不健康的,然后k8s重新再帮你去拉取了,这样的话就要去找问题去排查了,说白了其实就是被杀死了,可以通过describe去查看一下事件,一般都会能看到,由于健康状态检查没通过,然后再去拉取的,因为是java应用,由于堆内存溢出,然后被kill掉,在日志最后一行会出现一个kill的字段,看一下它重启的原因,之前我遇到的是它的堆内存没限制住,它本身有jvm,jvm主要有内存做交换数据的,它堆内存主要是性能设计的一个体现,所以他的堆内存很容易就会超出,超出之后呢,很可能会被k8s杀死掉,为什么k8s会kill它,因为它超出了限制,默认容器会使用宿主机所有的资源,如果不做资源限制,会影响整个宿主机,然后整个宿主机资源不够会实现飘移,会转移到其他主机上,然后再异常,可能会起到一种雪崩的效应,所以一般我们都是要做资源限制的,难道这个限制,限制不了java应用吗?其实它是限制不住的,虽然k8s部署应用还是很方便的,但是部署java应用还是不兼容的,比如它不能识别当前java容器的限制,就是不能识别我们指定的限制,也就是你在yaml去限制的,容器的堆内存没有限制,它就会超出这个限制,如果超出这个limits的限制,k8s就会把它杀掉,k8s自身它有这个策略,如果超出这个容量的限制,就会帮你杀掉,再帮你拉起。
面对java这样的堆内存稍微有一点流量突发,就可能资料利用率就上来了,所以这个幅度还是比较大的,这样就会导致k8s杀掉,然后再拉起,这样循环,可能一天几百次的这样效果。
说到这个问题,怎么来解决docker的资源限制,其实这