无需gcloud CLI,如何从GKE容器认证访问另一GKE集群K8s API
直接从GKE容器连接另一GKE集群Kubernetes API的Java实现方案
你的需求完全可行,无需依赖gcloud CLI和代理容器,通过GCP Java SDK结合fabric8 Kubernetes客户端就能实现,还能大幅缩小镜像体积。下面是具体实现步骤:
一、准备工作:权限配置
- 确保当前GKE容器使用的ServiceAccount(或通过Workload Identity关联的IAM账号)拥有以下权限:
- 目标GCP项目的
container.clusters.get权限(用于获取集群API地址和CA证书) - 目标GKE集群的访问权限(比如
roles/container.developer,或更细粒度的资源只读权限)
- 目标GCP项目的
二、依赖引入
在你的项目中添加以下Maven依赖(Gradle同理):
<!-- GCP容器服务SDK,用于获取GKE集群信息 --> <dependency> <groupId>com.google.cloud</groupId> <artifactId>google-cloud-container</artifactId> <version>2.26.0</version> </dependency> <!-- fabric8 Kubernetes客户端 --> <dependency> <groupId>io.fabric8</groupId> <artifactId>kubernetes-client</artifactId> <version>6.10.0</version> </dependency>
三、核心代码实现
import com.google.cloud.container.v1.ClusterManagerClient; import com.google.cloud.container.v1.Cluster; import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.ConfigBuilder; import io.fabric8.kubernetes.client.DefaultKubernetesClient; import io.fabric8.kubernetes.client.KubernetesClient; import com.google.auth.oauth2.GoogleCredentials; import com.google.auth.oauth2.IdTokenCredentials; import com.google.auth.oauth2.IdTokenProvider; import java.io.IOException; public class CrossGkeClusterClient { public static KubernetesClient getTargetGkeClient(String projectId, String region, String clusterName) throws IOException { // 1. 获取目标GKE集群信息 try (ClusterManagerClient clusterManagerClient = ClusterManagerClient.create()) { String clusterPath = String.format("projects/%s/locations/%s/clusters/%s", projectId, region, clusterName); Cluster cluster = clusterManagerClient.getCluster(clusterPath); // 提取集群API地址和CA证书 String masterUrl = "https://" + cluster.getEndpoint(); String caCertData = cluster.getMasterAuth().getClusterCaCertificate(); // 2. 获取GCP认证令牌(用于访问目标K8s API) GoogleCredentials credentials = GoogleCredentials.getApplicationDefault(); IdTokenCredentials tokenCredentials = IdTokenCredentials.newBuilder() .setIdTokenProvider((IdTokenProvider) credentials) .setTargetAudience(masterUrl) .build(); String oauthToken = tokenCredentials.refreshAccessToken().getTokenValue(); // 3. 构建fabric8客户端配置 Config config = new ConfigBuilder() .withMasterUrl(masterUrl) .withCaCertData(caCertData) .withOauthToken(oauthToken) .withNamespace(null) .build(); return new DefaultKubernetesClient(config); } } // 测试示例:列出目标集群的Pod public static void main(String[] args) throws IOException { try (KubernetesClient client = getTargetGkeClient("MY_PROJECT", "MY_REGION", "MY_CLUSTER")) { client.pods().list().getItems().forEach(pod -> System.out.println("Pod Name: " + pod.getMetadata().getName()) ); } } }
四、关键说明
- 认证方式:代码中使用GCP默认凭据(Workload Identity或ServiceAccount密钥)获取OAuth2令牌,这是GKE官方推荐的认证方式,无需手动管理kubeconfig。
- 镜像优化:该方案仅依赖Java SDK和fabric8客户端,镜像体积可控制在几百MB以内(比如基于
openjdk:17-slim镜像),远小于包含gcloud CLI的镜像。 - 权限细化:如果只需要列出资源,可给IAM账号绑定
roles/container.viewer角色,遵循最小权限原则。
内容的提问来源于stack exchange,提问作者Roy T.
相关产品推荐
相关产品推荐

