我们一个常见的应用,一般都会涉及到访问数据库,配置等外部资源。同时也将自己的能力提供给外部访问,前面已经介绍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

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)的更多相关文章

  1. 05 . k8s实战之部署PHP/JAVA网站

    传统部署和k8s部署区别 通常使用传统的部署的时候,我们一个web项目,网站的搭建,往往使用的如下的一种整体架构,可能有的公司在某一环节使用的东西是不一样,但是大体的框架流程是都是差不多的 1111 ...

  2. 在k8s集群部署SonarQube

    目录 1.2.存储环境 1.3.sonarqube版本 2.部署sonarqube 2.1.部署PostgreSQL 2.2.部署SonarQube 2.3.访问检查 SonarQube 是一款用于代 ...

  3. 高密度Java应用部署的一些实践

    传统的Java应用部署模式,一般遵循“硬件->操作系统->JVM->Java应用”这种自底向上的部署结构,其中JEE应用可以细化为“硬件->操作系统->JVM->J ...

  4. Java Project部署到Tomcat服务器上

    所有的JAVA程序员,在编写WEB程序时,一般都通过工具如 MyEclipse,编写一个WEB Project,通过工具让这个WEB程序和Tomcat关联.其实在我们可以通过JAVA程序部署到Tomc ...

  5. android 之 java环境部署

    上甲骨文公司官网下载最新的jdk http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-z ...

  6. idea java项目部署至Tomcat服务器

    1. 服务器部署TomCat     1. 安装JDK,配置环境变量     > 变量名:JAVA_HOME;变量值:C:\Program Files\Java\jdk1.7.0_45      ...

  7. 揭秘Java热部署原理及JRebel(Hotcode)的实现原理

    基础知识:class卸载.热替换和Tomcat的热部署的分析HotSwap:HotSwap和JRebel原理成熟的热部署技术实现原理:深入探索 Java 热部署 java的热部署和热加载

  8. 探秘 Java 热部署三(Java agent agentmain)

    前言 让我们继续探秘 Java 热部署.在前文 探秘 Java 热部署二(Java agent premain)中,我们介绍了 Java agent premain.通过在main方法之前通过类似 A ...

  9. 探秘 Java 热部署二(Java agent premain)

    # 前言 在前文 探秘 Java 热部署 中,我们通过在死循环中重复加载 ClassLoader 和 Class 文件实现了热部署的功能,但我们也指出了缺点-----不够灵活.需要手动修改文件等操作. ...

  10. 【JavaService】使用Java编写部署windows服务

    如果你玩windows系统,你对服务这个东西并不会陌生,服务可以帮我们做很多事情,在不影响用户正常工作的情况下,可以完成很多我们需要的需求. 众所周知,微软的visio studio内置的Servic ...

随机推荐

  1. Linux 压缩解压命令总结

    在 Linux 中,由于经常需要做文件传输的操作,所以我们会将文件夹压缩打包,减少传输的大小,加快文件传输速度. 以下列出一些常用的压缩打包和解压命令: 打包和解包 # -c意思是create # - ...

  2. Falcon 180B

    Falcon 180B Training Full fine-tuning 5120GB 8x 8x A100 80GBFalcon 180B Training LoRA with ZeRO-3 12 ...

  3. 减少Spring boot启动内存(开发环境)

    在学习cloud的过程中,因为启动了多个服务,发现电脑(8G内存)卡成狗啦....看下图: 想到每个服务都只是简单的使用了cloud的功能,内存怎么会这么大呢?头疼 扒拉扒拉一大堆文章后 大佬们给出了 ...

  4. DDD架构模板:Ncp.CleanDDD

    推荐一个优雅的DDD架构模板:Ncp.CleanDDD 在现代软件开发中,领域驱动设计(DDD)越来越受到开发者的青睐,但搭建一个规范的DDD项目结构往往需要耗费大量时间.今天给大家推荐一个我最近发现 ...

  5. shader编程基础:画圆

    前记 使用的在线编译工具shadertoy的编写shader语言.跳转链接:Shadertoy 基本实现 void mainImage( out vec4 fragColor, in vec2 fra ...

  6. CF2112D Reachability and Tree

    CF2112D Reachability and Tree 题意 设 \(u\) 和 \(v\) 是有向图中的两个不同顶点.如果存在一条从顶点 \(u\) 到顶点 \(v\) 的路径,我们称有序对 \ ...

  7. 试试这个AI邪修方法,让你刷推特时间节省80%

    前言 不知道你有没有这样的痛点,每次刷推特总是浪费很多时间在上面,但是如果不刷呢又感觉错过了很多重要的信息.以前欧阳坐班的时候是利用通勤路上刷推特,现在远程办公了,每次打开推特经常1-2个小时就过去了 ...

  8. 借势C端升级B端 京东健康谋“大”

    当前,除了个人越来越关注自身健康问题,企业也开始"谋划"如何能更好地照顾好员工的健康,因为在充满变化的环境中,这直接关系着企业的可持续.健康发展. 6月14日,京东健康举办线上发布 ...

  9. 10 分钟使用 OrchardCore 快速构建 .NET 内容管理系统(CMS)

    前言 今天我们来使用 OrchardCore 来快速构建可配置的 .NET 内容管理系统(CMS). 项目介绍 OrchardCore 是一个开源的(BSD-3-Clause license).模块化 ...

  10. IE 中出现的{description: "拒绝访问。 ", message: "拒绝访问。 ", name: "Error", number: -2147024891, stack: "Error: 拒绝访问...", 问题

    IE真的很神奇,IE11下,本地和di正常,上了生产就会出现这样的问题,还没找到原因,找到了补充. 出现这个问题后,页面卡死,路由跳转失败,点击任何按钮无效但是请求还可以发,头大