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

相关推荐
kennygu44 分钟前
jenkins项目发布-安装k8s(rancher)客户端kubectl
kubernetes·jenkins·rancher
会游泳的石头3 小时前
OpenFeign 的实现原理详解
spring cloud
菜鸟起航ing3 小时前
【Java面试系列】Spring Cloud微服务架构中的分布式事务实现与性能优化详解 - 3-5年Java开发必备知识
java·spring cloud·微服务·面试·分布式事务
汤姆大聪明6 小时前
微服务与Spring Cloud Alibaba简介
java·spring boot·spring·spring cloud·微服务
被一米六支配的恐惧6 小时前
k8s部署grafana
容器·kubernetes·grafana
汤姆大聪明8 小时前
Nacos服务发现和配置管理
java·spring boot·spring cloud·服务发现
小萌新上大分8 小时前
nginx入门,部署静态资源,反向代理,负载均衡使用
nginx·spring cloud·nginx配置·nginx部署前端项目·nginx负载均衡策略·nginx反向代理配置
在荒野的梦想15 小时前
若依微服务集成Flowable仿钉钉工作流
spring cloud·微服务·钉钉
胡八一20 小时前
Kubernetes 节点磁盘空间空了怎么办?解决 containerd overlay 100%问题
云原生·容器·kubernetes
云计算运维丁丁20 小时前
k8s 1.30.6版本部署(使用canal插件)
云原生·容器·kubernetes