创建 K8S 对象

简介

本指南将向您展示如何利用 Ansible 创建 Kubernetes 对象,例如 Pod、Deployment 和 Secret。

场景需求

  • 软件

    • 必须安装 Ansible 2.9.17 或更高版本

    • 必须在 Ansible 控制器(如果未针对 localhost 执行,则为目标主机)上安装 Python 模块 kubernetes

    • Kubernetes 集群

    • 在 Ansible 控制器上安装 Kubectl 二进制文件

  • 访问/凭据

    • 使用给定的 Kubernetes 集群配置 Kubeconfig

假设条件

  • 用户具有在给定的 Kubernetes 集群上创建、删除和更新资源的必要授权级别。

注意事项

示例描述

在这个用例/示例中,我们将在给定的 Kubernetes 集群中创建一个 Pod。以下 Ansible playbook 展示了为此所需的基本参数。

---
- hosts: localhost
  collections:
    - kubernetes.core
  tasks:
    - name: Create a pod
      kubernetes.core.k8s:
        state: present
        definition:
          apiVersion: v1
          kind: Pod
          metadata:
            name: "utilitypod-1"
            namespace: default
            labels:
              app: galaxy
          spec:
            containers:
              - name: utilitypod
                image: busybox

由于 Ansible 利用 Kubernetes API 执行操作,因此在这个用例中,我们将直接连接到 Kubernetes 集群。

首先,我们需要一些信息。这里您使用的是在您的机器上预先配置的 Kubeconfig。Kubeconfig 通常位于 ~/.kube/config。强烈建议使用 ansible-vaultAnsible Tower 凭据 以更安全的方式存储密码、用户证书等敏感信息。

现在您需要提供将要创建的 Pod 的信息。使用 kubernetes.core.k8s 模块的 definition 参数,您可以指定 PodTemplate。此 PodTemplate 与您提供给 kubectl 命令的 PodTemplate 相同。

预期结果

  • 此 playbook 完成后,您将看到一些 JSON 输出。此输出显示从模块和集群返回的关于新创建的 Pod 的各种参数。

{
    "changed": true,
    "method": "create",
    "result": {
        "apiVersion": "v1",
        "kind": "Pod",
        "metadata": {
            "creationTimestamp": "2020-10-03T15:36:25Z",
            "labels": {
                "app": "galaxy"
            },
            "name": "utilitypod-1",
            "namespace": "default",
            "resourceVersion": "4511073",
            "selfLink": "/api/v1/namespaces/default/pods/utilitypod-1",
            "uid": "c7dec819-09df-4efd-9d78-67cf010b4f4e"
        },
        "spec": {
            "containers": [{
                "image": "busybox",
                "imagePullPolicy": "Always",
                "name": "utilitypod",
                "resources": {},
                "terminationMessagePath": "/dev/termination-log",
                "terminationMessagePolicy": "File",
                "volumeMounts": [{
                    "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
                    "name": "default-token-6j842",
                    "readOnly": true
                }]
            }],
            "dnsPolicy": "ClusterFirst",
            "enableServiceLinks": true,
            "priority": 0,
            "restartPolicy": "Always",
            "schedulerName": "default-scheduler",
            "securityContext": {},
            "serviceAccount": "default",
            "serviceAccountName": "default",
            "terminationGracePeriodSeconds": 30,
            "tolerations": [{
                    "effect": "NoExecute",
                    "key": "node.kubernetes.io/not-ready",
                    "operator": "Exists",
                    "tolerationSeconds": 300
                },
                {
                    "effect": "NoExecute",
                    "key": "node.kubernetes.io/unreachable",
                    "operator": "Exists",
                    "tolerationSeconds": 300
                }
            ],
            "volumes": [{
                "name": "default-token-6j842",
                "secret": {
                    "defaultMode": 420,
                    "secretName": "default-token-6j842"
                }
            }]
        },
        "status": {
            "phase": "Pending",
            "qosClass": "BestEffort"
        }
    }
}
  • 在上例中,“changed” 为 True,这表示 Pod 创建已在给定集群上启动。这可能需要一些时间,具体取决于您的环境。

故障排除

需要检查的事项

  • 检查为用户名和密码提供的 value 是否正确

  • 检查 Kubeconfig 是否填充了正确的 value

另请参阅

Kubernetes Python 客户端

Kubernetes Python 客户端的 GitHub 页面

Kubernetes Python 客户端 - 问题跟踪器

Kubernetes Python 客户端的问题跟踪器

Kubectl 安装

安装 Kubectl 的安装指南

使用 playbook

Playbook 简介

使用加密变量和文件

在 playbook 中使用 Vault