不要停止学习

已经有整整4个月没有写博客了。原因很多,1月初拿了个新offer,上旬提了离职,本来计划2月中旬入职,结果碰上了史无前例的新冠。这里不得不对前后两个东家表示感谢,前东家推迟上班到3月份,现东家也表达了足够的关心和帮助。疫情在家整日也比较无所事事,学习很少。3月中旬入职新公司后,发现这里的工作强度还是比前司强了很多,个人性格又不喜欢拖沓事情,整天忙着一些偏向业务代码上的工作,学习的时间也比较少(除了工作需要看了一些k8s周边项目源码和二次开发)。

回顾来看,最近一直忙于工作,看起来是很勤奋的。但身体的勤奋往往象征着精神的懒惰,已经有4个月没有认认真真学过一套课程,读过一本计算机书籍,没有用心投入参与一个开源项目(除了偶尔提一些简单的pr),哪怕是自己之前编写了很多代码的开源项目,周末看到issue bug也没心情去修,这样是不行的。不能用身体的勤奋蒙蔽自己掩盖精神的懒惰。

永远不要停止学习!

会尽量抽空每天或者几天或者一周学习一段时间,继续投入和参与开源项目,并尽量分享。加油!

什么是一流的技术文章?

这两天读Google的《SRE》时看到一段话

今天,我们能感受到整个行业都在鼓吹厚颜无耻的"代码拿来主义"(just show me the code)。开源社区内部正在形成一种"不要问我问题"的风气.............这本书中没有万能药,没有什么东西能解决一切问题,但是这恰恰是本书的宗旨:相比最后的软件结果,架构设计而言,真实的设计过程,作者本身的思考经历更有价值。实现细节永远只是短暂存在的,但是文档化的设计过程却是无价之宝。   -- 《Google SRE 运维解秘》

深以为然,不禁让我想到了过去学习张磊老师《深入剖析Kubernetes》时曾看到张磊老师回复课后留言时说过的一句话

直接讲源码是不负责任也是逃避困难的做法。(大意)

什么是一流的技术文章?绝不是一上来就开始贴源码画流程图深入到每一个函数。

相比具体的实现,掌握其思想,掌握其设计理念---为什么这样设计?架构为什么这样演进?更为重要。当然,要能将这些理念和演进历程传授给读者,更需要扎实的技术和文字功底。这远比上来就连篇累牍贴源码更困难也更有意义。

Talk is not cheap.

向每一个真诚分享的技术人致谢。

使用kubefwd对k8s中的service进行本地化调试

大家都知道,k8s中的服务(service)是对k8s中的deployment等对象的一个一致访问点.所以service会有一个vip(headless service没有).无论是普通service的vip或者headless service的pod ip其实都是k8s集群中的内部ip,在集群内访问它是非常容易的.比如有一个service叫nginx,我们在集群内的另一个pod里既可以对这个nginx service的vip进行get访问,也可以通过coredns对这个nginx service的域名如(nginx, nginx.default等)进行访问.但是在集群外呢?这就麻烦了.

常见的集群外访问service的方式大致分为 LoadBalance, NodePort, ExternalIp等方式, 再细致一点也可以通过Ingress在7层做一层分发再外接上述流量接入,甚至你可以直接将api server做proxy. 很显然的,这些方式如果在我们只是需要对服务进行调试或者随便用用的场景都是要么太复杂(Ingress), 要么花钱(LoadBanlence),要么不靠谱(NodePort).

这时候你会说,嗷,我们可以使用kubectl port-forward 功能,将service的端口port-forward到本地端口.对,没错,这确实是一个不错的解决方式,但这仍然存在非常多的问题。

比如,我们并不想要将nginx service的80端口port-forward到我的8080端口上,就想用80端口,那么如果有两个service分别叫nginx1和nginx2,这不就没法弄了吗?再比如,如果我们port-forward的svc的pod发生了变动,怎么办?再比如,我们就是想像在集群内一样,通过service的内部域名对其访问(nginx, nginx.default等),怎么办?再比如,如果我们有100个服务,难道我们要手动对每个服务port-forward然后手动选择一个没用过的端口吗?甚至,当我们的服务创建,删除,我们又得手动操作,这是何等的麻烦?

基于上述问题,一个叫kubefwd的工具出现了。
继续阅读“使用kubefwd对k8s中的service进行本地化调试”

python利用零宽切片插入元素

常见的python插入元素方式一般是insert或者手动挪动后修改值,然后其实还有种比较少用的通过零宽切片插入元素的方式,比较有意思,随便记录下.

Python 3.8.0 (v3.8.0:fa919fdf25, Oct 14 2019, 10:23:27) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [1,2,3,4,5]
>>> a[:0] = [0,0,0]
>>> a
[0, 0, 0, 1, 2, 3, 4, 5]
>>> a[4:4] = [8,8,8,8,8,8]
>>> a
[0, 0, 0, 1, 8, 8, 8, 8, 8, 8, 2, 3, 4, 5]
>>> a[4:8] = []
>>> a
[0, 0, 0, 1, 8, 8, 2, 3, 4, 5]

无正文.

使用kubectl-debug来调试pod

在k8s环境中,我们经常会碰到各种疑难杂症.比如下面这个例子:
某pod无法启动,查看日志显示原来是init时容器无法拉取某个外部网络上的包.我们exec登陆容器后试图调试下产生这个问题的原因,我们输入ping xxx.xxx.xxx,但sh直接提示"找不到ping命令",甚至直接无法exec到一个没有sh的容器中.
这样的情况我们该怎么办呢?这里有一个解决类似问题的调试工具kubectl-debug
继续阅读“使用kubectl-debug来调试pod”

virt-manager libxml2 module bug解决

virt-manager是一个kvm的管理工具,在自己用的小型环境里还是很方便的,我也用了挺久。因为是mac所以是用homebrew-virt-manager。之前一直用的老版本,最近mac更新,而且老版本有存储池无法从/var/lib/libvirt/里切换的bug,所以通过brew更新到了最新的2.2.1版本,就出现了 No module named 'libxml2'  的bug,通过google和官方issue找不到解决办法,最终自己解决,这里记录一下,方便其他需要的朋友查询。
继续阅读“virt-manager libxml2 module bug解决”