Redian新闻
>
Java连接kubernates集群最优雅的两种方式

Java连接kubernates集群最优雅的两种方式

公众号新闻

创建maven工程,pom.xml中引入连接k8s的客户端jar包:

<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<fabric.io.version>6.10.0</fabric.io.version>
</properties>

<dependencies>
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>kubernetes-client</artifactId>
<version>${fabric.io.version}</version>
</dependency>
</dependencies>

目标:使用尽可能少的配置项来完成初始化工作,保证后续部署工作量最小

使用kubeconfig文件连接集群


使用场景

可以获取集群的kubeconfig文件

环境变量配置

默认配置项:

KUBECONFIG=~/.kube/config

自定义配置:

KUBECONFIG=/opt/file/kubeconfig


示例代码

import io.fabric8.kubernetes.api.model.Namespace;
import io.fabric8.kubernetes.api.model.NamespaceList;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientBuilder;

public class K8sClientWithKubeConfig {
public static void main(String[] args) {
KubernetesClient client = new KubernetesClientBuilder().build();
System.out.println(client.getMasterUrl());
NamespaceList myNs = client.namespaces().list();

for (Namespace ns : myNs.getItems()) {
System.out.println(ns.getMetadata().getName());
}
client.close();
}
}

其中master url为kubeconfig文件中的server字段;

使用ServiceAccount连接集群


使用场景

应用部署在k8s集群内,且可以创建Service Account和进行授权等操作(RBAC)

创建SA

apiVersion: v1
kind: ServiceAccount
metadata:
name: fmuser

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: fmuser-role
rules:
- apiGroups: [""]
resources: ["pods", "namespaces"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["delete"]
- apiGroups: [""]
resources: ["namespaces"]
verbs: ["get", "list", "watch"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: fmuser-rolebinding
subjects:
- kind: ServiceAccount
name: fmuser
namespace: default
roleRef:
kind: ClusterRole
name: fmuser-role
apiGroup: rbac.authorization.k8s.io

资源授权根据实际使用情况设置即可,Role(当前空间,权限较小)和ClusterRole(整个集群,权限较大)根据需要创建;在代码中使用时,不需要额外配置,客户端会从以下路径自动读取:

/home/app # ls -l /var/run/secrets/kubernetes.io/serviceaccount/
total 0
lrwxrwxrwx 1 root root 13 Jan 22 02:55 ca.crt -> ..data/ca.crt
lrwxrwxrwx 1 root root 16 Jan 22 02:55 namespace -> ..data/namespace
lrwxrwxrwx 1 root root 12 Jan 22 02:55 token -> ..data/token
/home/app #

所需的文件就是ca.crt和token;
如果需要在集群外验证这种认证方式,需要设置如下环境变量:

KUBERNETES_MASTER=https://191.168.7.132:6443;
KUBERNETES_AUTH_SERVICEACCOUNT_TOKEN=/opt/file/serviceaccount-token;
KUBERNETES_CERTS_CA_FILE=/opt/file/serviceaccount-ca.key;
KUBERNETES_AUTH_TRYKUBECONFIG=false

其中serviceaccount-ca.key和serviceaccount-token对应的是上面的ca.crt和token,需要注意的是,使用这种方式,master的url中的端口是6443,而不是默认的443,需要注意;

示例代码

import io.fabric8.kubernetes.api.model.Namespace;
import io.fabric8.kubernetes.api.model.NamespaceList;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientBuilder;

public class K8sClientWithServiceAccount {
public static void main(String[] args) {
KubernetesClient client = new KubernetesClientBuilder().build();
System.out.println(client.getConfiguration().getCaCertFile());
System.out.println(client.getConfiguration().getMasterUrl());
System.out.println(client.getConfiguration().getAutoOAuthToken());
NamespaceList myNs = client.namespaces().list();

for (Namespace ns : myNs.getItems()) {
System.out.println(ns.getMetadata().getName());
}
client.close();
}
}

打印的值就是环境变量中设置的;

获取sa的ca.crt和token

root@tianshu-ai-platform:~# kubectl get sa
NAME SECRETS AGE
default 1 13d
fmuser 1 7d
test 1 7d
root@tianshu-ai-platform:~# kubectl describe sa fmuser
Name: fmuser
Namespace: default
Labels: <none>
Annotations: <none>
Image pull secrets: <none>
Mountable secrets: fmuser-token-9qb8n
Tokens: fmuser-token-9qb8n
Events: <none>
root@tianshu-ai-platform:~# kubectl describe secret fmuser-token-9qb8n
Name: fmuser-token-9qb8n
Namespace: default
Labels: <none>
Annotations: kubernetes.io/service-account.name: fmuser
kubernetes.io/service-account.uid: 012db65a-e482-4626-ba01-fc136786c5b1

Type: kubernetes.io/service-account-token

Data
====
ca.crt: 1066 bytes
namespace: 7 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IjJ5SVZq......

root@tianshu-ai-platform:~# kubectl get secret fmuser-token-9qb8n -o jsonpath='{.data.ca\.crt}'
LS0tLS1CRUdJTiBDRVJ....
root@tianshu-ai-platform:~# kubectl get secret fmuser-token-9qb8n -o jsonpath='{.data.token}'
ZXlKaGJHY2lPaUpTVXpJ.....

root@tianshu-ai-platform:~# kubectl get secret fmuser-token-9qb8n -o jsonpath='{.data.ca\.crt}' | base64 --decode
-----BEGIN CERTIFICATE-----
MIIC5zCCAc+gAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJl
cm5ldGVzMB4XDTI0MDExNjA1NDUwMloXDTM0MDExMzA1NDUwMlowFTETMBEGA1UE
AxMKa3ViZXJuZXRlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMGw
FLPnomd41JAIw7jOVrz4Wm+7RwAZanQpOzvmR+SOZTjq5F2Lu/OXa9JhNNisJ2f1
R/MYNRDxCgeTid7iiG9s5OIS+4TFj5S36kXTYmZ51mQXohqjcZeVPgL+Vb8Jz2lS
uXPBGWwjj8ROfjWQcVE49V0DmybdPpZgjEUIxFVFcp3O7jtfl+oecRz55p4bYUrM
KsTXimmKEOcr4t1J6/DlvaXbZVCpJ28iIaDP2Z8qJT6/fg+jnevXr8QiedEsbx1i
D/FmIdBS2O+UsG9Gs+gUr2SA37UmRxelFiQQlgs/yC0/UEh8mrSkslN+Y5qlHEmI
/ntY6ZySzQhatcNEKMkCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB
/wQFMAMBAf8wHQYDVR0OBBYEFEChpxTbnR+JgB0qm/iHrmTjb+//MA0GCSqGSIb3
DQEBCwUAA4IBAQBcY+JrXiT+OHRhpFV4wdoxh4YKBGbzHNAC+d1mSoJE9K4lbK/n
7SWscW2SdIiCVwmH8VQyH1LKLGQZePuQ64yKetakCD6KCJ40IRY3MQR1lTM5K8pO
KRduy2dLxyfvMFNjjSBiDZnhd9XA1UcqTlwe6o9KAYOvBTePsalS6v7U7tzp1fBI
vtwicakxThcs5jAwb5HA/CHS3VFlAU7g3UZlFgIBvOuLAoUuxxkNIfMoYP/gPNKR
IB1wJBaCHIKcpUtzNH6ejhWIy8cGUeXAYXiL10gQdg20Nnmr3kdnXDzAipvOPspb
kGM9g4KWiXlUqwlq36btT9HHBC5shC4IzYL/
-----END CERTIFICATE-----

root@tianshu-ai-platform:~# kubectl get secret fmuser-token-9qb8n -o jsonpath='{.data.token}' | base64 --decode
eyJhbGciOiJSUzI1NiIsImtpZCI6IjJ5SVZqUjBOLVdwbUluU2F5M....

在使用中的ca.crt和token都是base64解码过的,存储在secret中的都是经过编码的;

好了,今天的小知识你学会了吗?


链接:https://www.cnblogs.com/flowerbirds/p/17997009

(版权归原作者所有,侵删)


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
下一场全球大流行病:困在北极冰层中的古代僵尸病毒正在复活!这类人群最危险...大模型推理速度飙升3.6倍,「美杜莎」论文来了,贾扬清:最优雅加速推理方案之一kubernetes之nftables用法介绍忆仙姿:致力义工留迹这一代大学生已经知道如何做一个优雅的人精选SDE岗位 | ManTech、Motorola、Western Digital公司岗位发布!【滋味】香气扑鼻!酱油肉的两种家常吃法来了CNCF 孵化 Strimzi 以简化 Kubernetes 上的KafkaIn China, the Hottest Travel Accessory Is a Tenured Professor为什么不能靠思维学法? | 学佛的两种境界:学理论与实修 之一“红色新闻兵”李振盛:用镜头记录文革历史 (不朽的记录)使用kind搭建kubernetes历史学家 “解放的悲剧”作者 冯克 Frank Dik?tter教授对廖碧兰“龙的女儿的日记”一书的评说【直播预告】赵嵩:一起优雅的聊聊人工智能替代人既然有了Kubernetes,为什么还需要 Istio?从罗馬到纽约的十七天Eve Energy将能源监控纳入其SmartThings集成hé bàng?hé bèng?别相信念头,直接学习实相 | 学佛的两种境界:学理论与实修 之三Quarkus 开发基于 LangChain4j 的扩展,方便将 LLM 集成到 Quarkus 应用程序中鸿发超市「2000 万美元」买下82街前Walmart超市!开设第4家Hông Phát分店!Kubernetes高可用集群二进制部署v1.28.0版本这身【刺绣镂空衬衫+卡其色休闲裤】,简直是为优雅的职场女性量身定做!学理论与实修的区别 | 学佛的两种境界:学理论与实修 之五Tencent and ByteDance Pause Feud, Team Up to Livestream Games92㎡两居室,黛青色+复古基调,营造含蓄优雅的东方气韵!【居住榜样】CIBC/Jefferies/Northwestern Mutual开放海量实习岗位, 留学生快冲!Kubernetes 配置Pod使用代理上网为什么有些人容易长痘?透明质酸酶的两种变体揭示答案Kubernetes:kube-scheduler 源码分析大厦的奢华生活,城市魅力与现代优雅的完美融合!长篇小说﹕纽约八年 (34) 谜底 (4)一文带你Ranther管理K8S集群Kubernetes Gateway API 攻略:解锁集群流量服务新维度!一文带你检查Kubernetes应用是否为最佳实践
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。