我找到了一个方法,不知道是不是最好的。
首先,Terraform 传递它所拥有的关于集群的知识:
# config
locals {
project_id = "my_gcp_project_id"
region = "us-east4"
}
# local client token
data "google_client_config" "client" {}
# the cluster
data "google_container_cluster" "my_cluster" {
name = "my-cluster-name"
project = local.project_id
location = local.region
}
# send it into the private provider
data "my-provider-name_the_data_source" "my_provider_data_resource" {
token = data.google_client_config.client.access_token
server = "https://${data.google_container_cluster.my_cluster.endpoint}"
cluster_path = "gke_${local.project_id}_${local.region}_${data.google_container_cluster.my_cluster.name}"
ca = data.google_container_cluster.my_cluster.master_auth.0.cluster_ca_certificate
}
然后在私有提供者内部,它可以调用kubectl:
func execKubectl(cluster_path string, server string, token string, caBase64 string, kubectlArgs ...string) ([]byte, error) {
tmpFile, err := ioutil.TempFile(".terraform", "gke")
if err != nil {
return nil, err
}
defer os.Remove(tmpFile.Name())
caPem, err := base64.StdEncoding.DecodeString(caBase64)
if err != nil {
return nil, err
}
_, err = tmpFile.Write(caPem)
if err != nil {
return nil, err
}
err = tmpFile.Close()
if err != nil {
return nil, err
}
tmpPath, err := filepath.Abs(tmpFile.Name())
if err != nil {
return nil, err
}
allArgs := append([]string{"--certificate-authority=" + tmpPath, "--server=" + server, "--cluster=" + cluster_path, "--token=" + token}, kubectlArgs...)
cmd := exec.Command("kubectl", allArgs...)
output, err := cmd.Output()
if err != nil {
return nil, err
}
return output, nil
}