【问题标题】:Unable to run kubectl from ansible无法从 ansible 运行 kubectl
【发布时间】:2019-08-24 10:37:34
【问题描述】:

我正在尝试从 ansible 运行 kubectl 命令。
基本上,该命令会告诉我部署中是否至少有一个 pod 正在运行。

kubectl get deploy sample-v1-deployment -o json -n sample | jq '.status.conditions[] | select(.reason == "MinimumReplicasAvailable") | .status' | tr -d '"'

我试图从剧本中运行它,但我得到了

无法连接到服务器:net/http: TLS 握手超时

这是我的剧本:

- hosts: master
  gather_facts: no
  become: true

  tasks:
    - name: test command
      shell: kubectl get deploy sample-v1-deployment -o json -n sample | jq '.status.conditions[] | select(.reason == "MinimumReplicasAvailable") | .status' | tr -d '"'
      register: result

这是 ansible 的输出:

changed: [k8smaster01.test.com] => {
    "changed": true,
    "cmd": "kubectl get deploy sample-v1-deployment -o json -n sample | jq '.status.conditions[] | select(.reason == \"MinimumReplicasAvailable\") | .status' | tr -d '\"'",
    "delta": "0:00:10.507704",
    "end": "2019-04-02 20:59:17.882277",
    "invocation": {
        "module_args": {
            "_raw_params": "kubectl get deploy sample-v1-deployment -o json -n sample | jq '.status.conditions[] | select(.reason == \"MinimumReplicasAvailable\") | .status' | tr -d '\"'",
            "_uses_shell": true,
            "argv": null,
            "chdir": null,
            "creates": null,
            "executable": null,
            "removes": null,
            "stdin": null,
            "warn": true
        }
    },
    "rc": 0,
    "start": "2019-04-02 20:59:07.374573",
    "stderr": "Unable to connect to the server: net/http: TLS handshake timeout",
    "stderr_lines": [
        "Unable to connect to the server: net/http: TLS handshake timeout"
    ],
    "stdout": "",
    "stdout_lines": []
}

我可以在主服务器上手动运行命令而不会出现问题。我还能够使用 k8s 模块在我的 kubernetes 集群上创建不同的东西。
我知道ansible上有一个kubectl模块,会不会是问题所在?

谢谢

【问题讨论】:

  • 您是否在您的环境中设置了$KUBECONFIG,例如在您的~/.bash_profile 中?这将导致交互式版本与 ansible ssh 会话不同。你可以很容易地通过在现有 kubectl 之前运行 - shell: kubectl config view 来查看配置 - 更重要的是 context kubectl 在 ansible 下使用了什么
  • 另外,你没有问这个问题,但你可以通过告诉jq 使用jq -r 返回raw value 来消除对最终tr -d 的需要
  • 我能够从 ansible 和 kubernetes 服务器运行 kubectl 配置视图,并且两者都有相同的信息。
  • 我也尝试像 /usr/bin/kubectl --kubeconfig=/root/.kube/config get deploy sample-v1-deployment -n sample 一样运行它,得到了同样的错误。跨度>

标签: kubernetes ansible kubectl


【解决方案1】:

我找到了一些解决方法。
一种是使用 k8s_facts 模块

- name: Ensure running application
  k8s_facts:
    namespace: sample
    kind: Pod
    label_selectors:
      - app=sample-v1-app
  register: pod_list
  until: pod_list.resources[0].status.phase == 'Running'
  delay: 10
  retries: 3

它很简单,可以完成工作。

第二种解决方法是使用原始模块而不是 shell 或命令

- name: Get running status
  raw: kubectl get deploy sample-v1-deployment -o json -n sample | jq -r '.status.conditions[] | select(.reason == "MinimumReplicasAvailable") | .status'

我不确定是否使用 raw。它看起来像一个简单任务的锤子。
但是阅读该模块让我认为这个问题与语法(引号、双引号、|)有关,而不是它本身的命令。

执行一个低级和肮脏的 SSH 命令,而不是通过 模块子系统。这很有用,应该只在少数情况下完成 案例。一个常见的情况是在没有 python 的系统上安装 python 默认安装。另一个是与任何设备交谈,例如 没有安装任何 Python 的路由器。

【讨论】:

  • 请考虑将您的答案标记为已批准的解决方案。它将帮助其他社区成员找到您的解决方案。
【解决方案2】:

看起来您可以从 shell 连接到 master 上的 kube-apiserver,但不能从 ansible 连接。错误消息表明 kubeconfig 存在差异。

您可以看到在您的~/.kube/config 上配置的 kube-apiserver 端点,如下所示:

$ kubectl config view --minify -o jsonpath='{.clusters[].cluster.server}'

通常是这样的:https://<servername>:6443。您可以尝试从 ansible 运行命令,看看是否得到相同的 kube-apiserver。

您可以尝试的另一件事是从 ansible 打印 KUBECONFIG env 变量的值,以查看它是否设置为不同于 ~/.kube/config 的值

希望对你有帮助!

【讨论】:

  • 我能够通过 ansible 在服务器上以相同的输出运行命令。 master:8443
  • 这是一个环境问题,这就是 raw 工作的原因,因为它是一个干净的命令,只是拾取你的 ~/.kube/config 中的任何内容
猜你喜欢
  • 2021-12-15
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
相关资源
最近更新 更多