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

文章目录

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/902459.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Anchor DETR:Transformer-Based目标检测的Query设计

写在前面 文中指出之前DETR-like算法存在以下问题&#xff1a; 之前DETR-liked检测算法里&#xff0c;object query是一组可学习的嵌入表示&#xff08;就是一组256-d的向量&#xff09;&#xff0c;缺乏明确的物理意义&#xff0c;不能解释它们会关注什么地方。每个object q…

禾川SV-X2E A伺服驱动器参数设置——脉冲型

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff01;人工智能学习网站 前言&#xff1a; 大家好&#xff0c;我是上位机马工&#xff0c;硕士毕业4年年入40万&#xff0c;目前在一家自动化公司担任…

PHPOK 4.8.338 后台任意文件上传漏洞(CVE-2018-12941)复现

PHPOK企业站(简称PHPOK&#xff09;建设系统是一套基于PHP和MySQL构建的高效企业网站建设方案之一&#xff0c;全面针对企业网&#xff08;以展示为中心&#xff09;进行合理的设计规划。 PHPOK是一套开源免费的建站系统&#xff0c;可以在遵守LGPL协议的基础上免费使用。系统具…

浅析正交投影矩阵和透视投影矩阵的推导

先上矩阵的内容。在opengl中&#xff0c;分别通过glOrtho函数和glFrustum函数得到正交投影矩阵和透视投影矩阵。 glOrtho 函数描述生成正交投影矩阵。 (左、 下、 近) 和 (右、 上、 近) 参数分别指定近剪裁平面上映射到窗口左下角和右上角的点&#xff0c;假定眼睛位于 (0、0…

Vue104 vue3 组合式API的优势 对比配置式API

笔记 1.Options API 存在的问题 使用传统OptionsAPI中&#xff0c;新增或者修改一个需求&#xff0c;就需要分别在data&#xff0c;methods&#xff0c;computed里修改 。 2.Composition API 的优势 我们可以更加优雅的组织我们的代码&#xff0c;函数。让相关功能的代码更…

三方接口调用设计方案

在为第三方系统提供接口的时候&#xff0c;肯定要考虑接口数据的安全问题&#xff0c;比如数据是否被篡改&#xff0c;数据是否已经过时&#xff0c;数据是否可以重复提交等问题 在设计三方接口调用的方案时&#xff0c;需要考虑到安全性和可用性。以下是一种设计方案的概述&am…

Jenkins + GitLab + Docker实现自动化部署(Java项目)

部署Jenkins 因为Jenkins需要用到git、jdk、maven&#xff0c;后两者我们采取挂载的方式&#xff0c;git采用直接在容器中安装的方式&#xff0c;所以我们要做一个增强版的Jenkins镜像&#xff0c;编写Dockerfile文件 #使用jenkins 镜像作为基础镜像 FROM jenkins/jenkins:lt…

Spring Boot框架下租房管理系统的设计与实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

springboot098基于web的网上摄影工作室的开发与实现(论文+源码)_kaic

网上摄影工作室 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了网上摄影工作室的开发全过程。通过分析网上摄影工作室管理的不足&#xff0c;创建了一个计算机管理网上摄影工作室的方案。文章介绍了网上摄影工…

Kubernetes实战——DevOps集成SpringBoot项目

目录 一、安装Gitlab 1、安装并配置Gitlab 1.1 、下载安装包 1.2、安装 1.3、修改配置文件 1.4、更新配置并重启 2、配置 2.1、修改密码 2.2、禁用注册功能 2.3、取消头像 2.4、修改中文配置 2.5、配置 webhook 3、卸载 二、安装镜像私服Harbor 1、下载安装包 2、…

UE5之5.4 第一人称示例代码阅读1 FirstPersonProjectile

既然如此&#xff0c;这几个文件都看看 先看看FirstPersonProjectile头文件 定义了几个函数 然后是两个component 这个projectilemovement应该是控制物理运动的 看看CPP文件 sphere那个就创建了一个subobject&#xff0c;初始化了一下&#xff0c;然后这里 CollisionComp-&g…

Maven 项目构建打包,如何引入本地 Jar 包?

上一篇讲到 Maven 离线仓库的使用&#xff0c;反响不错很多人收藏&#xff0c;这一篇还是继续聊 Maven 。假如你发现某开源项目有个 bug 影响到自己的系统&#xff0c;但官方还没修复&#xff0c;自己定位到了本地修改打了包先应急用&#xff0c;那么如何在其他项目上使用该包&…

985研一,转嵌入式好还是后端开发好?

有个老铁问&#xff0c;985研一&#xff0c;转嵌入式好还是后端开发好&#xff1f; 我认为&#xff0c;这学历&#xff0c;两个随便挑&#xff0c;我说的&#xff0c;从趋势来看&#xff0c;更建议嵌入式&#xff0c;走供应链上游&#xff0c;芯片原厂、新能源车企、军工或者搞…

Python画图|极坐标下的柱状图输出

【1】引言 前序学习了极坐标下的散点图输出&#xff0c;可通过下述链接直达&#xff1a; 西猫雷婶-CSDN博客 受此启发&#xff0c;我们继续自主探索极坐标下的柱状图输出。 【2】代码探索 其实柱状图和散点图画图的主要区别&#xff0c;可以理解为调用函数不同。 柱状图调…

Golang | Leetcode Golang题解之第515题在每个树行中找最大值

题目&#xff1a; 题解&#xff1a; func largestValues(root *TreeNode) (ans []int) {if root nil {return}q : []*TreeNode{root}for len(q) > 0 {maxVal : math.MinInt32tmp : qq nilfor _, node : range tmp {maxVal max(maxVal, node.Val)if node.Left ! nil {q …

stm32单片机个人学习笔记12(DMA直接存储器存取)

前言 本篇文章属于stm32单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 STM32入门教程-2023版 细…

若依学习 后端传过来的数据在控制台打印为空

导言: 在做若依二次开发时遇到个没见过的bug&#xff0c;用了一些时间排&#xff0c;发现有自己没学过的东西。所以记录一下。后端用的是c#的asp.net core 问题描述&#xff1a; 后端穿过来的有数据的参数(数组)roleIds在控制台打印为空 后端字段定义: 后端数据&#xff1a; 前…

【热门主题】000010 深入 Vue.js 组件开发

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…

初见Linux:权限篇

一.权限的定义&#xff1a; 什么是权限?所谓权限在现实中就是权力限制&#xff0c;是对于人&#xff0c;不同人所扮演的角色有着不同的权限。那么在Linux中也存在权限。权限角色事物属性。那么对于一件事情能否去执行以及完成都需要权限。 二.Linux中的用户 2.1&#xff1a;r…

【SpringMVC】web服务器,访问失败的问题,SpringMVC,建立连接,请求

【web服务器】 web服务器可以对http协议进行封装&#xff0c;程序员不需要直接对http协议进行操作&#xff08;不需要去写复杂的网络编程代码&#xff09;&#xff0c;让web开发更加便捷&#xff0c;所以它也有「WWW服务器」的称呼 常见的web服务器:Tomcat&#xff0c;Jboss&…