使用Ansible的Kubernetes模块实现容器编排自动化
将 Kuberes 与 Ansible 结合实现云端自动化。,还可以参照我们的 Ansible 的 k8s 模块速查表。
Ansible 是实现自动化工作的优秀工具,而 Kuberes 则是容器编排方面的利器,要是把两者结合起来,会有怎样的效果呢?正如你所猜测的,Ansible + Kuberes 的确可以实现容器编排自动化。
Ansible 模块
实际上,Ansible 本身只是一个用于解释 YAML 文件的框架。它真正强大之处在于它丰富的模块,所谓模块module,就是在 Ansible 剧本playbook 中让你得以通过简单配置就能调用外部应用程序的一些工具。
Ansible 中有模块可以直接操作 Kuberes,也有对一些相关组件(例如 Docker 和 Podman)实现操作的模块。学习使用一个新模块的过程和学习新的终端命令、API 一样,可以先从文档中了解这个模块在调用的时候需要接受哪些参数,以及这些参数在外部应用程序中产生的具体作用。
访问 Kuberes 集群
在使用 Ansible Kuberes 模块之前,先要有能够访问 Kuberes 集群的权限。在没有权限的情况下,可以尝试使用一个短期在线试用账号,但我们更推荐的是按照 Kuberes 官网上的指引,或是参考 Braynt Son 《入门 Kuberes》的教程安装 Minikube。Minikube 提供了一个单节点 Kuberes 实例的安装过程,你可以像使用一个完整集群一样对其进行配置和交互。
下载 Ansible k8s 速记表(需注册)
在安装 Minikube 之前,你需要确保你的环境支持虚拟化并安装 libvirt,然后对 libvirt 用户组授权
$ sudo dnf install libvirt$ sudo systemctl start libvirtd$ sudo usermod --append --groups libvirt `hoami`$ negrp libvirt 安装 Python 模块
为了能够在 Ansible 中使用 Kuberes 相关的模块,你需要安装以下这些 Python 模块
$ pip3.6 install kuberes --user$ pip3.6 install openshift --user 启动 Kuberes
如果你使用的是 Minikube 而不是完整的 Kuberes 集群,请使用 minikube 命令在本地创建一个最精简化的 Kuberes 实例
$ minikube start --driver=kvm2 --kvm-ork default
然后等待 Minikube 完成初始化,这个过程所需的时间会因实际情况而异。
获取集群信息
集群启动以后,通过 cluster-info 选项就可以获取到集群相关信息了
$ kubectl cluster-infoKuberes master is running at https://192.168.39.190:8443KubeDNS is running at https://192.168.39.190:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. 使用 k8s 模块
Ansible 使用 k8s 这个模块来实现对 Kuberes 的操作,在剧本中使用 k8s 模块就可以对 Kuveres 对象进行管理。这个模块描述了 kubectl 命令的最终状态,例如对于以下这个使用 kubectl 创建新的命名空间的操作
$ kubectl create namespace my-namespace
这是一个很简单的操作,而对这个操作的最终状态用 YAML 文件来描述是这样的
- hosts: localhost tasks: - name: create namespace k8s: name: my-namespace api_version: v1 kind: Namespace state: present
如果你使用的是 Minikube,那么主机名(hosts)应该定义为 localhost。需要注意的是,所使用的模块也定义了可用参数的语法(例如 api_version 和 kind 参数)。
在运行这个剧本之前,先通过 yamllint 命令验证是否有错误
$ yamllint example.yaml
确保没有错误之后,运行剧本
$ ansible-playbook ./example.yaml
可以验证新的命名空间是否已经被创建出来
$ kubectl get namespacesNAME STATUS AGEdefault Active 37hkube-node-lease Active 37hkube-public Active 37hkube-system Active 37hdemo Active 11hmy-namespace Active 3s 使用 Podman 拉取容器镜像
容器是个 Linux 系统,几乎是最小化的,可以由 Kuberes 管理。LXC 项目和 Docker 定义了大部分的容器规范。最近加入容器工具集的是 Podman,它不需要守护进程就可以运行,为此受到了很多用户的欢迎。
通过 Podman 可以从 Docker Hub 或者 Quay.io 等存储库拉取容器镜像。这一操作对应的 Ansible 语法也很简单,只需要将存储库网站提供的镜像路径写在剧本中的相应位置就可以了
- name: pull an image podman_image: name: quay.io/jitesoft/nginx
使用 yamllint 验证
$ yamllint example.yaml
运行剧本
$ ansible-playbook ./example.yaml[WARNING]: provided hosts list is empty, only localhost is available.Note that the implicit localhost does not match 'all' PLAY [localhost] TASK [Gathering Facts] ok: [localhost] TASK [create k8s namespace] ok: [localhost] TASK [pull an image] changed: [localhost] PLAY RECAP localhost: ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 使用 Ansible 实现部署
Ansible 除了可以执行小型维护任务以外,还可以通过剧本实现其它由 kubectl 实现的功能,因为两者的 YAML 文件之间只有少量的差异。在 Kuberes 中使用的 YAML 文件只需要稍加改动,就可以在 Ansible 剧本中使用。例如下面这个用于使用 kubectl 命令部署 Web 服务器的 YAML 文件
apiVersion: apps/v1kind: Deploymentmetadata: name: my-ebserverspec: selector: matchLabels: run: my-ebserver replicas: 1 template: metadata: labels: run: my-ebserver spec: containers: - name: my-ebserver image: nginx ports: - containerPort: 80
如果你对其中的参数比较熟悉,你只要把 YAML 文件中的大部分内容放到剧本中的 definition 部分,就可以在 Ansible 中使用了
- name: deploy a eb server k8s: api_version: v1 namespace: my-namespace definition: kind: Deployment metadata: labels: app: nginx name: nginx-deploy spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: my-ebserver image: quay.io/jitesoft/nginx ports: - containerPort: 80 protocol: TCP
执行完成后,使用 kubectl 命令可以看到预期中的的部署deployment
$ kubectl -n my-namespace get podsNAME READY STATUSnginx-deploy-7fdc9-t9c2 1/1 Running 在云上使用模块
随着现在越来越多的开发和部署工作往云上转移的趋势,我们必须了解如何在云上实现自动化。其中 k8s 和 podman_image 这两个模块只是云开发中的其中一小部分。你可以在你的工作流程中寻找一些需要自动化的任务,并学习如何使用 Ansible 让你在这些任务上事半功倍。
人工智能培训
- 真正能和人交流的机器人什么时候实现
- 国产机器人成功完成首例远程冠脉介入手术
- 人工智能与第四次工业革命
- 未来30年的AI和物联网
- 新三板创新层公司东方水利新增专利授权:“一
- 发展人工智能是让人和机器更好地合作
- 新春贺喜! 经开区持续推进工业互联网平台建设
- 以工业机器人为桥 传统企业如何趟过智造这条河
- 山立滤芯SAGL-1HH SAGL-2HH
- 2015国际智能星创师大赛火热报名中!
- 未来机器人会咋看人类?递归神经网络之父-像蚂
- 成都新川人工智能创新中心二期主体结构封顶
- 斯坦德机器人完成数亿元人民币C轮融资,小米产
- 到2020年,智能手机将拥有十项AI功能,有些可能
- 寻找AI机器人的增长“跳板”:老龄化为支点的产
- 力升高科耐高温消防机器人参加某支队性能测试