【问题标题】:How to automate Kubernetes configuration?如何自动化 Kubernetes 配置?
【发布时间】:2020-06-04 20:53:01
【问题描述】:

我想自动化我的 Kubernetes 配置,例如用于 VM 的 Ansible。

一个示例场景:

  1. 创建命名空间港
  2. 通过 Helm https://github.com/goharbor/harbor-helm 部署 Harbor

什么样的工具适合这样的场景?我也可以使用 terraform 吗?

【问题讨论】:

    标签: kubernetes ansible terraform kubernetes-helm


    【解决方案1】:

    我完全同意 @P Ekambaram 的观点,即 kubernetes 自动化 可以通过 ansible 成功完成,但同时我完全不同意他的观点当谈到它应该做的方式时。这样的“声明性” 代码实际上根本不是声明性的。它变成了一组命令式命令的简单包装器。除此之外,这样的剧本不是idempotent(让我们提醒一下,如果执行一次的结果与在没有任何干预动作的情况下重复执行的结果完全相同,则操作是幂等的。。) .这种方法与 ansible 中存在的关键概念之一相反。

    shellcommand 模块应该在 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 模块,您需要在其上安装两件事:

    • python 2.7
    • ssh 服务器

    虽然对于大多数模块来说都是如此,但其中一些模块在模块可以在此类主机上运行之前必须满足其他要求。

    说到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 应该可以顺利运行. :)

    【讨论】:

    • 不幸的是,使用像 k8s 这样的模块有很多不必要的依赖,例如 openshift!
    • 有没有用 ansible 扩展 K8S 的教程
    • 不是很多,但我完全理解这可能不是每个人的解决方案。 Here你已经描述了所有的要求。
    • @zero_coding,老实说,我没有找到任何我可以真正推荐的关于使用 ansible 管理 kubernetes 工作负载的教程。他们中的大多数都是关于设置整个 kubernetes 集群的,因为 ansible 也是自动化它的好选择。但我认为the official documentation of the module 解释得很好,可以开始了。顺便提一句。您将其自动化的原因是什么?创建命名空间和应用单舵图只是两个简单的步骤,所以在我看来使用 ansible 有点矫枉过正。
    • @mario 最后一个问题,如何将ansible连接到kubernetes集群?
    猜你喜欢
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 2011-03-29
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 2010-11-26
    相关资源
    最近更新 更多