【发布时间】:2020-06-04 20:53:01
【问题描述】:
我想自动化我的 Kubernetes 配置,例如用于 VM 的 Ansible。
一个示例场景:
- 创建命名空间港
- 通过 Helm https://github.com/goharbor/harbor-helm 部署 Harbor
什么样的工具适合这样的场景?我也可以使用 terraform 吗?
【问题讨论】:
标签: kubernetes ansible terraform kubernetes-helm
我想自动化我的 Kubernetes 配置,例如用于 VM 的 Ansible。
一个示例场景:
什么样的工具适合这样的场景?我也可以使用 terraform 吗?
【问题讨论】:
标签: kubernetes ansible terraform kubernetes-helm
我完全同意 @P Ekambaram 的观点,即 kubernetes 自动化 可以通过 ansible 成功完成,但同时我完全不同意他的观点当谈到它应该做的方式时。这样的“声明性” 代码实际上根本不是声明性的。它变成了一组命令式命令的简单包装器。除此之外,这样的剧本不是idempotent(让我们提醒一下,如果执行一次的结果与在没有任何干预动作的情况下重复执行的结果完全相同,则操作是幂等的。。) .这种方法与 ansible 中存在的关键概念之一相反。
shell 或 command 模块应该在 ansible 中用作最后的模块,只有在没有其他方式执行所需任务的情况下,例如当专用模块不存在或缺少某些重要功能时。
当涉及到使用 ansible 自动化 kubernetes 时,此类专用模块已经存在。
快速浏览一下k8s - ansible module for managing kubernetes objects,您会发现可以以更优雅、更清晰的方式实现预期的结果:
命名空间创建:
- name: Create a k8s namespace
k8s:
name: testing
api_version: v1
kind: Namespace
state: present
基于yaml定义文件创建服务
- name: Create a Service object by reading the definition from a file
k8s:
state: present
src: /testing/service.yml
您是否刚刚提到您正在使用 helm 来管理您的 kubernetes 应用程序?看看helm module documentation。有什么例子吗?你在这里:
- name: Install helm chart from a git repo
helm:
host: localhost
chart:
source:
type: git
location: https://github.com/user/helm-chart.git
state: present
name: my-example
namespace: default
为了能够在某个主机上运行大多数 Ansible 模块,您需要在其上安装两件事:
虽然对于大多数模块来说都是如此,但其中一些模块在模块可以在此类主机上运行之前必须满足其他要求。
说到k8s模块,我们可以在它的docs中读到:
执行此操作的主机需要以下要求 模块。
python >= 2.7 openshift >= 0.6 PyYAML >= 3.11
它需要 openshift(不同的 kubernetes 实现)是不正确的。安装 openshift 来管理我们的 kubernetes 集群 的工作负载没有多大意义。因此,让我们准确地避免传播任何可能具有误导性的信息:它需要OpenShift python client library,并且需要将其安装在运行模块的主机上(即在我们通常运行kubectl 命令的主机上) .
OpenShift Python 客户端封装了 K8s Python 客户端,提供 完全访问两个平台上可用的所有 APIS 和模型。 有关 API 版本详细信息和其他信息,请访问 https://github.com/openshift/openshift-restclient-python
重要提示!您不必在 kubernetes 节点上安装任何其他模块。您只需要在管理 kubernetes 工作负载的机器上使用它们。
如果我们将 Ansible 安装在配置了 kubectl 工具的同一主机上,并且我们希望直接在其上运行我们的 playbook,而不需要使用 ssh 或配置 ansible 库存,我们只需在 ansible playbook 中将其引用为:
hosts: localhost
connection: local
创建新的 k8s 命名空间的整个剧本可能如下所示:
---
- hosts: localhost
connection: local
tasks:
- name: Create a k8s namespace
k8s:
name: testing
api_version: v1
kind: Namespace
state: present
我们可以通过简单的执行来运行它:
ansible-playbook playbook.yaml
然而,在我们这样做之前,我们需要确保我们已经安装了所有必需的依赖项,这些依赖项实际上并没有那么多,它们仅限于 python 2.7 和 上面提到的两个库(在必需的版本中)。
在主机上安装 Python 后,安装其余所需依赖项的最简单方法是运行:
pip install openshift
和
pip install PyYAML
您可能会遇到以下错误:
"msg": "Failed to import the required Python library (openshift) on ***** Python /usr/bin/python. Please read module documentation and install in the appropriate location. If the required library is installed, but Ansible is using the wrong Python interpreter, please consult the documentation on ansible_python_interpreter"
如果是,运行:
pip install --upgrade requests
应该修复它(至少在我的情况下它修复了它),然后我们在 kubernetes 集群中创建新 namespace 的简单 ansible playbook 应该可以顺利运行. :)
【讨论】: