Контейнерный кластер Google как конфиг - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь использовать kubernetes go-client с cloud.google.com/go/container.Я создаю кластер, используя пакет контейнера Google Cloud Go, а затем хочу развернуть на этом кластере, используя Go-клиент.Пример вне кластера , данный 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 ]

0 голосов
/ 19 сентября 2018

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
    }
}
0 голосов
/ 12 сентября 2018

Я ответил на очень похожий вопрос здесь: Доступ к кластеру GKE Kubernetes вне кластера GKE с помощью client-go? .

По сути, в двух словах, рекомендуемый способ сделать это:

  1. Создайте учетную запись службы Google Cloud IAM + загрузите ее ключ json
  2. Установить GOOGLE_APPLICATION_CREDENTIALS env var для этого ключа. Json
  3. Найти IP-адрес и сертификат CA кластера из gcloud container clusters describe (или просто получить файл .kube/config из gcloud get-credentials
  4. Передайте эти значения в client-go и запустите вашу программу с помощью env var.
...