k8s-java应用部署(4)
我们一个常见的应用,一般都会涉及到访问数据库,配置等外部资源。同时也将自己的能力提供给外部访问,前面已经介绍pod的内外网络通信
k8s-Pod中的网络通信(3)
这次直接做一个java应用,
其中应用使用nacos作为配置,这就意味着pod内部需要访问外部的nacos
1.应用开发
使用springboot 快速搭建一个java应用:pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.nijunyang</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>k8s-demo</name>
<description>k8s-demo</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.1.RELEASE</version>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<optional>true</optional>
</dependency> </dependencies> <build>
<finalName>k8s-demo</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build> </project>
提供一个测试接口:
从nacos获取配置内容:TestController.java
package com.nijunyang.demo.controller; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @author nijunyang
* @version 0.0.1
* @since 2025/11/3 15:59
*/
@Slf4j
@RequestMapping("/test")
@RestController
public class TestController { @Value("${a.b.c}")
String aBc; @GetMapping("nacos")
public Object getNacosConfig() {
return aBc;
} @GetMapping("/log")
public Object log() {
log.info("xxxxx=====我是日志======xxxxx");
return 1;
} }
把日志相关内容也配置上,方便后续使用:logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="log_pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}:%line - %msg%n"/>
<property name="log_path" value="/data/logs/k8s-demo/"/> <!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log_pattern}</pattern>
</encoder>
</appender> <!-- 文件输出:当前日志为 info.log,归档带日期并压缩 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 当前活跃日志文件名 -->
<file>${log_path}/info.log</file> <encoder>
<pattern>${log_pattern}</pattern>
</encoder> <!-- 滚动策略:按时间和大小,归档文件带日期、序号,并自动 gzip 压缩 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 归档文件命名规则:注意结尾加 .gz 表示压缩 -->
<fileNamePattern>${log_path}/%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory> <!-- 保留30天归档 -->
<totalSizeCap>10GB</totalSizeCap> <!-- 总大小上限 -->
</rollingPolicy>
</appender> <root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
nacos配置: bootstrap.yml
spring:
cloud:
nacos:
config:
server-addr: ${NACOS:127.0.0.1:8848}
file-extension: properties
application:
name: demo
server-addr: ${NACOS:127.0.0.1:8848}   使用NACOS 变量,后续由命令行参数传入实际的值:-DNACOS=ip:端口。通过命令行传递的用户自定义的非标准参数,需要加-D,也就是非 JDK自身参数(-Xmx512m, -Xms256m, -XX:+UseG1GC 这些就不用加-D)
本地起一个nacos 放入相关的值:

2. 镜像制作
首先将应用打成jar包
我本地windows系统安装的docker desktop和之前安装的harbor仓库协作有问题,我仓库只开放了http,虽然配置了仓库信息,但是每次拉取镜像都是用的https去私有仓库,以至于都拉不下来,也传不上去镜像。
所以我是将jar包上传到我的k8s的node节点去制作镜像的。
在jar包同目录编写Dockerfile文件:
# 基础镜像
FROM openjdk:8-jdk-slim
#FROM eclipse-temurin:8-jdk-alpine #创建日志目录
RUN mkdir -p "/data/logs/k8s-demo" # 设置默认 JVM 参数
ENV JVM_OPTS="-Xmx512m -Xms256m -Dfile.encoding=UTF-8" # 设置工作目录
WORKDIR /app
COPY k8s-demo.jar ./k8s-demo.jar
EXPOSE 8080
# 启动应用
ENTRYPOINT [ "sh", "-c", "java $JVM_OPTS -jar k8s-demo.jar" ]
说一下这里
RUN mkdir -p "/data/logs/k8s-demo"
和日志配置文件 logback.xml 里面路径对应,先创建好,避免到时候应用启动的时候没有权限创建,以至于日志无法正常写入
ENV JVM_OPTS="-Xmx512m -Xms256m -Dfile.encoding=UTF-8"
env 设置环境参数,到时候jvm参数,nacos配置都通过这个变量传进来
在jar包和dockerfile的目录执行:最后有个点. 表示当前目录
docker build -t k8s-demo:1.0 .
镜像便制作好了:
镜像重新打tag 并推到harbor仓库:
docker tag k8s-demo:1.0 k8s-harbor.taoyao.com/nijunyang/k8s-demo:1.0
docker push k8s-harbor.taoyao.com/nijunyang/k8s-demo:1.0
3.应用部署
再介绍下机器信息:
192.168.255.1 windows主机 部署nacos
192.168.255.101 vmware虚拟机中部署的centos7 k8s-master
192.168.255.102 vmware虚拟机中部署的centos7 k8s-node1
192.168.255.103 vmware虚拟机中部署的centos7 k8s-node2
1. 服务启动需要连接nacos 也就是pod容器内需要访问 192.168.255.1:8848
2. 服务启动之后需要开放给外面访问。
现在来配置服务启动需要service: 以资源文件的方式
同一台机器多个端口暴露,可以在同一个service配置中设置,我们把 192.168.255.1 上面的mysql 的3306 也一起弄了
external-multiport.yaml:
apiVersion: v1
kind: Service
metadata:
name: external-multiport
spec:
ports:
- name: mysql
port: 3306
targetPort: 3306
- name: nacos
port: 8848
targetPort: 8848
---
apiVersion: v1
kind: Endpoints
metadata:
name: external-multiport
subsets:
- addresses:
- ip: 192.168.255.1
ports:
- port: 3306
name: mysql
- port: 8848
name: naco
kubectl apply -f external-multiport.yaml
kubectl get svc 可以看到svc的ip 是 10.101.42.248 后续就是将这个ip配置到jvm 启动参数中

再来配置我们pod 服务文件使用deployment:k8s-demo-deployment.yaml
jvm_opts 参数 nacos 传入svc配置之后的 ip 地址 , 一起服务对外的svc一起配置了
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s-demo
labels:
app: k8s-demo
spec:
replicas: 2
selector:
matchLabels:
app: k8s-demo
template:
metadata:
labels:
app: k8s-demo
spec:
containers:
- name: k8s-demo
image: k8s-harbor.taoyao.com/nijunyang/k8s-demo:1.0
env:
- name: JVM_OPTS
value: "-DNACOS=10.101.42.248:8848"
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: k8s-demo
labels:
app: k8s-demo
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
protocol: TCP
selector:
app: k8s-demo
kubectl apply -f k8s-demo-deployment.yaml
kubectl get pod -o wide 查看服务已经起来了两台

kubectl logs k8s-demo-77bbf688cd-2krwl查看任意一台容器日志也一切正常,说明nacos 是正常访问了的了,并且获取到了配置

pod 的ip 是 10.244.1.14 和10.244.2.9 去任意node节点用这个两个ip 访问我们服务提供的查询配置的接口验证:
curl 10.244.1.14:8080/test/nacos curl 10.244.2.9:8080/test/nacos
返回的值就是我们nacos上面配置的123

kubectl describe svc k8s-demo  查看pod 部署一起创建的对外的svc信息:Nodeport 暴露的端口是31385

在k8s外面(192.168.255.1 windows主机)使用任意node节点的ip + 31385 访问我们的服务:

正常访问并获取数据。
k8s-java应用部署(4)的更多相关文章
- 05 . k8s实战之部署PHP/JAVA网站
		
传统部署和k8s部署区别 通常使用传统的部署的时候,我们一个web项目,网站的搭建,往往使用的如下的一种整体架构,可能有的公司在某一环节使用的东西是不一样,但是大体的框架流程是都是差不多的 1111 ...
 - 在k8s集群部署SonarQube
		
目录 1.2.存储环境 1.3.sonarqube版本 2.部署sonarqube 2.1.部署PostgreSQL 2.2.部署SonarQube 2.3.访问检查 SonarQube 是一款用于代 ...
 - 高密度Java应用部署的一些实践
		
传统的Java应用部署模式,一般遵循“硬件->操作系统->JVM->Java应用”这种自底向上的部署结构,其中JEE应用可以细化为“硬件->操作系统->JVM->J ...
 - Java Project部署到Tomcat服务器上
		
所有的JAVA程序员,在编写WEB程序时,一般都通过工具如 MyEclipse,编写一个WEB Project,通过工具让这个WEB程序和Tomcat关联.其实在我们可以通过JAVA程序部署到Tomc ...
 - android 之 java环境部署
		
上甲骨文公司官网下载最新的jdk http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-z ...
 - idea java项目部署至Tomcat服务器
		
1. 服务器部署TomCat 1. 安装JDK,配置环境变量 > 变量名:JAVA_HOME;变量值:C:\Program Files\Java\jdk1.7.0_45 ...
 - 揭秘Java热部署原理及JRebel(Hotcode)的实现原理
		
基础知识:class卸载.热替换和Tomcat的热部署的分析HotSwap:HotSwap和JRebel原理成熟的热部署技术实现原理:深入探索 Java 热部署 java的热部署和热加载
 - 探秘 Java 热部署三(Java agent agentmain)
		
前言 让我们继续探秘 Java 热部署.在前文 探秘 Java 热部署二(Java agent premain)中,我们介绍了 Java agent premain.通过在main方法之前通过类似 A ...
 - 探秘 Java  热部署二(Java agent premain)
		
# 前言 在前文 探秘 Java 热部署 中,我们通过在死循环中重复加载 ClassLoader 和 Class 文件实现了热部署的功能,但我们也指出了缺点-----不够灵活.需要手动修改文件等操作. ...
 - 【JavaService】使用Java编写部署windows服务
		
如果你玩windows系统,你对服务这个东西并不会陌生,服务可以帮我们做很多事情,在不影响用户正常工作的情况下,可以完成很多我们需要的需求. 众所周知,微软的visio studio内置的Servic ...
 
随机推荐
- Linux 压缩解压命令总结
			
在 Linux 中,由于经常需要做文件传输的操作,所以我们会将文件夹压缩打包,减少传输的大小,加快文件传输速度. 以下列出一些常用的压缩打包和解压命令: 打包和解包 # -c意思是create # - ...
 - Falcon 180B
			
Falcon 180B Training Full fine-tuning 5120GB 8x 8x A100 80GBFalcon 180B Training LoRA with ZeRO-3 12 ...
 - 减少Spring boot启动内存(开发环境)
			
在学习cloud的过程中,因为启动了多个服务,发现电脑(8G内存)卡成狗啦....看下图: 想到每个服务都只是简单的使用了cloud的功能,内存怎么会这么大呢?头疼 扒拉扒拉一大堆文章后 大佬们给出了 ...
 - DDD架构模板:Ncp.CleanDDD
			
推荐一个优雅的DDD架构模板:Ncp.CleanDDD 在现代软件开发中,领域驱动设计(DDD)越来越受到开发者的青睐,但搭建一个规范的DDD项目结构往往需要耗费大量时间.今天给大家推荐一个我最近发现 ...
 - shader编程基础:画圆
			
前记 使用的在线编译工具shadertoy的编写shader语言.跳转链接:Shadertoy 基本实现 void mainImage( out vec4 fragColor, in vec2 fra ...
 - CF2112D Reachability and Tree
			
CF2112D Reachability and Tree 题意 设 \(u\) 和 \(v\) 是有向图中的两个不同顶点.如果存在一条从顶点 \(u\) 到顶点 \(v\) 的路径,我们称有序对 \ ...
 - 试试这个AI邪修方法,让你刷推特时间节省80%
			
前言 不知道你有没有这样的痛点,每次刷推特总是浪费很多时间在上面,但是如果不刷呢又感觉错过了很多重要的信息.以前欧阳坐班的时候是利用通勤路上刷推特,现在远程办公了,每次打开推特经常1-2个小时就过去了 ...
 - 借势C端升级B端 京东健康谋“大”
			
当前,除了个人越来越关注自身健康问题,企业也开始"谋划"如何能更好地照顾好员工的健康,因为在充满变化的环境中,这直接关系着企业的可持续.健康发展. 6月14日,京东健康举办线上发布 ...
 - 10 分钟使用 OrchardCore 快速构建 .NET 内容管理系统(CMS)
			
前言 今天我们来使用 OrchardCore 来快速构建可配置的 .NET 内容管理系统(CMS). 项目介绍 OrchardCore 是一个开源的(BSD-3-Clause license).模块化 ...
 - IE 中出现的{description: "拒绝访问。  ", message: "拒绝访问。  ", name: "Error", number: -2147024891, stack: "Error: 拒绝访问...", 问题
			
IE真的很神奇,IE11下,本地和di正常,上了生产就会出现这样的问题,还没找到原因,找到了补充. 出现这个问题后,页面卡死,路由跳转失败,点击任何按钮无效但是请求还可以发,头大