Подключитесь с помощью кода Go из Kubernetes к внешнему кластеру Kubernetes

Оператор, который я создаю, должен взаимодействовать с другими кластерами Kubernetes. Есть ли какие-нибудь передовые практики, как это сделать из оператора, работающего в Kubernetes?

С помощью k8s.io/client-go/tools/clientcmd пакет я могу позвонить BuildConfigFromFlags передача метода masterURLи расположение kubeconfig. Это отлично работает вне Kubernetes, но можно ли делать какие-либо предположения о расположении kubeconfig внутри Kubernetes? Или следует использовать какой-то другой API?

В качестве примечания: я использую controller-runtimeс Client API для общения с Kubernetes.

4 ответа

Решение

Оказывается, это довольно просто сделать, просто вызовите следующий код с главным URL-адресом и токеном для доступа к нему:

cfg, err := clientcmd.BuildConfigFromFlags(os.Getenv("MASTERURL"), os.Getenv("KUBECONFIG"))
cfg.BearerToken = os.Getenv("BEARERTOKEN")

Также может потребоваться:

cfg.Insecure = true

Оператор Kubernetes - это, в конце концов, модуль, работающий внутри Kubernetes. Ответ Никола Бена - это правильный путь, если вы хотите получить доступ к текущему API-интерфейсу кластера K8S.

Однако вы говорите, что ваш оператор "должен общаться с другими кластерами Kubernetes" (выделено мной), и что он работает локально.

Затем один простой подход - создать ConfigMap содержащий kubeconfigфайл и смонтируйте его в известном месте на панели оператора. Тогда вы можете просто использовать это так же, как вы делаете это локально.

Из "Программирование Kubernetes", изд. Орейли (которую я предлагаю прочитать):

"При запуске двоичного файла внутри модуля в кластере kubelet автоматически монтирует учетную запись службы в контейнер по адресу /var/run/secrets/kubernetes.io/serviceaccount. Он заменяет только что упомянутый файл kubeconfig и может быть легко изменен в rest.Config через метод rest.InClusterConfig() ".

Требуемый конфиг берется с этой строчкой:

cfg, err := rest.InClusterConfig()

Взгляните на код здесь:

https://github.com/programming-kubernetes/cnat/blob/master/cnat-client-go/main.go

Вопрос: Находятся ли эти два кластера на GKE или вы управляете ими вручную в других средах?

Сервис Kubernetes - это в основном набор модулей, которые могут быть вашим контроллером.

Один из способов добиться этого - сделать вашу службу доступной за пределами кластера. В GKE вы можете сделать это с помощью ILB, ILB поможет вам предоставить услугу другим кластерам k8s, к которым вы, возможно, захотите подключиться в том же VPC. Но если другие службы, к которым вам необходимо подключиться, находятся в другом VPC, вам следует:

  1. Подключайтесь через общедоступный Интернет с промежуточным балансировщиком нагрузки посередине. Не рекомендуется для чувствительного трафика. ~ или ~
  2. Подключите два VPC и снова используйте какой-нибудь балансировщик нагрузки, который может соединить два кластера k8s. (NGINX может работать здесь, но зависит от того, что вы делаете)

Это помогает?

Другие вопросы по тегам