使用 Ansible 模块自动化您的 Kubernetes 容器编排

将 Ansible 与 Kubernetes 结合使用,实现云自动化。此外,获取我们使用 Ansible k8s 模块的速查表。
219 位读者喜欢这篇文章。
Ship captain sailing the Kubernetes seas

Ansible 是自动化工作的最佳工具之一。Kubernetes 是编排容器的最佳工具之一。当您将两者结合时会发生什么?正如您可能预期的那样,Ansible 与 Kubernetes 结合使用可让您自动化容器编排。

Ansible 模块

Ansible 本身基本上只是一个用于解释 YAML 文件的框架。它的真正力量来自其众多模块。模块使您能够通过 playbook 中一些简单的配置设置来调用外部应用程序。

有一些模块直接处理 Kubernetes,还有一些模块处理相关的技术,例如 DockerPodman。学习一个新的模块通常类似于学习一个新的终端命令或一个新的 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_versionkind)。

在使用此 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

云模块

随着越来越多的开发和部署转移到云端,了解如何自动化云的重要方面非常重要。k8spodman_image 模块只是与 Kubernetes 相关的模块的两个示例,并且仅仅是为云开发的众多模块中的一小部分。查看您的工作流程,找到您想要跟踪和自动化的任务,并了解 Ansible 如何帮助您事半功倍。

下载 Ansible k8s 速查表

接下来阅读什么
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,通常同时进行。

1 条评论

很好的信息

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.