(二十四)、在 k8s 中部署自己的 jar 镜像(以 springcloud web 项目为例)

1、环境陈述

docker 驱动部署 minikube ,为单节点 k8s。
在 k8s 中已经部署了 mysql 和 redis. mysql 已完成数据结构初始化。
具体服务的 mysql-service 和 redis-service

➜  ~ kubectl get svc
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP          3d4h
mysql-service   NodePort    10.102.114.64   <none>        3306:30002/TCP   2d23h
redis-service   NodePort    10.108.203.83   <none>        6379:30001/TCP   3d4h

2、前期准备

2.1、将一个 SpringCloud 微服务运行 以 jar 方式运行

将一个 SpringCloud 微服务运行 以 jar 方式运行

2.2、为 SpringCloud 项目生成 Docker 镜像

为 SpringCloud 项目生成 Docker 镜像

2.3、推送镜像

把自己的镜像推送到 DockerHub

把镜像推送到私有化 Docker 仓库

2.4、从宿主机访问 k8s(minikube) 发布的 redis 服务

从宿主机访问 k8s(minikube) 发布的 redis 服务

2.5、k8s(minikube) 部署mysql

k8s(minikube) 部署mysql

3、本期关键

本期的关键在于:
第一、在把 springcloud 项目的 jar 打包为镜像时,需要通过 k8s 中服务的依赖名称进行 mysql 和 redis 的访问。
第二、如何把本地的 镜像 直接推送到 k8s 中,这样的好处是节约一些流量——当然,我们也可以推送到远程仓库去,然后像依赖普通镜像一样去运行。

3.1、打 jar 包需要修改的地方

为 SpringCloud 提供一个新的配置文件
通过这个配置文件,对应镜像将通过服务名去获取 redis 和 mysql 服务

➜  ~ kubectl get svc
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP          3d5h
mysql-service   NodePort    10.102.114.64   <none>        3306:30002/TCP   3d
redis-service   NodePort    10.108.203.83   <none>        6379:30001/TCP   3d5h

只需要把之前 ip:端口修改为 k8s服务名:k8s内部端口
具体来说就是

  • 对mysql依赖 中 127.0.0.1:3306=>mysql-service:3306
#url: jdbc:mysql://k8s 中 mysql service name:对应 port/test?characterEncoding=utf8&useSSL=true&serverTimezone=UTC&rewriteBatchedStatements=true
    url: jdbc:mysql://mysql-service:3306/test?characterEncoding=utf8&useSSL=true&serverTimezone=UTC&rewriteBatchedStatements=true
    
  • 对 redis 依赖中,host 由 127.0.0.1=> redis-service
host: redis-service # k8s 中 redis service name
    port: 6379 # k8s 中 redis service port

3.2、打一个新 jar

我们在新配置文件中修改 3.1 中的内容,起名为 application-k8s.yml
在这里插入图片描述

获取到 bestcxx-starter.jar
在这里插入图片描述

  • 另外一种方式也可以试试,是在 k8s 加载 jar 时,添加 spring 运行时参数
apiVersion: apps/v1
kind: Deployment
metadata:
  name: your-deployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: your-app
    spec:
      containers:
        - name: your-container
          image: your-image:latest
          env:
            - name: SPRING_PROFILES_ACTIVE
              value: "k8s"

3.3、为 k8s 生成自定义镜像

3.3.1、把 bestcxx-starter.jar 复制到一个新文件夹内

Dockerfile 和 bestcxx-starter-deployment.yaml 文件内容下面介绍

在这里插入图片描述

3.3.2、定义 Dockerfile 文件的内容

以openjdk 镜像为基础,生成新的自定义镜像

# 使用官方的Java运行时作为父镜像
FROM openjdk:8-jre-alpine

# 将当前目录下的可执行jar包复制到容器中的/app目录下
ADD bestcxx-starter.jar /app/bestcxx-starter.jar

# 声明容器运行时需要开放的端口
EXPOSE 8080

# 设置容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "/app/bestcxx-starter.jar"]
3.3.3、在 k8s 中构造自定义镜像

可能因为网络问题失败,因此提前运行 docker pull openjdk:8-jre-alpine ,一次即可
这里 eval $(minikube docker-env) 首次可能会失败,docker context ls 结果有 default报错后继续执行一次即可,

  • 在文件夹目录下打开命令行,依次执行命令即可
➜  bestcxx-k8s docker context ls                                  
NAME                TYPE                DESCRIPTION                               DOCKER ENDPOINT                               KUBERNETES ENDPOINT                 ORCHESTRATOR
default *           moby                Current DOCKER_HOST based configuration   tcp://127.0.0.1:53255                         https://127.0.0.1:53258 (default)   swarm
desktop-linux       moby                                                          unix:///Users/wujie/.docker/run/docker.sock                                       
➜  bestcxx-k8s eval $(minikube docker-env)                        
➜  bestcxx-k8s docker pull openjdk:8-jre-alpine    
➜  bestcxx-k8s docker build -t bestcxx-starter-k8s:0.0.5 .  
  • 然后查看本地镜像
➜  bestcxx-k8s docker images
REPOSITORY                                        TAG            IMAGE ID       CREATED             SIZE
bestcxx-starter-k8s                               0.0.5          1b869a695cae   6 minutes ago       129MB
··· 其余略

3.4、在 minukube 中运行自定义镜像

3.4.1、直接编写 bestcxx-starter-deployment.yaml

自定义镜像为 web 服务,内部定义的server port 为 8080
直接引用上面生成的镜像 bestcxx-starter-k8s:0.0.5

apiVersion: apps/v1
kind: Deployment
metadata:
  name: bestcxx-starter-deployment
  labels:
    app: bestcxx-starter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bestcxx-starter
  template:
    metadata:
      labels:
        app: bestcxx-starter
    spec:
      containers:
      - name: bestcxx-starter
        image: bestcxx-starter-k8s:0.0.5 # 这里更新具体 tag 版本号
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: bestcxx-starter-service
spec:
  type: NodePort
  selector:
    app: bestcxx-starter
  ports:
    - port: 8080       # 服务端口
      targetPort: 8080 # 目标容器端口
      nodePort: 30003  # 宿主机端口(可选)
3.4.2、运行 bestcxx-starter-deployment.yaml
➜  bestcxx-k8s kubectl apply -f bestcxx-starter-deployment.yaml
deployment.apps/bestcxx-starter-deployment created
service/bestcxx-starter-service created
3.4.3、访问 k8s 中的服务

因为我们是通过 docker 部署 minikube,因此,需要开启隧道端口访问 NodePort 服务

  • 查看服务,可以看到 bestcxx-starter-service 已经启动
➜  bestcxx-k8s kubectl get svc                                            
NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
bestcxx-starter-service   NodePort    10.99.247.239   <none>        8080:30003/TCP   8s
kubernetes                ClusterIP   10.96.0.1       <none>        443/TCP          3d6h
mysql-service             NodePort    10.102.114.64   <none>        3306:30002/TCP   3d
redis-service             NodePort    10.108.203.83   <none>        6379:30001/TCP   3d6h
  • 在 k8s 中构造本地镜像

  • 为 bestcxx-starter-service 开启隧道端口

minikube service bestcxx-starter-service

3.5、在 Kuboard 中查看自定义容器运行状态

可以用于查看容器运行的日志信息

在这里插入图片描述
在这里插入图片描述

3.6、通过隧道端口访问 k8s 中自定义镜像容器的 web 服务

在这里插入图片描述

<think>嗯,用户这次询问的是Spring Cloud项目在生产环境的启动方式,需要明确区分开发和生产环境的不同实践。从用户的问题历史看,ta似乎正在学习或部署微服务架构,之前关注过数据源配置和模块启动顺序。 用户引用的资料显示ta已经了解Spring Boot的独立运行特性(引用2和3),但可能对生产部署的具体形式存在疑惑。这里的关键点在于:Spring Cloud项目本质是基于Spring Boot的,而Spring Boot应用默认打包为可执行jar,内嵌了Tomcat/Jetty等Web容器。 需要向用户强调几个要点:第一,生产环境不可能用IDEA启动,必须打包;第二,传统war包部署到外部Tomcat虽然可行但不推荐;第三,容器化部署已成为主流方案。用户提到的JBoss/Tomcat更多是传统JavaEE项目部署方式,而Spring Cloud采用更轻量的方式。 用户可能忽略了云原生部署的趋势,所以在回答中补充了Docker和Kubernetes方案。另外注意到用户团队似乎在使用Eureka(引用4中的@EnableDiscoveryClient),这进一步佐证了容器化部署的适用性。 考虑到用户的技术水平,解释时避免过多术语,但需要明确给出每种方案的适用场景。比如中小型项目jar直接运行足够,大型集群则需要Kubernetes编排。安全方面也要提醒暴露端口的风险控制。 </think>Spring Cloud 项目在生产环境的启动方式**通常不使用 IDE(如 IDEA)直接启动,也不推荐部署到传统应用服务器(Tomcat/JBoss)**,而是采用以下主流方案: --- ### ✅ 标准生产级启动方案 1. **可执行 JAR 包启动(主流方案)** - Spring Boot 应用默认打包为**独立可执行 JAR**(内嵌 Tomcat/Jetty 等 Web 服务器)[^2][^3] - **启动命令**: ```bash java -jar your-service-name.jar ``` - **优势**: - 无需额外安装 Tomcat/JBoss - 支持 DevOps 自动化部署(Jenkins/K8s) - 资源占用更低,启动更快 2. **容器化部署(推荐云环境)** - 构建 Docker 镜像 + Kubernetes 编排(生产级标准)[^3] - **Dockerfile 示**: ```dockerfile FROM openjdk:17 COPY target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"] ``` - **启动逻辑**: ```mermaid graph LR A[源代码] --> B[构建JAR] B --> C[打包Docker镜像] C --> D[推送到镜像仓库] D --> E[K8s集群部署] ``` --- ### ⚠传统应用服务器部署(已逐渐淘汰) 若特殊场景需部署到 Tomcat/JBoss: 1. **修改打包方式为 WAR**: ```xml <!-- pom.xml --> <packaging>war</packaging> ``` 2. **排除内嵌 Tomcat**: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> ``` 3. **继承 `SpringBootServletInitializer`**: ```java @SpringBootApplication public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(...) { return builder.sources(Application.class); } } ``` > 💡 **注意事项**: - 需手动配置应用服务器的连接池/线程池 - 服务注册(如 Eureka)需额外处理端口映射[^1][^4] --- ### 📊 生产环境部署决策树 ```mermaid graph TD A[生产部署方式] --> B{是否需要混合部署传统JavaEE应用?} B -->|是| C[WAR包部署到Tomcat/JBoss] B -->|否| D{是否在云环境?} D -->|是| E[容器化部署] D -->|否| F[直接运行可执行JAR] ``` --- ### 📌 关键结论 1. **IDE 启动仅限开发**:IDEA 启动是调试行为,禁止用于生产 2. **嵌入式容器是首选**:≥85% 的 Spring Cloud 项目采用 `java -jar` 方式[^3] 3. **云原生趋势**:容器化部署(Docker+K8s)已成行业标准方案 > 生产环境务必通过 **CI/CD 流水线**自动构建部署(如 Jenkins/GitLab CI),避免手动操作。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值