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

相关推荐
能不能别报错4 小时前
K8s学习笔记(十六) 探针(Probe)
笔记·学习·kubernetes
能不能别报错6 小时前
K8s学习笔记(十四) DaemonSet
笔记·学习·kubernetes
火星MARK7 小时前
k8s面试题
容器·面试·kubernetes
赵渝强老师9 小时前
【赵渝强老师】Docker容器的资源管理机制
linux·docker·容器·kubernetes
源码集结号9 小时前
一套智慧工地云平台源码,支持监管端、项目管理端,Java+Spring Cloud +UniApp +MySql技术开发
java·mysql·spring cloud·uni-app·源码·智慧工地·成品系统
能不能别报错10 小时前
K8s学习笔记(十五) pause容器与init容器
笔记·学习·kubernetes
稚辉君.MCA_P8_Java10 小时前
kafka解决了什么问题?mmap 和sendfile
java·spring boot·分布式·kafka·kubernetes
一叶飘零_sweeeet11 小时前
从 0 到 1 掌控云原生部署:Java 项目的 Docker 容器化与 K8s 集群实战指南
docker·云原生·kubernetes·项目部署
落日漫游1 天前
Kubernetes容器运行时:cri-docker vs containerd
docker·kubernetes
AAA修煤气灶刘哥1 天前
监控摄像头?不,我们管这个叫优雅的埋点艺术!
java·后端·spring cloud