代码之家  ›  专栏  ›  技术社区  ›  radicaled

无法从ansible运行kubectl

  •  0
  • radicaled  · 技术社区  · 7 年前

    我正试图从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集群上创建不同的东西。

    谢谢

    0 回复  |  直到 7 年前
        1
  •  2
  •   radicaled    7 年前

    我找到了一些解决办法。
    一个是使用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'
    

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

    执行一个低级脏SSH命令,而不是通过 模块子系统。这是有用的,应该只在几分钟内完成 默认情况下已安装。另一种是与任何设备通话,例如 未安装任何Python的路由器。

        2
  •  0
  •   Rico    7 年前

    看起来您可以从shell连接到主机上的kube apiserver,但不能从ansible连接。错误消息指示kubeconfig中的差异。

    您可以看到在服务器上配置的kube apiserver端点 ~/.kube/config 这样地:

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

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

    另一件事是您可以尝试打印 KUBECONFIG ~/.kube/config

    希望有帮助!

    推荐文章