当前位置:

首页 > 编程开发 > 如何部署java项目到k8s中

如何部署java项目到k8s中

前言Java项目在开发调试的过程中都需要进行各种环境的安装部署,在之前我们使用虚拟机部署时都是通过在机器上执行命令或者配置Jekins脚本自动化部署。但在容器环境下进行高可用的进行项目的安装部署就需要使用容器化技术跟k8s的调度执行了。一般在正式环境下我们都会有以下几部分构成容器化部署:容器环境dockerContainerdk8s集群k8s管理系统KubeSoheredashboard(k8s自带的管理系统)镜像仓库Dockerhubregistryharbor代码仓库githubgitlab发布平台J

本文目录

      前言

      Java项目在开发调试的过程中都需要进行各种环境的安装部署,在之前我们使用虚拟机部署时都是通过在机器上执行命令或者配置Jekins脚本自动化部署。但在容器环境下进行高可用的进行项目的安装部署就需要使用容器化技术跟k8s的调度执行了。

      一般在正式环境下我们都会有以下几部分构成容器化部署:

      • 容器环境

        • docker

        • Containerd

      • k8s集群

      • k8s管理系统

        • KubeSohere

        • dashboard(k8s自带的管理系统)

      • 镜像仓库

        • Docker hub

        • registry

        • harbor

      • 代码仓库

        • github

        • gitlab

      • 发布平台

        • Jekins

        • Devops

      • 负载

        • F5

        • nginx

        • Ingress

      但是组成这么一整套的资源比较大,不利于个人安装学习。所以本文就介绍在只有k8s集群的环境下部署java项目到容器环境中。

      1. 生成Demo项目

      生成一个java的Demo项目,在本机进行启动测试能访问web页面即可,如下图

      如何部署java项目到k8s中

      目录结构

      如何部署java项目到k8s中

      2. 配置Docker环境

      2.1 编写Dockerfile文件

      在上面的目录结构图里的file文件夹中有一个Dockerfile文件,代码如下

      #基础镜像 java打包需要依赖jdk
      FROM java:8
      #将虚拟机的war包,cp到docker容器内部
      COPY demo-0.0.1-SNAPSHOT.jar demo-0.0.1-SNAPSHOT.jar
      #容器开放的端口
      EXPOSE 8081
      #指定docker容器时区
      RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Beijing' >/etc/timezone
      # 脚本启动
      ENTRYPOINT ["sh","-c","java -server -Dfile.encoding=utf-8 -Xms1024m -Xms1536m -jar -Dserver.port=8081  -Dspring.profiles.active=prod demo-0.0.1-SNAPSHOT.jar"]

      如果项目设置了分环境注意修改ENTRYPOINT 参数里的-Dspring.profiles.active=prod进行修改

      2.2 打包镜像

      配置好Dockerfile文件就需要打包镜像到容器集群中,由于没有镜像仓库所以我们打包需要在所有的容器节点中进行打包,否则在调度过程中如果调度到没有打包镜像的节点则拉取不到镜像就会如下图无法启动完成。

      如何部署java项目到k8s中

      如何部署java项目到k8s中

      将demo项目打好的jar包和Dockerfile文件上传到容器集群的所有节点上,然后执行以下命令:

      docker image build -t an/demo_server:v1.0.0 .

      an/demo_server就是要打包的容器镜像名称,我们下面的配置k8s也是以此名称来找镜像进行调度的。

      使用docker images命令查看是否存在镜像

      如何部署java项目到k8s中

      3. 配置k8s

      3.1 编写deploy.yaml文件

      这个文件是给k8s调度使用的,里面配置了需要调度使用的实例数量、版本、端口号、对外端口号、对外协议等等等等,配置如下

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: demo-server
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: demo-server
        template:
          metadata:
            labels:
              app: demo-server
          spec:
            containers:
              - name: demo-server
                image: an/demo_server:v1.0.0
                ports:
                  - containerPort: 8081
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: demo-server
      spec:
        selector:
          app: demo-server
        ports:
          - protocol: TCP
            port: 8081
            targetPort: 8081
            nodePort: 31001
        type: NodePort

      replicas参数代表了调度的容器数量,目前是1个实例
      nodePort代表了对外映射的端口号,实际访问就是这个端口

      最下面的目录有参数详解,可以参考,这里简单解释一下

      3.2 启动调度

      将文件上传到k8s的master节点上执行以下命令进行调度

      kubectl apply -f deploy.yaml

      4. 验证

      4.1 查看pod

      先执行命令:

      kubectl get all或kubectl get node

      如下图我们的demo-server已经启动了,但是如何访问成了一个问题

      如何部署java项目到k8s中

      4.2 访问系统

      4.2.1 集群外部访问

      集群外部访问没有做负载的情况下需要先看容器分配到了那个节点上,在可视化系统里查看容器组的分配情况

      如何部署java项目到k8s中

      系统里看到k8s将这个系统调度到了node2节点,使用node2节点ip+端口,我们配的对外映射端口为31001,那访问地址就是:http://外部ip:31001,访问如下图则验证成功

      如何部署java项目到k8s中

      4.2.2 集群内部访问

      如果在集群内部访问有两种方式

      通过CLUSTER-IP:port访问
      使用命令kubectl get all可以查看到service的CLUSTER-IP

      如何部署java项目到k8s中

      通过pod Ip:port访问
      使用命令:kubectl get pods得到podname

      如何部署java项目到k8s中

      再使用命令:kubectl describe pod demo-server-8b47bd6b6-8bh6q查看pod详情里的pod IP

      如何部署java项目到k8s中

      5. k8s配置文件参数详解

      apiVersion: v1 # 【必须】版本号
      kind: Pod # 【必选】Pod
      metadata: # 【必选-Object】元数据
      name: String # 【必选】 Pod的名称
      namespace: String # 【必选】 Pod所属的命名空间
      labels: # 【List】 自定义标签列表
      	- name: String
      annotations: # 【List】 自定义注解列表
      	- name: String
      spec: # 【必选-Object】 Pod中容器的详细定义
      containers: # 【必选-List】 Pod中容器的详细定义
      	- name: String # 【必选】 容器的名称
      	image: String # 【必选】 容器的镜像名称
      	imagePullPolicy: [Always | Never | IfNotPresent] # 【String】 每次都尝试重新拉取镜像 | 仅使用本地镜像 | 如果本地有镜像则使用,没有则拉取
      	command: [String] # 【List】 容器的启动命令列表,如果不指定,则使用镜像打包时使用的启动命令
      	args: [String] # 【List】 容器的启动命令参数列表
      	workingDir: String # 容器的工作目录
      	volumeMounts: # 【List】 挂载到容器内部的存储卷配置
      		- name: String # 引用Pod定义的共享存储卷的名称,需使用volumes[]部分定义的共享存储卷名称
      		mountPath: Sting # 存储卷在容器内mount的绝对路径,应少于512个字符
      		readOnly: Boolean # 是否为只读模式,默认为读写模式
      	ports: # 【List】 容器需要暴露的端口号列表
      		- name: String  # 端口的名称
      		containerPort: Int # 容器需要监听的端口号
      		hostPort: Int # 容器所在主机需要监听的端口号,默认与containerPort相同。设置hostPort时,同一台宿主机将无法启动该容器的第二份副本
      		protocol: String # 端口协议,支持TCP和UDP,默认值为TCP
      	env: # 【List】 容器运行前需设置的环境变量列表
      		- name: String # 环境变量的名称
      		value: String # 环境变量的值
      	resources: # 【Object】 资源限制和资源请求的设置
      		limits: # 【Object】 资源限制的设置
      		cpu: String # CPU限制,单位为core数,将用于docker run --cpu-shares参数
      		memory: String # 内存限制,单位可以为MB,GB等,将用于docker run --memory参数
      		requests: # 【Object】 资源限制的设置
      		cpu: String # cpu请求,单位为core数,容器启动的初始可用数量
      		memory: String # 内存请求,单位可以为MB,GB等,容器启动的初始可用数量
      	livenessProbe: # 【Object】 对Pod内各容器健康检查的设置,当探测无响应几次之后,系统将自动重启该容器。可以设置的方法包括:exec、httpGet和tcpSocket。对一个容器只需要设置一种健康检查的方法
      		exec: # 【Object】 对Pod内各容器健康检查的设置,exec方式
      		command: [String] # exec方式需要指定的命令或者脚本
      		httpGet: # 【Object】 对Pod内各容器健康检查的设置,HTTGet方式。需要指定path、port
      		path: String
      		port: Number
      		host: String
      		scheme: String
      		httpHeaders:
      			- name: String
      			value: String
      		tcpSocket: # 【Object】 对Pod内各容器健康检查的设置,tcpSocket方式
      		port: Number
      		initialDelaySeconds: Number # 容器启动完成后首次探测的时间,单位为s
      		timeoutSeconds: Number  # 对容器健康检查的探测等待响应的超时时间设置,单位为s,默认值为1s。若超过该超时时间设置,则将认为该容器不健康,会重启该容器。
      		periodSeconds: Number # 对容器健康检查的定期探测时间设置,单位为s,默认10s探测一次
      		successThreshold: 0
      		failureThreshold: 0
      	securityContext:
      		privileged: Boolean
      restartPolicy: [Always | Never | OnFailure] # Pod的重启策略 一旦终止运行,都将重启 | 终止后kubelet将报告给master,不会重启 | 只有Pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常终止(退出码为0),则不会重启。
      nodeSelector: object # 设置Node的Label,以key:value格式指定,Pod将被调度到具有这些Label的Node上
      imagePullSecrets: # 【Object】 pull镜像时使用的Secret名称,以name:secretkey格式指定
      	- name: String
      hostNetwork: Boolean # 是否使用主机网络模式,默认值为false。设置为true表示容器使用宿主机网络,不再使用docker网桥,该Pod将无法在同一台宿主机上启动第二个副本
      volumes: # 【List】 在该Pod上定义的共享存储卷列表
      	- name: String # 共享存储卷的名称,volume的类型有很多emptyDir,hostPath,secret,nfs,glusterfs,cephfs,configMap
      	emptyDir: {} # 【Object】 类型为emptyDir的存储卷,表示与Pod同生命周期的一个临时目录,其值为一个空对象:emptyDir: {}
      	hostPath: # 【Object】 类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
      		path: String # Pod所在主机的目录,将被用于容器中mount的目录
      	secret: # 【Object】类型为secret的存储卷,表示挂载集群预定义的secret对象到容器内部
      		secretName: String
      		items:
      		- key: String
      			path: String
      	configMap: # 【Object】 类型为configMap的存储卷,表示挂载集群预定义的configMap对象到容器内部
      		name: String
      		items:
      		- key: String
      			path: String
      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 Java
      相关文章 更多
      Java单元测试入门:使用JUnit 5编写第一个测试用例
      Java单元测试入门:使用JUnit 5编写第一个测试用例

      面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

      Java变量未初始化报错解析:局部变量与成员变量默认值差异
      Java变量未初始化报错解析:局部变量与成员变量默认值差异

      深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

      详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

      Java中final与static final常量的定义及初始化规则
      Java中final与static final常量的定义及初始化规则

      深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

      Java抽象方法与接口方法的区别及选型建议
      Java抽象方法与接口方法的区别及选型建议

      深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

      Java实现HTTP请求与JSON解析的完整代码示例
      Java实现HTTP请求与JSON解析的完整代码示例

      本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

      Java递归出现StackOverflowError的原因分析及栈空间优化方案
      Java递归出现StackOverflowError的原因分析及栈空间优化方案

      详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

      Java空指针异常(NPE)的代码排查与修复实例
      Java空指针异常(NPE)的代码排查与修复实例

      针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

      selenium上传文件教程本地文件路径设置方法
      selenium上传文件教程本地文件路径设置方法

      深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

      针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。