最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java簡單操作k8s,創(chuàng)建Deployment、Service、訪問Nginx實(shí)踐

 更新時(shí)間:2026年04月16日 10:44:26   作者:0302huang  
文章介紹了使用Maven依賴并初始化KubernetesClient客戶端,通過配置kubeconfig文件連接Kubernetes集群,編寫配置類將KubernetesClient初始化為Bean,并測試連接,最后,提供了一個(gè)訪問部署在Kubernetes中的Nginx服務(wù)的示例,以及后續(xù)擴(kuò)展思路

1.Maven依賴

<!-- k8s client -->
<dependency>
    <groupId>io.fabric8</groupId>
    <artifactId>kubernetes-client</artifactId>
    <version>4.10.2</version>
</dependency>

2.初始化 k8s 客戶端

初始化KubernetesClient客戶端

首先需要找到 /etc/kubernetes/admin.conf文件

這是連接k8s的配置文件,通過這個(gè)文件,就可以在Java程序中連接上k8s,初始化KubernetesClient客戶端

將該文件的內(nèi)容復(fù)制進(jìn)kubeconfig,預(yù)先存好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);
    }
}

3.測試類測試簡單功能

測試后,在 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);
    }

    /**
     * 創(chuàng)建deployment
     */
    @Test
    void testCreateDeployment(){
        Deployment deployment = getDeployment();
        Deployment de = kubernetesClient.apps().deployments().inNamespace(namespace).create(deployment);
    }
    
    private Deployment getDeployment() {
        Map<String, String> 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();
    }

    /**
     * 創(chuàng)建Service
     */
    @Test
    void testCreateService(){
        Service service = kubernetesClient.services().inNamespace(namespace).create(getService());
        System.out.println(service);
    }

    private Service getService() {
        HashMap<String, String> 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();
    }

}

4.編寫工具類封裝簡單功能

@Component
public class K8sUtil {
    
    @Autowired
    private KubernetesClient kubernetesClient;

    /**
     * 獲取一個(gè) Pod
     *
     * @param namespace 名稱空間
     * @param podName   Pod名字
     * @return {@link Pod}
     */
    public Pod getOnePod(String namespace, String podName){
        return kubernetesClient.pods().inNamespace(namespace).withName(podName).get();
    }

    /**
     * 創(chuàng)建一個(gè) Pod
     *
     * @param namespace 名稱空間
     * @param podBody   Pod內(nèi)容
     * @return {@link Pod}
     */
    public Pod createOnePod(String namespace, Pod podBody){
        return kubernetesClient.pods().inNamespace(namespace).create(podBody);
    }

    /**
     * 創(chuàng)建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();
    }

    /**
     * 創(chuàng)建Service
     *
     * @param serviceDto 服務(wù)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();
    }
    
}

附上兩個(gè)封裝信息的實(shí)體類

@Data
public class DeploymentDto {
    /**
     * 名稱空間
     */
    private String namespace;
    /**
     * deployment名字
     */
    private String deploymentName;
    /**
     * 副本個(gè)數(shù)
     */
    private Integer replicas;
    /**
     * Pod模板的標(biāo)簽、Deployment標(biāo)簽選擇器 會匹配到的標(biāo)簽
     */
    private Map<String,String> labels;
    /**
     * Deployment標(biāo)簽選擇器
     */
    private LabelSelector labelSelector;

    // spec下的 containers
    /**
     * 容器要拉取運(yùn)行的鏡像
     */
    private String image;
    /**
     * 容器名稱
     */
    private String containerName;
    /**
     * 容器端口
     */
    private Integer containerPort;
    /**
     * 協(xié)議
     */
    private String protocol;
}

@Data
public class ServiceDto {
    /**
     * 名稱空間
     */
    private String namespace;
    /**
     * Service名稱
     */
    private String serviceName;
    /**
     * 端口
     */
    private Integer port;
    /**
     * 協(xié)議
     */
    private String protocol;
    /**
     * 目標(biāo)端口
     */
    private Integer targetPort;
    /**
     * Service的標(biāo)簽選擇器    選擇有對應(yīng)標(biāo)簽的Pod (但是其實(shí)通過Deployment操控)
     */
    private Map<String,String> selector;
    /**
     * 類型   :NodePort、ClusterIP等等
     */
    private String type;
}

5.訪問部署的Nginx

訪問 http://192.168.242.100:30439/

6.后續(xù)擴(kuò)展

封裝操作更多的功能,操作更多資源,例如 ingress

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

梁山县| 林西县| 黄龙县| 宁武县| 旺苍县| 永城市| 贡嘎县| 娱乐| 义马市| 赤水市| 沙雅县| 丹东市| 宝山区| 沅江市| 蕉岭县| 安塞县| 碌曲县| 古浪县| 宜君县| 理塘县| 丰镇市| 富源县| 揭东县| 湘潭市| 获嘉县| 万盛区| 兴仁县| 泾川县| 凤城市| 洛阳市| 奇台县| 万载县| 益阳市| 西充县| 德江县| 达孜县| 双城市| 兰考县| 蓝山县| 博客| 佛学|