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

文章目录

    • 1、环境陈述
    • 2、前期准备
      • [2.1、将一个 SpringCloud 微服务运行 以 jar 方式运行](#2.1、将一个 SpringCloud 微服务运行 以 jar 方式运行)
      • [2.2、为 SpringCloud 项目生成 Docker 镜像](#2.2、为 SpringCloud 项目生成 Docker 镜像)
      • 2.3、推送镜像
      • [2.4、从宿主机访问 k8s(minikube) 发布的 redis 服务](#2.4、从宿主机访问 k8s(minikube) 发布的 redis 服务)
      • [2.5、k8s(minikube) 部署mysql](#2.5、k8s(minikube) 部署mysql)
    • 3、本期关键
      • [3.1、打 jar 包需要修改的地方](#3.1、打 jar 包需要修改的地方)
      • [3.2、打一个新 jar](#3.2、打一个新 jar)
      • [3.3、为 k8s 生成自定义镜像](#3.3、为 k8s 生成自定义镜像)
        • [3.3.1、把 bestcxx-starter.jar 复制到一个新文件夹内](#3.3.1、把 bestcxx-starter.jar 复制到一个新文件夹内)
        • [3.3.2、定义 Dockerfile 文件的内容](#3.3.2、定义 Dockerfile 文件的内容)
        • [3.3.3、在 k8s 中构造自定义镜像](#3.3.3、在 k8s 中构造自定义镜像)
      • [3.4、在 minukube 中运行自定义镜像](#3.4、在 minukube 中运行自定义镜像)
        • [3.4.1、直接编写 bestcxx-starter-deployment.yaml](#3.4.1、直接编写 bestcxx-starter-deployment.yaml)
        • [3.4.2、运行 bestcxx-starter-deployment.yaml](#3.4.2、运行 bestcxx-starter-deployment.yaml)
        • [3.4.3、访问 k8s 中的服务](#3.4.3、访问 k8s 中的服务)
      • [3.5、在 Kuboard 中查看自定义容器运行状态](#3.5、在 Kuboard 中查看自定义容器运行状态)
      • [3.6、通过隧道端口访问 k8s 中自定义镜像容器的 web 服务](#3.6、通过隧道端口访问 k8s 中自定义镜像容器的 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 服务

相关推荐
Mr.朱鹏4 小时前
针对Feign客户端请求体参数处理问题
java·jvm·spring boot·spring·spring cloud·maven·intellij-idea
Xwzzz_10 小时前
Spring Cloud Gateway中断言路由和过滤器的使用
java·spring cloud·gateway
@明明不知道10 小时前
spring cloud 微服务部署(2025年)第一章:Nacos、LoadBalancer、GateWay、Ribbon集成之Nacos部署
spring cloud·微服务·nacos·gateway·loadbalancer
liulanba13 小时前
八股取士--docker&k8s
docker·容器·kubernetes
袭烽14 小时前
如何下载AndroidStudio的依赖的 jar,arr文件到本地
android·java·jar
桂月二二14 小时前
基于eBPF的云原生网络加速引擎:突破Kubernetes Service转发性能瓶颈
网络·云原生·kubernetes
程序猿零零漆16 小时前
SpringCloud系列教程:微服务的未来(二十四)Direct交换机、Topic交换机、声明队列交换机
spring·spring cloud·微服务·rabbitmq
JabamiLight19 小时前
Lineageos 22.1(Android 15) 编译隐藏API的 android.jar
android·java·framework·jar·android 15·lineageos 22.1
格桑阿sir19 小时前
Kubernetes控制平面组件:Kubernetes如何使用etcd
kubernetes·k8s·etcd·高可用集群·故障分析·etcd集群调优
格桑阿sir19 小时前
Kubernetes控制平面组件:etcd常用配置参数
kubernetes·etcd·配置参数·etcd容量·磁盘耗尽·碎片整理·灾备与安全