You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需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,或更细粒度的资源只读权限)

二、依赖引入

在你的项目中添加以下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())
            );
        }
    }
}

四、关键说明

  1. 认证方式:代码中使用GCP默认凭据(Workload Identity或ServiceAccount密钥)获取OAuth2令牌,这是GKE官方推荐的认证方式,无需手动管理kubeconfig。
  2. 镜像优化:该方案仅依赖Java SDK和fabric8客户端,镜像体积可控制在几百MB以内(比如基于openjdk:17-slim镜像),远小于包含gcloud CLI的镜像。
  3. 权限细化:如果只需要列出资源,可给IAM账号绑定roles/container.viewer角色,遵循最小权限原则。

内容的提问来源于stack exchange,提问作者Roy T.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:08:31