Контейнерный кластер Google как конфиг
Я пытаюсь использовать go-клиент kubernetes с cloud.google.com/go/container. Я создаю кластер, используя пакет контейнера Google Cloud Go, а затем хочу развернуть на этом кластере, используя Go-Client. Пример out of cluster, данный go-client, использует конфигурационный файл kube для получения учетных данных для кластера. Но так как я только что создал этот кластер в своем приложении, у меня нет этого файла конфигурации.
Как настроить конфигурацию "k8s.io/client-go/rest" с помощью кластера "google.golang.org/genproto/googleapis/container/v1"? Какие поля обязательны для заполнения? Код ниже - это то, что у меня есть (без показа действующего сертификата CA).
func getConfig(cluster *containerproto.Cluster) *rest.Config {
return &rest.Config{
Host: "https://" + cluster.GetEndpoint(),
TLSClientConfig: rest.TLSClientConfig{
Insecure: false,
CAData: []byte(`-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----`),
},
}
Это приводит к этой ошибке: x509: сертификат подписан неизвестным органом. Так что, очевидно, чего-то не хватает. Любой другой подход приветствуется! заранее спасибо
2 ответа
ClientCertificate, ClientKey и ClusterCaCertificate должны быть декодированы, как описано здесь
func CreateK8sClientFromCluster(cluster *gkev1.Cluster) {
decodedClientCertificate, err := base64.StdEncoding.DecodeString(cluster.MasterAuth.ClientCertificate)
if err != nil {
fmt.Println("decode client certificate error:", err)
return
}
decodedClientKey, err := base64.StdEncoding.DecodeString(cluster.MasterAuth.ClientKey)
if err != nil {
fmt.Println("decode client key error:", err)
return
}
decodedClusterCaCertificate, err := base64.StdEncoding.DecodeString(cluster.MasterAuth.ClusterCaCertificate)
if err != nil {
fmt.Println("decode cluster CA certificate error:", err)
return
}
config := &rest.Config{
Username: cluster.MasterAuth.Username,
Password: cluster.MasterAuth.Password,
Host: "https://" + cluster.Endpoint,
TLSClientConfig: rest.TLSClientConfig{
Insecure: false,
CertData: decodedClientCertificate,
KeyData: decodedClientKey,
CAData: decodedClusterCaCertificate,
},
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
fmt.Printf("failed to get k8s client set from config: %s\n", err)
return
}
}
Я ответил на очень похожий вопрос здесь: Доступ к кластеру GKE Kubernetes вне кластера GKE с помощью client-go?,
По сути, в двух словах, рекомендуемый способ сделать это:
- Создайте учетную запись службы Google Cloud IAM + загрузите ее ключ json
- Задавать
GOOGLE_APPLICATION_CREDENTIALS
env var to key.json - Найти IP-адрес и CA сертификат кластера от
gcloud container clusters describe
(или просто получить.kube/config
файл изgcloud get-credentials
- Передайте эти значения в client-go и запустите вашу программу с помощью env var.