Используйте API REST Kubernetes без kubectl

#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 «, если вы используете корневой сертификат ЦС.