【云原生 Kubernetes】k8s集群部署springboot项目

news2024/9/22 15:35:54

一、前言

本篇,我们将基于k8s集群,模拟一个比较接近实际业务的使用场景,使用k8s集群部署一个springboot的项目,我们的需求是:

  • 部署SpringBoot项目到阿里云服务器 ;
  • 基于容器打包,推送私有镜像仓库 ;
  • 采用K8S集群部署,对外暴露服务,pod副本扩容,公网可以访问 ;

二、完整的部署过程

  • 基于阿里云服务器搭建基础运行环境,主要包括:JDK1.8,maven3.6.1;
  • 本地代码上传阿里云服务器,通过maven打包,使用docker构建镜像 ;
  • 推送构建好的镜像到阿里云私有镜像仓库 ;
  • K8S集群部署服务,并对外暴露服务可以访问;

三、阿里云服务器安装jdk与maven

本篇的部署业务流程相对比较简单,只需所使用的服务器安装了docker,jdk以及maven即可;

前置准备

提前下载jdk与maven并上传至服务器目录

安装jdk

解压并重命名

tar -zxvf jdk-8u181-linux-x64.tar.gz
mv jdk-8u181-linux-x64 jdk8

配置环境变量,拷贝下面的内容到配置文件中

vi /etc/profile
JAVA_HOME=/usr/local/soft/jdk8
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin

export PATH JAVA_HOME CLASSPATH

使环境变量立刻生效

source /etc/profile

安装maven

安装unzip命令

yum install unzip -y

解压maven包并重命名

unzip apache-maven-3.6.1-bin.zip
mv apache-maven-3.6.1 mvn361

配置环境变量,拷贝下面的内容到配置文件中

MAVEN_HOME=/usr/local/soft/mvn361
PATH=$PATH:$MAVEN_HOME/bin

export PATH JAVA_HOME CLASSPATH MAVEN_HOME

使环境变量立刻生效

source /etc/profile

四、本地准备一个springboot工程

本地使用idea创建一个maven工程,完整的结构如下:

1、添加 pom依赖

     <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>boot-k8s</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

2、添加一个测试接口类

import java.util.HashMap;
import java.util.Map;

@RestController
public class WebController {

    @GetMapping("/api/v1/get")
    public Map<String,Object> getInfo(){
        Map<String,Object> resMap = new HashMap<>();
        resMap.put("info","k8s");
        return resMap;
    }

}

3、创建一个用于服务器构建镜像的Dockerfile文件

FROM openjdk:8

ADD target/boot-k8s.jar boot-k8s.jar

ENTRYPOINT ["java","-jar","/boot-k8s.jar"]

4、将完整的工程代码上传到服务器目录

五、构建镜像

在上面的工程目录下就可以使用相关的命令进行镜像的构建了;

1、项目打包

mvn clean install

第一次打包可能时间有点久,需要下载较多的依赖包,需要耐心等待一会;

2、构建镜像

在当前的Dockerfile所在目录下执行如下命令进行构建

docker build -t boot-k8s:1.0 .

查看镜像,可以看到镜像已经可以看到了;

3、使用该镜像运行容器

docker run -d -it -p 8081:8081 --name=k8s-demo boot-k8s:1.0

通过docker ps命令查看启动的容器

通过浏览器进行访问:http://公网IP:8081/api/v1/get ,能够看到如下的内容,说明该镜像制作完成;

六、镜像推送

镜像制作好之后,接下来需要将镜像推送传到一个镜像仓库,这样k8s才能拉到镜像并使用,

镜像仓库通常可分为公共镜像仓库和私有镜像仓库;

1、公共镜像仓库

  • 官方:Docker,基于各软件开发或者有软件提供商开发的 ;
  • 非官方:其他组织或者公司开发的镜像,供大家免费试用 ;

2、私有镜像仓库

用于存放公司私有的镜像,不对外提供;

常用的私有镜像仓库

Harbor

由VMWare公司开源的容器镜像仓库,Habor是在Docker Registry上进行了相应的企业级扩展

Registry

由docker官方提供的私有镜像仓库

还有一些云厂商提供的私有仓库,比如:阿里云、腾讯云等;

3、阿里云私有镜像仓库配置

接下来我们演示如何使用阿里云镜像仓库完成后续的整个镜像的推送,以及到k8s部署的过程;

开通并配置阿里云镜像仓库

访问地址: 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台,选择个人实例;

设置镜像仓库登录的密码

 此时,镜像仓库为空的;

创建命名空间

个人账户可以最多创建3个命名空间,这个命名空间的概念在很多地方都有,可以类比理解;

基于命名空间创建镜像仓库

 

创建成功后,如上图展示,就可以按照上面的操作步骤往这个镜像仓库推送镜像了;

 4、镜像推送至阿里云镜像仓库

登录镜像仓库

docker login --username=你的账号 registry.cn-hangzhou.aliyuncs.com

镜像打tag

ImageId就是上面对项目jar包构建镜像后的那个

docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/boot-k8s/k8s-demo:[镜像版本号]
docker tag 8c7f232ab5f4 registry.cn-hangzhou.aliyuncs.com/boot-k8s/k8s-demo:1.0

push镜像

这个过程耗时可能有点长,需要耐心等待;

docker push registry.cn-hangzhou.aliyuncs.com/boot-k8s/k8s-demo:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/boot-k8s/k8s-demo:1.0

推送完毕之后,在控制台的镜像仓库就能看到刚刚推送上来的镜像了;

七、使用k8s部署镜像

上面所在的一切工作可以说是一个准备过程,接下来进入到最后一个环节,使用k8s来部署应用;

完整的操作步骤

  • 登录私有镜像仓,拉取镜像 ;
  • 创建deployment ;
  • 暴露服务访问端口;
  • 外网访问服务接口;

前置准备

在使用k8s部署应用时,其实也是在模拟从登录镜像仓库,拉取镜像,然后启动的完整的过程,所以这里首先需要解决登录的问题;

在之前的文章中,我们降到了在k8s中有一种存储类型叫做secret,正好就可以使用这个;

创建secret

kubectl create secret docker-registry congge-docker-secret --docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=zhangcongyi420 --docker-password=你的登录密码

创建k8s-demo-deployment 的yaml文件

使用下面的命令生成一个模板配置yaml文件

kubectl create deployment k8s-demo --image=registry.cn-hangzhou.aliyuncs.com/boot-k8s/k8s-demo:1.0 --dry-run=client -o yaml > congge-k8s.yaml

生成后的yaml文件内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: k8s-demo
  name: k8s-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: k8s-demo
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: k8s-demo
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/boot-k8s/k8s-demo:1.0
        name: k8s-demo
        resources: {}
status: {}

修改此yaml文件,将上面创建的secret也配置进去,就是补充下面这地方;

创建deployment

kubectl apply -f congge-k8s.yaml

 创建NodePort类型的service

kubectl expose deploy k8s-demo --port=8081 --target-port=8081 --type=NodePort

 通过service将端口暴露出去之后,我们就可以通过外网访问API接口了,如果是阿里云服务器,请开发网络安全组端口,看到如下效果,说明就成功了;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Presto 之 BTreeIndex 索引代码走读

一. 前言 本文主要介绍在Presto&#xff08;OpenLookeng&#xff09;中的BTree索引的代码实现。关于BTree索引原理的介绍可以参考官网资料openLooKeng documentation。 二. BTreeIndex 索引建立 在Presto中&#xff0c;BTreeIndex 索引是通过mapdb中的BTreeMap数据结构实现的&a…

【java入门系列一】java基础

学习记录&#x1f914;写在前面JDK\JREPython有没有虚拟机&#xff1f;第一个code规范学习方法转义符号注释讨论总结谢谢点赞交流&#xff01;(❁◡❁)更多代码&#xff1a; Gitee主页&#xff1a;https://gitee.com/GZHzzz博客主页&#xff1a; CSDN&#xff1a;https://blog.…

13---SpringBoot整合JWT,实现登录和拦截

1、 JWT简介 什么是JWT&#xff1f; JWT(JSON Web Token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。它将用户信息加密到token里&#xff0c;服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性&#xff0c;只要正确即通过验证&…

在Ubuntu上安装Azure DevOps代理程序

Contents1 概述2. 安装Ubuntu 18.04操作系统3. 安装Azure DevOps Server 代理3.1 安装Azure DevOps Server 代理3.2 以服务方式运行代理1. 概述Ubuntu是一个以桌面应用为主的Linux操作系统&#xff0c;目前在不适用微软Windows的企业中&#xff0c;ubuntu被广泛应用在个人电脑中…

网络原理4 数据链路层

文章目录mac地址网络原理的总结在数据链路层中&#xff0c;最主要的就是以太网协议这里的目的IP和原地址都是mac地址 mac地址 首先要知道什么是Mac地址&#xff0c;mac地址也叫做物理地址或以太网地址&#xff0c;它是一个用来确认网络设备位置的位置&#xff0c;一个网卡就会…

javaWeb——第一章概述

目录 1.1 软件的分类 1.2 软件架构 1.3 web软件 1.4 web程序 web服务器&#xff1a; Tomcat: 扩展 Java web就是窗口和程序之间的交互&#xff1a; 1.1 软件的分类 系统软件 应用软件 介于两者之间的中间件&#xff08;插件&#xff09; 1.2 软件架构 B/S 服务器与浏…

ZC706P+ADRV9009连接RADIOVERSE详解之三

做好SD卡映像&#xff0c;连接好硬件之后&#xff0c;我们就可以尝试软件操作了。 步骤1&#xff1a;设置好网络 打开软件界面我们看到&#xff0c;板子默认的地址为192.168.1.10 端口号为55555.我们一定也设置跟板子连接的以太网口处于192.168.1网段&#xff0c;并且子网掩码…

【ESP32+freeRTOS学习笔记-(四)任务调度机制】

目录1 、什么是任务的调度机制1.1 概念1.2 三种算法1.3 决定算法的宏2、基本词条解释3、调度算法解释3.1 具有时间片的优先级抢先调度 Prioritized Pre-emptive Scheduling with Time Slicing3.1.1 图解高优先级任务抢占低优先级任务3.1.2 图解具有时间片的优先级抢占3.1.3 总结…

如何通过少量样本推断整体业务情况

在产品运营中非常常见&#xff0c;为了能够解决大量数据时分析效率急剧下降的窘况&#xff0c;我们就必须能够去分析非常小量样本的特征&#xff0c;再用这些特征去评估海量总体数据的特征&#xff0c;我们叫它样本检验。 样本&#xff0c;是指我们需要“分析或考察的数据”的…

MAC(m1)-安装Redis6.2.8

Redis官网&#xff1a;Download | Redis 我准备下载7以前的版本 下载放到如下位置 在这个目录打开终端&#xff1a; 编译测试&#xff0c;执行命令&#xff1a;sudo make test 等待了好久&#xff0c;估计好几分钟 最后出现&#xff1a; 下面准备安装redis&#xff0c;编译安…

计算机网络的定义和性能指标

目录计算机网络的定义计算机网络的分类计算机网络的性能指标速率带宽吞吐量时延时延带宽积往返时间利用率丢包率计算机网络的定义 计算机网络的精确定义并未统一&#xff1b;计算机网络的最简单的定义是&#xff1a;一些互相连接的、自治的计算机的集合&#xff1b; 互连&…

Kubernetes组件_Scheduler_02_二次调度

文章目录一、前言二、二次调度/运行期间调度Descheduler2.1 机器上安装helm2.2 每个机器都要准备好镜像2.3 使用helm部署三、Descheduler需要注意的点(相关理论知识)3.1 descheduler 调度策略3.2 descheduler 有哪些不足3.2.1 基于 Request 计算节点负载并不能反映真实情况3.2.…

【Lua】xLua逻辑热更新

1 前言 Lua基础语法 中系统介绍了 Lua 的语法体系&#xff0c;ToLua逻辑热更新 中介绍了 ToLua 的应用&#xff0c;本文将进一步介绍 Unity3D 中基于 xLua 实现逻辑热更新。 逻辑热更新是指&#xff1a;在保持程序正常运行的情况下&#xff0c;在后台修改代码逻辑&#xff0c;修…

子查询+「EXISTS」 以及 组合查询UNION ALL

目录方便的子查询及EXISTS使用子查询作为计算手段使用子查询过滤数据&#xff08;IN&#xff09;使用子查询过滤数据&#xff08;EXISTS&#xff09;组合查询UNION ALL如何使用UNION ALL合并多个结果集如何使用UNION去除集合的重复记录如何合并2个以上的结果集&#xff1f;方便…

Hudi(6):Hudi集成Spark之spark-shell 方式

目录 0. 相关文章链接 1. 启动 spark-shell 2. 插入数据 3. 查询数据 3.1. 转换成DF 3.2. 查询 3.3. 时间旅行查询 4. 更新数据 5. 增量查询 5.1. 重新加载数据 5.2. 获取指定beginTime 5.3. 创建增量查询的表 5.4. 查询增量表 6. 指定时间点查询 7. 删除数据 …

Python学习基础笔记六十二——反射2

1、 isinstanace(obj, cls) # 检查是否obj是否是类cls的对象&#xff1a; class Foo(object):passobj Foo()print(isinstance(obj, Foo)) 结果返回&#xff1a;True。 issubclass(sub, super) # 检查sub类是否是 super 类的派生类 class Foo(object):passclass Bar(F…

python详解(5)——类,类,还是类

目录 &#x1f3c6;一、前言 &#x1f3c6;二、类 &#x1f6a9;1、面向对象到底是什么 &#x1f6a9;2、数据成员and访问&#xff0c;汉堡店大升级&#xff08;超难&#xff09; &#x1f44d;①、类变量&#xff08;超难&#xff09; &#x1f44d;②、实例变量 &#x1f6a9…

A Latent Transformer for Disentangled Face Editing in Images and Videos翻译

点击下载论文 代码地址 图1 我们将真实图像投影到StyleGAN生成器的潜空间&#xff0c;并在编码的潜码上实现连续的解纠缠属性编辑。从原始图像和投影图像中&#xff0c;我们可以连续编辑一系列属性&#xff0c;例如&#xff1a;“微笑”、“刘海”、“拱形眉毛”、“年龄”、…

分布式对象存储设计原理

保存像图片、音视频这类大文件就是对象存储。不仅有很好的大文件读写性能&#xff0c;还可通过水平扩展实现近乎无限容量&#xff0c;并兼顾服务高可用、数据高可靠。 对象存储“全能”&#xff0c;主要因&#xff0c;对象存储是原生分布式存储系统&#xff0c;相对于MySQL、R…

[Linux]yum安装工具和vim编辑器

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【LINUX】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文…