Подключитесь с помощью кода 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, вам следует:
- Подключайтесь через общедоступный Интернет с промежуточным балансировщиком нагрузки посередине. Не рекомендуется для чувствительного трафика. ~ или ~
- Подключите два VPC и снова используйте какой-нибудь балансировщик нагрузки, который может соединить два кластера k8s. (NGINX может работать здесь, но зависит от того, что вы делаете)
Это помогает?