我们一个常见的应用,一般都会涉及到访问数据库,配置等外部资源。同时也将自己的能力提供给外部访问,前面已经介绍pod的内外网络通信
k8s-Pod中的网络通信(3)
这次直接做一个java应用,
开发------打镜像------配置并部署到k8s集群------内外访问。
其中应用使用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
-
服务启动需要连接nacos 也就是pod容器内需要访问 192.168.255.1:8848
-
服务启动之后需要开放给外面访问。
现在来配置服务启动需要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 访问我们的服务:
正常访问并获取数据。