kubectl exec天然就是执行命令的。docker client 有cp的功能,但是kubectl并不具有。这里用了一个小的技巧,就是使用dd命令配合kubectl exec进行文件的传输和拉取。
因此要求目标容器中也要有dd命令,否则该插件也无法工作。
dd主要用于读取、转换和输出数据。我们将一个src文件拷贝到另外一个地方dest,可以使用dd if=http://www.likecs.com/tmp/src of=http://www.likecs.com/tmp/dest。dd也支持从标准输入中获取数据或者输出到标准输出中。因此拷贝也就可以使用dd if=http://www.likecs.com/tmp/src | dd of=http://www.likecs.com/tmp/dest的方法。
理解了这些,我们就可以使用kubectl来进行文件的传输了。那么向容器中传输文件的方式就可以使用 dd if=http://www.likecs.com/tmp/src | kubectl exec -i podname dd of=http://www.likecs.com/tmp/dest。反过来,从容器中拉取文件就对应可以使用kubectl exec -i podname dd of=http://www.likecs.com/tmp/src | dd of=http://www.likecs.com/tmp/src。
特别注意,向容器中传输文件的-i参数是必须的。因为需要用-i参数开启支持kubectl从标准输入中获取数据。
这样就通过kubectl exec,实现了执行命令、文件传输以及拉取的效果。对应在ansible的connection plugin中进行实现,即可使得kubernetes的pod容器也支持ansible的运维控制。具体实现代码就不再重复讲述,详细可以参考https://github.com/ansible/ansible/blob/devel/lib/ansible/plugins/connection/kubectl.py。