k8s-java应用部署(4)

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

image

 

 

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 启动参数中

image

 

 

再来配置我们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 查看服务已经起来了两台

image

 

 

kubectl logs k8s-demo-77bbf688cd-2krwl

  查看任意一台容器日志也一切正常,说明nacos 是正常访问了的了,并且获取到了配置

image

 

 

 

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

image

 

 

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

 

image

 

 

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

image

 

正常访问并获取数据。

 

posted @ 2025-11-03 18:50  白露非霜  阅读(14)  评论(0)    收藏  举报
访问量