k8s:使用Fabric 来访问api-server

本文介绍了如何在Java项目中添加Fabric8的kubernetes-client依赖,通过kubectl获取token,然后使用OAuthtoken通过Fabric框架连接到k8s集群并操作Pods,以获取default命名空间中的Pod列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、添加依赖

        <dependency>
            <groupId>io.fabric8</groupId>
            <artifactId>kubernetes-client</artifactId>
            <version>6.3.1</version>
        </dependency>

二、通过kubectl 去k8s集群获取token

kubectl -n kube-system describe $(kubectl -n kube-system get secret -n kube-system -o name | grep namespace) | grep token

三、通过token访问k8s,使用Fabric框架

package cn.edu.tju;

import io.fabric8.kubernetes.api.model.Pod;
import io.fabric8.kubernetes.api.model.PodList;
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 java.util.List;

public class Demo01 {
    private static String API_SERVER = "https://xx.xx.xx.xx:6443";
    //去服务器通过kubectl 获取token
    // kubectl -n kube-system describe $(kubectl -n kube-system get secret -n kube-system -o name | grep namespace) | grep token
    private static String token = "eyJhbGciOiJSUzI1NiIsImtpZCI6IlZuSzNPTk5fMFp1bDlHbk1sLXZuZVJuVjJkRUNmOFFwZ0hJRVRMVFF5RUUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJuYW1lc3BhY2UtY29udHJvbGxlci10b2tlbi10ZmM5bCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJuYW1lc3BhY2UtY29udHJvbGxlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjIzNmEyYWFjLWEyZDktNDJkOC05ODkxLTU1YjY0YTIxYWQ0ZSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTpuYW1lc3BhY2UtY29udHJvbGxlciJ9.IwEnORYqxM_qnVnLM2pdxlbsStHXHmj96t5DF4EstXkG4FJh0q6lc68fpLd1tvi2lJuhPPFHxEoKk3PXXza9x1mobeBRs-TYW3sPxkMNBiBDmjRvhC6Ny_dWU7LWWaNIxMxb0BeaAfgXA1e1Fi5CLxivAeQDNxRJgkFz-FaXraEM5_1CaRJzBasDNmyZZBa5LhW-_PR4O7ENG_JxDPmaAzEEY7RrPNMh27oHpfRnXIv-7b9B3Dk0NzHly1SMAQbngdU_YoyRAc6mW9-lPujl4beHgthYpvemcxdmpOmaywuhVAUYxrekomfZDM_9McArlZgi9I9GCJNTqwLUW2eJHQ";

    public static void main(String[] args) {
        KubernetesClient client = null;
        try {
            Config build = new ConfigBuilder().withMasterUrl(API_SERVER)
                    .withTrustCerts(true)
                    .withOauthToken(token).build();
            client = new DefaultKubernetesClient(build);
        } catch (Exception e) {
            e.printStackTrace();
        }

        PodList podList = client.pods().inNamespace("default").list();
        List<Pod> itemList = podList.getItems();
        itemList.stream().forEach(pod -> {
            System.out.println(pod.getMetadata().getName());
        });

    }
}
### Java程序通过RBAC机制访问Kubernetes集群 为了使Java应用程序能够安全地与Kubernetes API服务器通信并执行操作,必须配置基于角色的访问控制(RBAC)。这涉及到创建服务账户、定义角色以及绑定这些角色到特定的服务账户。 #### 创建服务账号和服务令牌 首先,在目标命名空间内创建一个新的服务账号: ```bash apiVersion: v1 kind: ServiceAccount metadata: name: java-app-sa namespace: default ``` 保存上述内容至`service-account.yaml`文件并通过kubectl应用此资源描述符[^3]。 接着,获取新创建的服务账号对应的JWT令牌用于后续的身份验证过程。可以通过查看secret对象来找到它: ```bash kubectl get secret -n default | grep java-app-sa-token ``` #### 定义权限范围的角色 根据实际需求设计适当的角色定义文档,这里给出一个拥有广泛读取权限的例子作为参考: ```yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: role-read-pods rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: read-pods namespace: default subjects: - kind: ServiceAccount name: java-app-sa namespace: default roleRef: kind: Role name: role-read-pods apiGroup: rbac.authorization.k8s.io ``` 同样地,将这段YAML代码存储在一个文件里再利用`kubectl apply -f <filename>`命令部署下去[^1]。 #### 编写Java客户端代码 有了前面准备好的认证信息之后就可以编写具体的业务逻辑了。下面是一个简单的例子展示怎样借助Fabric8库发起API请求: ```java import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.DefaultKubernetesClient; public class KubernetesAccessExample { public static void main(String[] args) { Config config = new ConfigBuilder() .withMasterUrl("https://<your-cluster-ip>:6443") // 替换成自己的apiserver地址 .withOauthToken("<token>") // 使用之前获得的服务账号token .build(); try (KubernetesClient client = new DefaultKubernetesClient(config)) { System.out.println(client.pods().inNamespace("default").list()); } } } ``` 需要注意的是,这里的URL应该指向Kubernetes APIServer的实际位置;而TOKEN则是在第二步提到的秘密中提取出来的字符串形式的数据[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值