如何利用已获取的OAuth令牌访问GKE资源(kubectl/client-go)?
使用已获取的Google Cloud OAuth2令牌访问GKE资源
一、获取特定项目指定集群的凭据
用kubectl配置
- 先拿到集群的API服务器地址和CA证书:
执行gcloud container clusters describe <集群名> --project <项目ID> --zone <集群区域>,从输出里提取endpoint(API服务器地址)和masterAuth.clusterCaCertificate(base64编码的CA证书)。 - 手动配置kubeconfig:
- 设置集群:
kubectl config set-cluster gke-cluster --server=https://<API服务器地址> --certificate-authority=<保存CA证书的文件路径> - 设置用户:
kubectl config set-credentials gke-user --token=<你的OAuth2令牌> - 设置上下文:
kubectl config set-context gke-context --cluster=gke-cluster --user=gke-user - 切换到该上下文:
kubectl config use-context gke-context
- 设置集群:
用client-go构造配置(优先选择)
直接在代码里构建Kubernetes客户端配置,无需本地kubeconfig文件:
import ( "encoding/base64" "k8s.io/client-go/rest" ) // 根据集群信息和OAuth令牌生成rest.Config func getGKEConfig(apiServerEndpoint, caCertBase64, oauthToken string) (*rest.Config, error) { // 解码base64格式的CA证书 caCert, err := base64.StdEncoding.DecodeString(caCertBase64) if err != nil { return nil, err } return &rest.Config{ Host: apiServerEndpoint, // 集群API服务器地址 BearerToken: oauthToken, // 你的OAuth2令牌 TLSClientConfig: rest.TLSClientConfig{CAData: caCert}, }, nil }
参数说明:
apiServerEndpoint:从gcloud命令输出中获取的集群endpointcaCertBase64:从gcloud命令输出中获取的masterAuth.clusterCaCertificate值
二、执行创建/访问Secret操作
用kubectl操作
- 创建Secret:
kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=123456 -n default - 获取Secret详情:
kubectl get secret my-secret -n default -o yaml
用client-go操作
基于上面生成的rest.Config创建客户端,执行Secret的创建和查询:
import ( "context" "fmt" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" ) func main() { // 替换为你的实际信息 apiServer := "https://your-cluster-endpoint" caCertBase64 := "your-cluster-ca-cert-base64" oauthToken := "your-oauth-token" // 获取配置 config, err := getGKEConfig(apiServer, caCertBase64, oauthToken) if err != nil { panic(fmt.Sprintf("Failed to create config: %v", err)) } // 创建Kubernetes客户端集 clientset, err := kubernetes.NewForConfig(config) if err != nil { panic(fmt.Sprintf("Failed to create clientset: %v", err)) } ctx := context.TODO() // 1. 创建Secret secret := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: "my-secret", Namespace: "default", }, Data: map[string][]byte{ "username": []byte("admin"), "password": []byte("123456"), }, Type: corev1.SecretTypeOpaque, } createdSecret, err := clientset.CoreV1().Secrets(secret.Namespace).Create(ctx, secret, metav1.CreateOptions{}) if err != nil { panic(fmt.Sprintf("Failed to create secret: %v", err)) } fmt.Printf("Created secret: %s\n", createdSecret.Name) // 2. 查询Secret fetchedSecret, err := clientset.CoreV1().Secrets("default").Get(ctx, "my-secret", metav1.GetOptions{}) if err != nil { panic(fmt.Sprintf("Failed to fetch secret: %v", err)) } fmt.Printf("Fetched secret username: %s\n", string(fetchedSecret.Data["username"])) }
内容的提问来源于stack exchange,提问作者pkaramol
相关产品推荐
相关产品推荐

