#kubernetes #kubectl
Вопрос:
Вы можете просто взаимодействовать с K8s, используя его REST API. Например, чтобы получить капсулы:
curl http://IPADDR/api/v1/pods
Однако я не могу найти ни одного примера аутентификации, основанной только на curl или REST. Все примеры показывают использование kubectl
в качестве прокси-сервера или как способ получения учетных данных.
Если у меня уже есть .kubeconfig
и ничего больше , есть ли способ отправлять HTTP-запросы напрямую (например, с помощью токена) без использования kubectl
?
Ответ №1:
kubeconfig
Файл, который вы загружаете при первой установке кластера, включает сертификат клиента и ключ. Например:
clusters:
- cluster:
certificate-authority-data: ...
server: https://api.cluster1.ocp.virt:6443
name: cluster1
contexts:
- context:
cluster: cluster1
user: admin
name: admin
current-context: admin
preferences: {}
users:
- name: admin
user:
client-certificate-data: ...
client-key-data: ...
Если вы извлекаете файлы client-certificate-data
и client-key-data
в, вы можете использовать их для аутентификации с помощью curl. Для извлечения
данных:
$ yq -r '.users[0].user."client-certificate-data"' kubeconfig | base64 -d > cert
$ yq -r '.users[0].user."client-key-data"' kubeconfig | base64 -d >
key
А затем с помощью curl
:
$ curl -k --cert cert --key key
'https://api.cluster1.ocp.virt:6443/api/v1/namespaces/default/pods?limit=500'
{
"kind": "PodList",
"apiVersion": "v1",
"metadata": {
"resourceVersion": "22022"
},
"items": []
С другой стороны, если у вас .kubeconfig
есть жетоны, например, вот так:
[...]
users:
- name: your_username/api-clustername-domain:6443
user:
token: sha256~...
Затем вы можете использовать этот токен в качестве токена на предъявителя:
$ curl -k https://api.mycluster.mydomain:6443/ -H 'Authorization: Bearer sha256~...'
…но обратите внимание, что срок действия этих токенов обычно истекает через некоторое время, в то время как сертификаты должны работать неопределенно долго (если они каким-либо образом не будут отозваны).
Комментарии:
1. Отлично, ваше решение работало в чистом рубине… Однако я не могу проверить сертификат сервера K8s в клиенте (мне нужно использовать
-k
или VERIFY_NONE , как вы предлагаете). Использует ли API K8s самозаверяющие сертификаты? Есть ли какой-либо способ получить правильный корневой сертификат CA для K8s?2. Сертификат CA, указанный в
kubeconfig
документе, должен иметь возможность проверить сертификат API (я имею в виду, что в этом весь смысл этого ответа). Когда вы говорите «в клиенте», вы говорите конкретно оkubectl
каком-то другом клиенте или о каком-то другом клиенте, с которым вы работаете? По умолчанию API использует сертификат, подписанный центром сертификации Kubernetes, но я считаю, что его можно заменить сертификатом, подписанным глобальным доверенным центром сертификации, таким как letsencrypt.3. Спасибо за помощь! Я нашел решение и теперь могу использовать
VERIFY_PEER
:certificate-authority-data
вkubeconfig
нем есть корневой сертификат CA (используется K8s для своего HTTPS API). Таким образом, вам не нужно использовать опцию «небезопасно-k
«, если вы используете корневой сертификат ЦС.