Я хочу автоматизировать команды 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.