Ansible 是自动化工作的最佳工具之一。Kubernetes 是编排容器的最佳工具之一。当您将两者结合时会发生什么?正如您可能预期的那样,Ansible 与 Kubernetes 结合使用可让您自动化容器编排。
Ansible 模块
Ansible 本身基本上只是一个用于解释 YAML 文件的框架。它的真正力量来自其众多模块。模块使您能够通过 playbook 中一些简单的配置设置来调用外部应用程序。
有一些模块直接处理 Kubernetes,还有一些模块处理相关的技术,例如 Docker 和 Podman。学习一个新的模块通常类似于学习一个新的终端命令或一个新的 API。您可以从模块的文档中熟悉它,了解它接受哪些参数,并将它的选项等同于您可能使用它所连接的应用程序的方式。
访问 Kubernetes 集群
要在 Ansible 中试用 Kubernetes 模块,您必须有权访问 Kubernetes 集群。如果您没有,您可以尝试在线开立试用帐户,但大多数都是短期的。相反,您可以安装 Minikube,如 Kubernetes 网站或 Bryant Son 关于 Minikube 入门的优秀文章中所述。Minikube 提供了一个单节点 Kubernetes 安装的本地实例,允许您像配置和交互完整集群一样配置和交互它。
[下载 Ansible k8s 速查表]
在安装 Minikube 之前,您必须确保您的环境已准备好用作虚拟化后端。您可能需要安装 libvirt
并授予您自己 libvirt
组的权限
$ sudo dnf install libvirt
$ sudo systemctl start libvirtd
$ sudo usermod --append --groups libvirt `whoami`
$ newgrp libvirt
安装 Python 模块
为了准备使用与 Kubernetes 相关的 Ansible 模块,您还应该安装一些辅助 Python 模块
$ pip3.6 install kubernetes --user
$ pip3.6 install openshift --user
启动 Kubernetes
如果您使用的是 Minikube 而不是 Kubernetes 集群,请使用 minikube
命令在您的计算机上启动本地、小型化的 Kubernetes 实例
$ minikube start --driver=kvm2 --kvm-network default
等待 Minikube 初始化。根据您的互联网连接速度,这可能需要几分钟。
获取有关集群的信息
成功启动集群后,您可以使用 cluster-info
选项获取有关它的信息
$ kubectl cluster-info
Kubernetes master is running at https://192.168.39.190:8443
KubeDNS 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 使用 Kubernetes 的入口点是 k8s
模块,它使您能够从 playbook 管理 Kubernetes 对象。此模块描述了 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
在这种情况下,主机被定义为 localhost
,假设您正在针对 Minikube 运行此操作。请注意,正在使用的模块定义了可用参数的语法(例如 api_version
和 kind
)。
在使用此 playbook 之前,请使用 yamllint
进行验证
$ yamllint example.yaml
更正任何错误,然后运行 playbook
$ ansible-playbook ./example.yaml
验证新的命名空间是否已创建
$ kubectl get namespaces
NAME STATUS AGE
default Active 37h
kube-node-lease Active 37h
kube-public Active 37h
kube-system Active 37h
demo Active 11h
my-namespace Active 3s
使用 Podman 拉取容器镜像
容器是 Linux 系统,范围几乎不可能再小,可以由 Kubernetes 管理。大部分容器规范已由 LXC 项目 和 Docker 定义。Podman 是容器工具集的最新补充,因其无需守护程序即可运行而广受欢迎。
使用 Podman,您可以从存储库(例如 Docker Hub 或 Quay.io)拉取容器镜像。Ansible 语法很简单,您只需要知道容器的位置,该位置可从存储库的网站获得
- name: pull an image
podman_image:
name: quay.io/jitesoft/nginx
使用 yamllint
进行验证
$ yamllint example.yaml
然后运行 playbook
$ 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 进行小型维护任务。您的 playbook 可以像配置文件与 kubectl
一样与 Ansible 交互。事实上,在许多方面,您通过使用 Kubernetes 了解的 YAML 会转换为您的 Ansible playbook。以下是您可能直接传递给 kubectl
以部署镜像(在本例中为 Web 服务器)的配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-webserver
spec:
selector:
matchLabels:
run: my-webserver
replicas: 1
template:
metadata:
labels:
run: my-webserver
spec:
containers:
- name: my-webserver
image: nginx
ports:
- containerPort: 80
如果您知道这些参数,那么您基本上也知道使用 Ansible 完成相同操作所需的参数。您只需进行少量修改,即可将该 YAML 移动到 Ansible playbook 中的 definition
元素中
- name: deploy a web 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-webserver
image: quay.io/jitesoft/nginx
ports:
- containerPort: 80
protocol: TCP
运行此操作后,您可以像往常一样使用 kubectl
查看部署
$ kubectl -n my-namespace get pods
NAME READY STATUS
nginx-deploy-7fdc9-t9wc2 1/1 Running
云模块
随着越来越多的开发和部署转移到云端,了解如何自动化云的重要方面非常重要。k8s
和 podman_image
模块只是与 Kubernetes 相关的模块的两个示例,并且仅仅是为云开发的众多模块中的一小部分。查看您的工作流程,找到您想要跟踪和自动化的任务,并了解 Ansible 如何帮助您事半功倍。
1 条评论