发布于2026-07-18 阅读(0)
扫一扫,手机访问
在Ja va中操作Kubernetes,很多人的第一反应是写一堆繁琐的yaml然后手动kubectl apply——但如果是程序内部需要动态创建Deployment、Service呢?这时候就需要一个靠谱的客户端库。fabric8的kubernetes-client是Ja va生态里比较成熟的选择,版本4.10.2已经够用,下面直接上步骤。
io.fabric8 kubernetes-client 4.10.2
初始化KubernetesClient客户端
首先需要找到 /etc/kubernetes/admin.conf文件

这是连接k8s的配置文件,通过这个文件,就可以在Ja va程序中连接上k8s,初始化KubernetesClient客户端
将该文件的内容复制进kubeconfig,预先存好kubeconfig的文件位置:C:\Users\26411\Desktop\AI平台\kubeconfig
application.yml
k8s: kubeconfig: C:\Users\26411\Desktop\AI平台\kubeconfig
编写配置类,初始化KubernetesClient为Bean
@Configuration
public class K8sConfig {
@Value("${k8s.kubeconfig}")
private String kubeconfigPath;
@Bean
public KubernetesClient getClient() throws IOException {
File configFile = new File(kubeconfigPath);
final String configYaml = String.join("\n", Files.readAllLines(configFile.toPath()));
Config config = Config.fromKubeconfig(configYaml);
config.setTrustCerts(true);
return new DefaultKubernetesClient(config);
}
}
测试后,在 Xshell 中使用 kubectl 命令查看正常,测试成功。
@SpringBootTest
public class K8sTest {
String namespace = "default";
@Autowired
private KubernetesClient kubernetesClient;
/**
* 获取Pod
*/
@Test
void testGetPod(){
Pod pod = kubernetesClient.pods().inNamespace("kube-system").withName("kube-apiserver-master").get();
System.out.println(pod);
}
/**
* 创建deployment
*/
@Test
void testCreateDeployment(){
Deployment deployment = getDeployment();
Deployment de = kubernetesClient.apps().deployments().inNamespace(namespace).create(deployment);
}
private Deployment getDeployment() {
Map labels = new HashMap<>();
labels.put("run","nginx");
LabelSelector labelSelector = new LabelSelector();
labelSelector.setMatchLabels(labels);
return new DeploymentBuilder()
.withNewMetadata()
.withName("nginx")
.withNamespace(namespace)
.addToLabels(labels)
.endMetadata()
.withNewSpec()
.withSelector(labelSelector)
.withNewTemplate()
.withNewMetadata()
.withName("nginx")
.addToLabels(labels)
.withNamespace(namespace)
.endMetadata()
.withNewSpec()
.addToContainers(buildContainer())
.endSpec()
.endTemplate()
.endSpec()
.build();
}
private Container buildContainer() {
ContainerPort containerPort = new ContainerPort();
containerPort.setProtocol("TCP");
containerPort.setContainerPort(80);
return new ContainerBuilder()
.withNewName("nginx")
.withNewImage("nginx:latest")
.withPorts(containerPort)
.build();
}
/**
* 创建Service
*/
@Test
void testCreateService(){
Service service = kubernetesClient.services().inNamespace(namespace).create(getService());
System.out.println(service);
}
private Service getService() {
HashMap selector = new HashMap<>();
selector.put("run","nginx");
ServicePort port = new ServicePort();
port.setProtocol("TCP");
port.setPort(80);
port.setTargetPort(new IntOrString(80));
return new ServiceBuilder()
.withNewMetadata()
.withName("svc-nginx")
.withNamespace(namespace)
.endMetadata()
.withNewSpec()
.withClusterIP("10.109.179.231")
.withPorts(port)
.withSelector(selector)
.withType("NodePort")
.endSpec().build();
}
}
@Component
public class K8sUtil {
@Autowired
private KubernetesClient kubernetesClient;
/**
* 获取一个 Pod
*
* @param namespace 名称空间
* @param podName Pod名字
* @return {@link Pod}
*/
public Pod getOnePod(String namespace, String podName){
return kubernetesClient.pods().inNamespace(namespace).withName(podName).get();
}
/**
* 创建一个 Pod
*
* @param namespace 名称空间
* @param podBody Pod内容
* @return {@link Pod}
*/
public Pod createOnePod(String namespace, Pod podBody){
return kubernetesClient.pods().inNamespace(namespace).create(podBody);
}
/**
* 创建Deployment
*
* @param deploymentDto 部署dto
* @return {@link Deployment}
*/
public Deployment createDeployment(DeploymentDto deploymentDto){
Deployment deployment = getDeployment(deploymentDto);
return kubernetesClient.apps().deployments()
.inNamespace(deploymentDto.getNamespace())
.create(deployment);
}
private Deployment getDeployment(DeploymentDto deploymentDto) {
return new DeploymentBuilder()
.withNewMetadata()
.withName(deploymentDto.getDeploymentName())
.withNamespace(deploymentDto.getNamespace())
.addToLabels(deploymentDto.getLabels())
.endMetadata()
.withNewSpec()
.withReplicas(deploymentDto.getReplicas())
.withSelector(deploymentDto.getLabelSelector())
// Template() Pod模板
.withNewTemplate()
.withNewMetadata()
.addToLabels(deploymentDto.getLabels())
.endMetadata()
.withNewSpec()
.addToContainers(buildContainer(deploymentDto))
.endSpec()
.endTemplate()
.endSpec()
.build();
}
private Container buildContainer(DeploymentDto deploymentDto) {
ContainerPort containerPort = new ContainerPort();
containerPort.setProtocol(deploymentDto.getProtocol());
containerPort.setContainerPort(deploymentDto.getContainerPort());
return new ContainerBuilder()
.withNewName(deploymentDto.getContainerName())
.withNewImage(deploymentDto.getImage())
.withPorts(containerPort)
.build();
}
/**
* 创建Service
*
* @param serviceDto 服务dto
* @return {@link Service}
*/
public Service createService(ServiceDto serviceDto) {
Service service = getService(serviceDto);
return kubernetesClient.services().inNamespace(serviceDto.getNamespace()).create(service);
}
private Service getService(ServiceDto serviceDto) {
ServicePort port = new ServicePort();
port.setProtocol(serviceDto.getProtocol());
port.setPort(serviceDto.getPort());
port.setTargetPort(new IntOrString(serviceDto.getTargetPort()));
return new ServiceBuilder()
.withNewMetadata()
.withName(serviceDto.getServiceName())
.withNamespace(serviceDto.getNamespace())
.endMetadata()
.withNewSpec()
//.withClusterIP()
.withPorts(port)
.withSelector(serviceDto.getSelector())
.withType(serviceDto.getType())
.endSpec()
.build();
}
}
附上两个封装信息的实体类
@Data
public class DeploymentDto {
/**
* 名称空间
*/
private String namespace;
/**
* deployment名字
*/
private String deploymentName;
/**
* 副本个数
*/
private Integer replicas;
/**
* Pod模板的标签、Deployment标签选择器 会匹配到的标签
*/
private Map labels;
/**
* Deployment标签选择器
*/
private LabelSelector labelSelector;
// spec下的 containers
/**
* 容器要拉取运行的镜像
*/
private String image;
/**
* 容器名称
*/
private String containerName;
/**
* 容器端口
*/
private Integer containerPort;
/**
* 协议
*/
private String protocol;
}
@Data
public class ServiceDto {
/**
* 名称空间
*/
private String namespace;
/**
* Service名称
*/
private String serviceName;
/**
* 端口
*/
private Integer port;
/**
* 协议
*/
private String protocol;
/**
* 目标端口
*/
private Integer targetPort;
/**
* Service的标签选择器 选择有对应标签的Pod (但是其实通过Deployment操控)
*/
private Map selector;
/**
* 类型 :NodePort、ClusterIP等等
*/
private String type;
}

访问 http://192.168.242.100:30439/

封装操作更多的功能,操作更多资源,例如 ingress
以上就是通过Ja va操作K8s创建Deployment和Service的基本流程,后续还可以根据需求封装更多功能,比如Ingress等。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8