栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Kubernetes官方java客户端之四:内部应用,springboot实战

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Kubernetes官方java客户端之四:内部应用,springboot实战

| :-- | :-- | :-- |

| 项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |

| git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |

| git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |

  1. 这个git项目中有多个文件夹,本章的应用在kubernetesclient文件夹下,如下图红框所示:

开发K8S环境内的应用:DemoApplication
  1. 打开《Kubernetes官方java客户端:准备》中创建的的kubernetesclient工程,在里面创建子工程,名为helloworld,这是个SpringBoot工程,pom.xml内容如下:

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd”>

4.0.0

com.bolingcavalry

kubernetesclient

1.0-SNAPSHOT

…/pom.xml

com.bolingcavalry

helloworld

0.0.1-SNAPSHOT

helloworld

Demo project for Spring Boot

jar

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-actuator

org.projectlombok

lombok

true

io.kubernetes

client-java

org.springframework.boot

spring-boot-maven-plugin

2.3.0.RELEASE

true

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

浏览器打开:qq.cn.hn/FTf 免费领取
  1. 编写java代码,创建DemoApplication.java,这里为了简单起见,将引导类和web controller的代码都写在DemoApplication类中:

package com.bolingcavalry.demo;

import com.google.gson.Gson;

import io.kubernetes.client.openapi.ApiClient;

import io.kubernetes.client.openapi.Configuration;

import io.kubernetes.client.openapi.apis.CoreV1Api;

import io.kubernetes.client.openapi.models.V1PodList;

import io.kubernetes.client.util.Config;

import lombok.extern.slf4j.Slf4j;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import java.util.List;

import java.util.stream.Collectors;

@SpringBootApplication

@RestController

@Slf4j

public class DemoApplication {

public static void main(String[] args) {

SpringApplication.run(DemoApplication.class, args);

}

@RequestMapping(value = “/hello”)

public List hello() throws Exception {

ApiClient client = Config.defaultClient();

Configuration.setDefaultApiClient(client);

CoreV1Api api = new CoreV1Api();

// 调用客户端API取得所有pod信息

V1PodList v1PodList = api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null);

// 使用Gson将集合对象序列化成JSON,在日志中打印出来

log.info(“pod info n{}”, new Gson().toJson(v1PodList));

return v1PodList

.getItems()

.stream()

.map(value ->

value.getmetadata().getNamespace()

  • “:”

  • value.getmetadata().getName())

.collect(Collectors.toList());

}

}

  1. 还记得《Kubernetes官方java客户端之二:序列化和反序列化问题》提到的序列化问题吗?上述代码中,log.info那段代码里对V1PodList执行序列化的是Gson,并且hello方法返回的也不是V1PodList实例,而是新做的一个List实例,这样做是因为jackson对V1PodList做序列化会导致异常,这里要避免jackson参与序列化操作;

  2. 应用的代码已经写完,接下来是镜像制作用到的Dockerfile文件,该文件和刚才创建的pom.xml文件在同一个目录下(即子工程helloworld的文件夹下),Dockerfile文件内容如下:

指定基础镜像,这是分阶段构建的前期阶段

FROM openjdk:8u212-jdk-stretch as builder

执行工作目录

WORKDIR application

配置参数

ARG JAR_FILE=target/*.jar

将编译构建得到的jar文件复制到镜像空间中

COPY ${JAR_FILE} application.jar

通过工具spring-boot-jarmode-layertools从application.jar中提取拆分后的构建结果

RUN java -Djarmode=layertools -jar application.jar extract

正式构建镜像

FROM openjdk:8u212-jdk-stretch

WORKDIR application

前一阶段从jar中提取除了多个文件,这里分别执行COPY命令复制到镜像空间中,每次COPY都是一个layer

COPY --from=builder application/dependencies/ ./

COPY --from=builder application/spring-boot-loader/ ./

COPY --from=builder application/snapshot-dependencies/ ./

COPY --from=builder application/application/ ./

ENTRYPOINT [“java”, “org.springframework.boot.loader.JarLauncher”]

  1. 在子工程pom.xml文件所在目录执行以下命令完成编译构建:

mvn clean package -U -DskipTests

  1. 接下来要制作镜像文件了,请确保当前电脑已经安装并运行了docker,另外构建docker镜像的操作我仅在macOS和Linux操作系统下执行成功,在Windows环境能否成功请自行尝试;

  2. 在Dockerfile所在目录执行以下命令即可创建docker镜像文件:

docker build -t 192.168.50.43:5888/common/helloworld:1.0-SNAPSHOT .

  1. 上述命令执行成功后,镜像文件还只是在本机的docker仓库中,请放置到K8S环境可以访问的地方,我这里是在内网部署了镜像仓库Harbor,执行以下命令即可从本地仓库推送到Harbor(可能需要先登录,与Harbor的设置有关):

  1. 镜像准备完成,接下来就是在K8S环境部署了,在K8S环境创建名为helloworld.yaml的文件,内容如下,可见deployment和service都配置好了,另外请注意serviceAccountName属性的值为kubernates-client-service-account,此serviceAccountName是在《Kubernetes官方java客户端之一:准备》一文中创建好的RBAC资源,令咱们开发的helloworld应用有权限请求API Server:

apiVersion: v1

kind: Service

metadata:

name: helloworld

namespace : kubernetesclient

spec:

type: NodePort

ports:

  • port: 8080

nodePort: 30100

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/450993.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号