Обеспечьте аутентификацию кластера Kubernetes с помощью kubeconfig через https

У меня есть кластер кубернетов. Я создал кластер с помощью Google Cloud, но не с помощью GKE, а с помощью GCE. Я создал один master node и два worker nodes, используя VM instances. Kubeadm используется для соединения главного и рабочего узлов вместе с файлом kube-flannel.yml. Я выставляю свой кластер снаружи в postman, используя свой Vm's public ip & nodePort. Я могу перейти по этому URL-адресу. publicip:nodePort/adapter_name. Удар достигает моих стручков, и журналы генерируются. Когда я раньше использовал minikube, я использовал port-forwarding, чтобы открыть свой порт. Сейчас я этим не пользуюсь.

По умолчанию kubeconfig файл с именем config находится в папке $HOME/.kube/config. В нем есть следующее содержание.

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJ....
    server: https://10.128.0.12:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURFe....
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb.....

Сервер IP - это https://10.128.0.12:6443. Могу ли я изменить этот URL-адрес по умолчанию на тот, который требуется для аутентификации [my rest api url] ??

Мое требование - обеспечить аутентификацию для моего URL-адреса rest api, который мое приложение позволяет при работе в модуле kubernetes.

Как я могу аутентифицировать мой URL-адрес rest api с помощью этого kubeconfig метода или путем создания нового файла kubeconfig и его использования ??

https://unofficial-kubernetes.readthedocs.io/en/latest/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/

http://docs.shippable.com/deploy/tutorial/create-kubeconfig-for-self-hosted-kubernetes-cluster/

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

Версия Kubernetes:

Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.4", GitCommit:"d360454c9bcd1634cf4cc52d1867af5491dc9c5f", GitTreeState:"clean", BuildDate:"2020-11-11T13:17:17Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"linux/amd64"} 
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.4", GitCommit:"d360454c9bcd1634cf4cc52d1867af5491dc9c5f", GitTreeState:"clean", BuildDate:"2020-11-11T13:09:17Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"linux/amd64"} 

person Bruce wayne - The Geek Killer    schedule 16.12.2020    source источник
comment
Этот кластер находится в вашей локальной среде? Какую версию Kubernetes вы используете. Это Кубеадм или Миникубе? Как вы выставите свой кластер на улицу?   -  person PjoterS    schedule 16.12.2020
comment
Я создал кластер с помощью облака Google, но не с помощью GKE. Я создал один главный узел и два рабочих узла, используя экземпляры vm. Kubeadm используется для соединения главного и рабочего узлов вместе с файлом kube-flannel.yml. Я выставляю свой кластер снаружи в почтальоне, используя общедоступный IP-адрес и nodePort моей виртуальной машины. Я могу перейти по этому URL-адресу. publicip: nodePort / имя_адаптера. Удар достигает моих модулей, и создаются журналы. Когда я раньше использовал minikube, я использовал переадресацию портов, чтобы открыть свой порт. Теперь я не использую это   -  person Bruce wayne - The Geek Killer    schedule 17.12.2020
comment
Версия клиента: version.Info {Major: 1, Minor: 19, GitVersion: v1.19.4, GitCommit: d360454c9bcd1634cf4cc52d1867af5491dc9c5f, GitTreeState: clean, BuildDate: 2020-11-11T13: 17: 17Z, GoVersion: goVersion: goiler1 , Платформа: linux / amd64} Версия сервера: version.Info {Major: 1, Minor: 19, GitVersion: v1.19.4, GitCommit: d360454c9bcd1634cf4cc52d1867af5491dc9c5f, GitTreeState: clean, BuildDate: 2020-11-11ZT13: 09Version: 09Version: go1.15.2, компилятор: gc, платформа: linux / amd64}   -  person Bruce wayne - The Geek Killer    schedule 17.12.2020
comment
Пожалуйста, отредактируйте свой вопрос и добавьте дополнительную информацию из комментариев. Лучше читать всю информацию из раздела вопросов, чем из комментариев. Просто чтобы прояснить некоторые факты. Вы хотите предоставить доступ к POD / сервису / аутентификации для внешних пользователей, если да, то как бы вы хотели пройти аутентификацию? Или вы хотите, чтобы ваш pod / api отправлял запрос в kubernetes api? Вы ищете что-то вроде доступа к кластерам с помощью Kubernetes API   -  person PjoterS    schedule 18.12.2020
comment
Привет, я отредактировал вопрос с указанными выше деталями. Да, @PjoterS, я жду такой аутентификации. Метод токена учетной записи службы, который я пробовал много раз, но безуспешно. Я взял токен JWT из секрета, который создается вместе с serviceaccounset. Как и в документе, я использовал этот токен в качестве токена на предъявителя в почтальоне, когда нажимал на свой URL. Но аутентификация не включена   -  person Bruce wayne - The Geek Killer    schedule 18.12.2020
comment
kubernetes.io/docs/reference/access-authn-authz/authentication это тот, который я упомянул   -  person Bruce wayne - The Geek Killer    schedule 18.12.2020
comment
Чтобы прояснить одну вещь, вы создали несколько сертификатов или ищете лучший способ защитить свой кластер?   -  person PjoterS    schedule 23.12.2020
comment
да, лучший способ защитить свои адаптеры для отдыха   -  person Bruce wayne - The Geek Killer    schedule 29.12.2020
comment
Могу ли я использовать для этого любую стороннюю систему безопасности, например istio?   -  person Bruce wayne - The Geek Killer    schedule 29.12.2020


Ответы (2)


Публикуем это как Community Wiki.

I. Доступ к Kubernetes API.

Могу ли я изменить этот URL-адрес по умолчанию (IP-адрес кластерного сервера) на тот, который требуется для аутентификации моего остального API-адреса ??

Я не рекомендую это. KUBECONFIG файлы используются для организации информации о кластерах, пользователях, пространствах имен, механизмах аутентификации и для хранения информации о вашем подключении к кластеру Kubernetes. Когда вы используете kubectl для выполнения команд, он получает правильную коммуникационную информацию от этого KUBECONFIG.

В KUBECONFIG вы можете аутентифицироваться, используя X509 Client Certs или различные типы Tokens. Более подробную информацию можно найти в Стратегии аутентификации и Доступ к кластерам с помощью Kubernetes API

Если вас интересует, как получить доступ к kubernetes API с помощью Beare Token, проверьте в этой документации.

II. Доступ к клиентскому API

Если вы хотите, чтобы ваш api rest endpoint был общедоступным, вы можете использовать:

Предоставляет услугу на каждом IP-адресе узла на статическом порте (NodePort). Служба ClusterIP, к которой маршрутизируется служба NodePort, создается автоматически. Вы сможете связаться со службой NodePort вне кластера, запросив:.

Предоставляет доступ к Сервису извне с помощью балансировщика нагрузки облачного провайдера. Службы NodePort и ClusterIP, к которым направляется внешний балансировщик нагрузки, создаются автоматически.

Примечание. Для среды с чистым железом рассмотрите возможность использования Metallb.

Kubernetes не предлагает реализацию балансировщиков сетевой нагрузки (службы типа LoadBalancer) для кластеров без операционной системы. Реализации Network LB, с которыми поставляется Kubernetes, представляют собой связующий код, который обращается к различным платформам IaaS (GCP, AWS, Azure…). Если вы не работаете на поддерживаемой платформе IaaS (GCP, AWS, Azure…), LoadBalancers будет оставаться в состоянии ожидания на неопределенный срок при создании.

После того, как вы выставите свой api внешнему миру (при необходимости)

  • вы можете использовать взаимную аутентификацию TLS между вашим клиентом и конечной точкой сервера (api).

  • вы можете использовать Ingress с Внешняя аутентификация OAUTH

В качестве альтернативного решения вы можете рассмотреть Keycloak как дополнительную аутентификацию с Gatekeeper в rest api в качестве дополнительной информации, которая проверяет, была ли аутентификация.

Если вас интересует аутентификация между микросервисами, вы можете проверить статью Аутентификация между микросервисами с использованием идентификаторов Kubernetes.

Если вас интересует istio, ознакомьтесь с Istio Security Istio предоставляет два типы аутентификации:

  • Одноранговая аутентификация: используется для межсервисной аутентификации для проверки клиента, устанавливающего соединение.
  • Аутентификация запроса: используется для аутентификации конечного пользователя для проверки учетных данных, прикрепленных к запросу. Istio обеспечивает аутентификацию на уровне запроса с проверкой JSON Web Token (JWT) и упрощает работу разработчика с использованием настраиваемого поставщика аутентификации или любых поставщиков OpenID Connect - пример
person Community    schedule 07.01.2021
comment
Большое спасибо за этот ответ. Это охватывало все области моего вопроса и также устраняло некоторые недоразумения. Я использовал метод Istio End user-authentication, чтобы обеспечить безопасность моего клиентского (Rest) API. Я опубликую здесь свой метод как еще один ответ со всеми шагами. - person Bruce wayne - The Geek Killer; 09.01.2021

Лучший метод аутентификации нашего клиентского API / URL-адреса конечной точки - использовать Istio

Установка Istio

Я документировал весь процесс обеспечения безопасности через Istio в PDF-файле, который я прилагаю Istio используется для проверки токена, а Keycloak используется для генерации токена JWT.

person Bruce wayne - The Geek Killer    schedule 09.01.2021