«Невозможно подключиться к серверу: запрещено» в командах kubectl и helm только при работе с Ansible - PullRequest
0 голосов
/ 27 февраля 2020

Я хочу автоматизировать команды kubectl и helm, используя Ansible. Целевой компьютер настроен правильно, так что оба работают на клиенте в ручной оболочке (например, kubectl get nodes или helm list). Но при попытке выполнить какие-либо вызовы API, например, получить версию сервера

- name: List charts
  shell: kubectl version -v=8

. Это приводит к ошибке Forbidden . Подробное ведение журнала не дает мне намного больше подробностей:

fatal: [127.0.0.1]: FAILED! => changed=true 
  cmd: kubectl version -v=10
  delta: '0:00:00.072452'
  end: '2020-02-27 15:22:36.227928'
  msg: non-zero return code
  rc: 255
  start: '2020-02-27 15:22:36.155476'
  stderr: |-
    I0227 15:22:36.224517   27321 loader.go:359] Config loaded from file /home/user/.kube/config
    I0227 15:22:36.225211   27321 round_trippers.go:386] curl -k -v -XGET  -H "Accept: application/json, */*" -H "User-Agent: kubectl/v1.11.3 (linux/amd64) kubernetes/a452946" 'https://k8smaster01:6443/version?timeout=32s'
    I0227 15:22:36.225975   27321 round_trippers.go:405] GET https://k8smaster01:6443/version?timeout=32s  in 0 milliseconds
    I0227 15:22:36.225986   27321 round_trippers.go:411] Response Headers:
    I0227 15:22:36.226062   27321 helpers.go:219] Connection error: Get https://k8smaster01:6443/version?timeout=32s: Forbidden
    F0227 15:22:36.226080   27321 helpers.go:119] Unable to connect to the server: Forbidden
  stderr_lines: <omitted>
  stdout: 'Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.3", GitCommit:"a4529464e4629c21224b3d52edfe0ea91b072862", GitTreeState:"clean", BuildDate:"2018-09-09T18:02:47Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}'
  stdout_lines: <omitted>

Однако, при отправке запроса на эти URL-адреса API, подобного этому

- name: Test master connection
  shell: curl -k https://k8smaster01:6443/version?timeout=32s

Это работает:

stderr_lines: <omitted>
  stdout: |-
    {
      "major": "1",
      "minor": "11",
      "gitVersion": "v1.11.3",
      "gitCommit": "a4529464e4629c21224b3d52edfe0ea91b072862",
      "gitTreeState": "clean",
      "buildDate": "2018-09-09T17:53:03Z",
      "goVersion": "go1.10.3",
      "compiler": "gc",
      "platform": "linux/amd64"
    }

Почему вызовы API с kubectl не работают при выполнении с Ansible?

Я нахожусь за прокси-сервером, но k8smaster01 установлен в no_proxy. Ansible получил, я напечатал $no_proxy в задании для тестирования.

Для curl Я использовал -k, так как это самозаверяющий сертификат от k8s. Это может навредить kubectl (что само по себе работает, когда не запускается с Ansible). Также не работает при вызове kubectl --insecure-skip-tls-verify=true get node с Ansible.

1 Ответ

1 голос
/ 02 марта 2020

Я попытался сбросить переменные env из прокси (поскольку прокси требуется только для доступа к inte rnet), установив пустые переменные окружения:

- name: Kubectl test
  become: false
  shell: kubectl get no -v=10
  environment:
    http_proxy:
    https_proxy:
    no_proxy:
    HTTP_PROXY:
    HTTPS_PROXY:
    NO_PROXY:

Это была плохая идея, так как curl (который, кажется, используется внутри kubectl), анализирует это до None и завершается ошибкой. Как ни странно, kubectl не удалось с ошибкой DNS:

skipped caching discovery info due to Get https://k8smaster01:6443/api?timeout=32s: proxyconnect tcp: dial tcp: lookup None on 127.0.0.53:53: server misbehaving

Обнаружил, что основная проблема заключалась в том, что я установил NO_PROXY=$no_proxy в /etc/environment, где no_proxy содержит имя хоста k8smaster01. Поскольку /etc/environment не разрешает bash переменные, верхний регистр NO_PROXY просто содержит $no_proxy в виде строки. Так что достаточно было заменить NO_PROXY=$no_proxy на соответствующее значение (эх NO_PROXY=k8smaster01).

Раньше это не было проблемой, потому что большинство приложений, похоже, следуют спецификации Linux использования строчных переменных окружения для использования прокси.

...