ansible kubectl connection plugin

ansible是目前业界非常火热的自动化运维工具。ansible可以通过ssh连接到目标机器上,从而完成指定的命令或者操作。

在kubernetes集群中,因为并不是所有的服务都是那么容器化。有时候也会用到ansible进行一些批量运维的工作。

一种方式是可以在容器中启动ssh,然后再去连接执行。但是并不是所有的容器都会启动ssh。

针对于这种情况,我想到了直接用kubectl进行连接操作,因此开发了kubectl的connection插件,并贡献给了社区。

该功能无需容器中启动ssh服务即可使用,已经合入ansible的主干,自ansible 2.5版本后随ansible发布。

详细操作文档可以参考https://docs.ansible.com/ansible/latest/plugins/connection/kubectl.html。本文将对其主要功能和设计的思路原理进行一下介绍。

安装使用

ansible 2.5后内置了该connection plugin,所以之后的版本都可以自动支持。如果是之前的版本,需要自行合并该PR。

PR参考:https://github.com/ansible/ansible/commit/ca4eb07f46e7e3112757cb1edc7bd71fdd6dacad#diff-12d9b364560fd0bec5a1cee5bd0b3c24。

该connection plugin需要使用kubectl的二进制文件,务必将kubectl先进行安装,一般可以放置在/usr/bin下。

操作样例

以下是一个inventory的配置。

[root@f34cee76e36a kubesql]# cat inventory
[kube-test:vars]
ansible_connection=kubectl
ansible_kubectl_kubeconfig=/etc/kubeconfig
[kube-test]
hcnmore-32385abb-9f753dda-nxr8h ansible_kubectl_namespace=nevermore

对于kube-test组,ansible_connection=kubectl用于标识使用kubectl的连接插件。

ansible_kubectl_kubeconfig用于标识使用的kubeconfig的位置。当然,也支持使用无认证、使用用户名密码认证等等方式进行连接。这些配置可以参考官网的说明: https://docs.ansible.com/ansible/latest/plugins/connection/kubectl.html#parameters

在inventory配置完成后,即可进行ansible的操作了。这里我们查看一下当前的工作目录。

[root@f34cee76e36a kubesql]# ansible -i inventory kube-test -m shell -a "pwd"
hcnmore-32385abb-9f753dda-nxr8h | CHANGED | rc=0 >>
/

playbook样例使用

该connection plugin同样支持使用playbook对批量任务进行执行。以下是一个playbook的样例。

- hosts: kube-test
gather_facts: False
tasks:
- shell: pwd

我们复用了先前样例的inventory进行执行,同时打开-v进行观察。

[root@f34cee76e36a kubesql]# ansible-playbook -i inventory playbook -v
Using /etc/ansible/ansible.cfg as config file PLAY [kube-test] ************************************************************************************************************************************************************************************************* TASK [shell] *****************************************************************************************************************************************************************************************************
changed: [hcnmore-32385abb-9f753dda-nxr8h] => {"changed": true, "cmd": "pwd", "delta": "0:00:00.217860", "end": "2019-03-18 20:55:39.479859", "rc": 0, "start": "2019-03-18 20:55:39.261999", "stderr": "", "stderr_lines": [], "stdout": "/", "stdout_lines": ["/"]} PLAY RECAP *******************************************************************************************************************************************************************************************************
hcnmore-32385abb-9f753dda-nxr8h : ok=1 changed=1 unreachable=0 failed=0

可以看到在目标机器上成功进行了命令执行。

优势与弊端

kubectl connection plugin不仅支持命令的执行,其他如cp文件、fetch文件等基本操作都可以执行。当然如执行shell、script脚本、密钥管理等复杂操作也都可以通过这个插件进行执行。但是这些复杂操作有的需要目标机器上安装python等环境进行支持,这个要根据不同模块的需求具体来看。

使用openshift的插件oc的使用方式与kubectl类似,这里不重复介绍了。

可以说这个kubectl的插件可以解决大部分的日常运维操作,但是也有一些弊端,就是使用kubectl的二进制进行连接。每次每个连接都需要启动一个进程进行kubectl执行,而且连接速度不快。因此不太适合大批量的容器高频操作。

我个人的建议是可以用这个插件进行注入密钥、低频启停服务的运维操作。大批量的操作仍然最好使用ssh进行。

实现原理

ansible connection plugin

ansible的connection plugin有很多,目前支持的有ssh、docker、kubectl等等。要实现一个ansible的连接插件,其实主要实现的是三个接口:

  • exec_command: 在目标机执行一个命令,并返回执行结果。
  • put_file: 将本地的一个文件传送到目标机上。
  • fetch_file: 将目标机的一个文件拉回到本地。

这三个接口对应三个原生的模块,依次是raw,cp和fetch。而ansible的几乎所有复杂功能,都是通过这三个接口来进行实现的。比如shell或者script,就是通过将脚本或者命令形成的脚本cp到目标机上,而后进行命令执行完成的。

kubectl exec

kubectl exec天然就是执行命令的。docker client 有cp的功能,但是kubectl并不具有(kubectl 1.5版本后也支持了cp)。这里用了一个小的技巧,就是使用dd命令配合kubectl exec进行文件的传输和拉取。

因此要求目标容器中也要有dd命令,否则该插件也无法工作。

dd主要用于读取、转换和输出数据。我们将一个src文件拷贝到另外一个地方dest,可以使用dd if=/tmp/src of=/tmp/dest。dd也支持从标准输入中获取数据或者输出到标准输出中。因此拷贝也就可以使用dd if=/tmp/src | dd of=/tmp/dest的方法。

理解了这些,我们就可以使用kubectl来进行文件的传输了。那么向容器中传输文件的方式就可以使用 dd if=/tmp/src | kubectl exec -i podname dd of=/tmp/dest。反过来,从容器中拉取文件就对应可以使用kubectl exec -i podname dd of=/tmp/src | dd of=/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

使用ansible kubectl插件连接kubernetes pod以及实现原理的更多相关文章

  1. kubernetes pod内抓包,telnet检查网络连接的几种方式

    背景 在日常kubernetes的运维中,经常遇到pod的网络问题,如pod间网络不通,或者端口不通,更复杂的,需要在容器里面抓包分析才能定位.而kubertnets的场景,pod使用的镜像一般都是尽 ...

  2. 转【非容器化Jenkins连接Kubernetes】

    一.环境说明 OS系统版本:Ubuntu 18.04 TLS 软件版本:Jenkins 2.121.2                Kubernetes plugin 1.10.2          ...

  3. (五)Kubernetes Pod状态和生命周期管理

    什么是Pod Pod是kubernetes中你可以创建和部署的最小也是最简的单位.Pod代表着集群中运行的进程. Pod中封装着应用的容器(有的情况下是好几个容器),存储.独立的网络IP,管理容器如何 ...

  4. Kubernetes Pod故障归类与排查方法

    Pod概念 Pod是kubernetes集群中最小的部署和管理的基本单元,协同寻址,协同调度. Pod是一个或多个容器的集合,是一个或一组服务(进程)的抽象集合. Pod中可以共享网络和存储(可以简单 ...

  5. Python Django撸个WebSSH操作Kubernetes Pod(下)- 终端窗口自适应Resize

    追求完美不服输的我,一直在与各种问题斗争的路上痛并快乐着 上一篇文章Django实现WebSSH操作Kubernetes Pod最后留了个问题没有解决,那就是terminal内容窗口的大小没有办法调整 ...

  6. kubectl插件管理工具krew

    文章转载自:https://blog.51cto.com/loong576/2452592 一.k8s核心组件 Kubernetes 主要由以下几个核心组件组成: etcd 保存了整个集群的状态: a ...

  7. Kubernetes Pod 镜像拉取策略

    Kubernetes Pod 镜像拉取策略 官方文档:https://kubernetes.io/docs/concepts/containers/images/ • IfNotPresent:默认值 ...

  8. Kubernetes Pod 资源限制

    Kubernetes Pod 资源限制 官方文档:https://kubernetes.io/docs/concepts/configuration/manage-compute-resources- ...

  9. Kubernetes Pod 调度约束

    Kubernetes Pod 调度约束 可以将pod调度到指定的节点Node内 默认:根据节点资源利用率等分配Node节点. nodeName用于将Pod调度到指定的Node名称上 nodeSelec ...

随机推荐

  1. webpack学习记录-初步体验(一)

    一.关于webpack 自从出现模块化以后,大家可以将原本一坨代码分离到个个模块中,但是由此引发了一个问题.每个 JS 文件都需要从服务器去拿,由此会导致加载速度变慢.Webpack 最主要的目的就是 ...

  2. CSS伪类整理笔记

    0 伪元素 虚拟的一个元素,用于向已有的元素添加特殊效果,可用标签元素实现该效果. css3中规定:伪元素的由两个冒号::开头,然后是伪元素的名称.用两个冒号::是为了区别伪类和伪元素(CSS2中并没 ...

  3. vue实战记录(六)- vue实现购物车功能之地址列表选配

    vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(六) GitHub:sue ...

  4. 主机管理+堡垒机系统开发:strace工具的实现原理(七)

    strace是Linux系统下的一个用来跟踪系统调用的工具,它的实现基础是ptrace系统调用.使用strace工具可以跟踪一个程序执行过程中发生的系统调用. 我这里讲到的内容有一点点和mips体系相 ...

  5. 金融量化分析【day111】:Pandas-时间序列处理

    一.时间对象处理 1.start 开始时间 df["2018-12-01":"2018-12-30"] 2.end 结束时间 df['2018'] ...... ...

  6. Docker:容器的四种网络类型 [十三]

    一.None类型 简介:不为容器配置任何网络功能,--net=none 1.创建容器 docker run -it --network none busubox:latest 2.功能测试 [root ...

  7. ZooKeeper-集群模式安装

    下载地址:https://zookeeper.apache.org/releases.html 至少需要准备三台节点(这里为h136.h138.h140),ZooKeeper 需要 JDK,关于 JD ...

  8. ASP.NET WebApi 自带Json返回日期带T无法格式化的问题

    WebApi自带json序列化对遇到时间日期字段的时候,到前端获取的格式总是为“ 2016-07-14T15:32:44”,中间总是会带一个T,显然不是很友好.先是偷懒在园子里边去找一些解决方案,尝试 ...

  9. 使用/dev/poll的str_cli函数

    void str_cli(FILE *fp, int sockfd) { int stdineof; char buf[MAXLINE]; int n; int wfd; ]; struct dvpo ...

  10. luogu P5301 [GXOI/GZOI2019]宝牌一大堆

    传送门 wdnm又是打麻将 首先国土无双可以直接枚举哪种牌用了\(2\)次算贡献,然后\(7\)个对子可以把每种牌的对子贡献排序,取最大的\(7\)个,剩下的牌直接暴力枚举是不行的,考虑dp,设\(f ...