嗯,2020年就要过去了,距离我上次写博客居然都有半年了,果然是忙了很多,亦或是自己在找借口?,我呢也只想写一下有深度的东西,又需要更多的时间。
惯例先记一下流水账,2月一直都在家里,比较差的信号加上自身的自制力也不强,其实花在工作的时间不长。大概03上旬的时候去的公司吧,然后就开始居家隔离(笑。4月的时候开启了招聘旺季,我也面了几个,也算是我做的比较后悔的地方,不要招一个技术不行而且无法沟通的人。五一的时候也没回去,就在附近转了一圈,手机也在那个时候进水了,原来现代技术在水火面前不值一提,另外大家如果是进水机器一般都可以放弃了,修好之后也可能有暗病,当然也取决于师傅的手艺。6月的时候搬家,终于我又达到了步行上班的水平,随之到来的是房租增长。接下来就重点讲讲做过的东西吧:
首先是vGPU相关的,为了更好的性能,我们找了几块网卡搭建RDMA的环境,用的应该是这块卡,https://www.mellanox.com/products/ethernet-adapters/connectx-4-en ,当然不是原厂的,问题就出在这个OEM版本的设备上,我一直在用官方的驱动,因为我对这一块也不是很熟,到现在也不能准备的解释什么是ROCE以及纯IB网,更坑的代码在调用网卡的时候写死了一部分参数,导致在宿主上用ibwrite和ibread都是成功的,但是在容器中一直失败,报ibv_create_qp failed to create a queue pair (qp)的错误,最后甚至怀疑到了操作系统上(而且我们都升级了内核),然后在github上面找了一个示例看能不能跑起来 https://github.com/jcxue/RDMA-Tutorial,当然也需要修改一部分,最后终于发现是写死设备号的问题。邮件列表也翻过 https://www.spinics.net/lists/linux-rdma/msg81222.html 。
接着是harbor,在镜像存储这一块,其实选择这一个…官方的registry只有cli,quay开源的时候太晚,而且安装也有些复杂?harbor在可观测性上真是辣鸡,首先镜像同步没有进度条,如果遇到一个特别大的项目,或者特别多的tag,那你就自求多福吧。当你想看看谁用了空间最多,貌似没有,虽然现在可以设置存储配置。官方的registry虽然提供了metrics,但是harbor默认没有暴露出来,这里也有携程大佬的文章可以参考一下http://arthurchiao.art/blog/monitoring-hub/ 。UI更是可怕,翻页翻到手酸。2.x之前的版本没有在线GC,这就意味着你要清理镜像的时候必须先停掉!!!https://github.com/c4po/harbor_exporter
紧接着我们就测试了Calico的集群,和官方文档上面不同的是,我们使用了外部的gobgp作为RR节点与集群连接。说一下遇到的问题的吧,首先calico并不支持固定IP,calico仅可以分配一个IP给workload,当你在滚动更新、多副本的时候就几乎不能用了,这里也有分析 https://www.ichenfu.com/2019/09/21/calico-ip-allocation-problems/,其次是IPPool不能扩充,IP Block的生命周期和节点其实是强相关的,这边文章也有分析,最后他们是用了一个CRD完成了ippool的扩充 https://mp.weixin.qq.com/s/FF8c7g8iOTX-e-efrSo5dA。https://shimo.im/docs/tXck8cGKxKWKctp8
然后是cilium的网络方案,这个就属于很硬核的,对内核要求再4.X,一些特性还要再4.18以上,在1.6之后的版本提供了网络流的可视化支持,有空再细讲。
安全相关,k8s官方提供了psp这个对象来限制用户容器的一些行为,禁止挂载hostpath、selinux、capabilities等,主要是当你在容器里面使用root用户挂载上宿主机的文件之后,你会发现可以使用rm -rf 了,这就需要CI流程的配合了。除此之外sysdig开源了falco https://falco.org/,采用内核模块加ebpf的方式,加上自定义规则,可以控制容器的行为,所以和psp的功能有重复。
除了进程的一些限制之外,资源的限制也是很重要的,尤其是磁盘和内存,当然这些都可以通过request和limit来设置,对容器磁盘的限制主要是针对可写层以及挂载这两种,这个kubelet和CRI配合。除此之外还有一下策略相关的安全,比如不设置limit不让部署,这就要用到OPA了(同类中个人觉得比较完善),可以把规则作为CRD来使用。
接着我们升级了集群,从1.14升级到1.16,然后jenkins插件就出了问题,https://github.com/fabric8io/kubernetes-client/pull/1669,是少了一个http header,最好把集群的event都整合到了一起,并用kibana画了一个dashboard。