(二十四)、在 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 服务

相关推荐
kingbal1 小时前
SpringCloud:Injection of resource dependencies failed
后端·spring·spring cloud
petaexpress4 小时前
5种常见的k8s云原生数据管理方案详解
云原生·kubernetes·k8s云原生
颜淡慕潇5 小时前
【K8S系列】深入解析 Kubernetes 中的 Deployment
后端·云原生·容器·kubernetes
黄俊懿12 小时前
【深入理解SpringCloud微服务】Sentinel功能详解
后端·spring·spring cloud·微服务·中间件·架构·sentinel
不能只会打代码13 小时前
深入讲解Spring Boot和Spring Cloud,外加图书管理系统实战!
spring boot·后端·spring cloud
petaexpress14 小时前
k8s微服务架构就是云原生吗?两者是什么关系
微服务·云原生·架构·kubernetes·k8s
.生产的驴15 小时前
SpringBoot 接口加密SM2非对称加密算法 国密算法 公钥加密 私钥解密
java·spring boot·后端·spring·spring cloud·tomcat·gateway
wenyue11211 天前
Enhancing K8s Gateway API with Easegress Without Changing a Single Line of Code
容器·kubernetes·gateway
@糊糊涂涂1 天前
MAC借助终端上传jar包到云服务器
java·服务器·macos·jar
AskHarries1 天前
Spring Cloud Consul实现选举机制
java·后端·spring cloud·consul