首页 归档 关于 learn love 工具

从零开始在linux k8s部署spring项目

环境准备

  1. 用k3s搭建k8s环境
  2. 安装Docker环境,主要是用于打包项目成容器镜像(image)
  3. 在centos安装Java环境,包括maven,主要是打包spring项目,参考
    2.1. Java环境安装命令 sudo yum install java-17-openjdk java-17-openjdk-devel
    2.2. [java-17-openjdk] 是jre ,[java-17-openjdk-devel] 是编译工具,javac
    2.3. maven 建议下载二进制包,解压,然后配置环境变量进行安装,不要用 yum install 的方式,因为这种方式会把额外安装 jre 版本,容易造成和项目java版本冲突
  4. spring 项目代码,参考
  5. 安装docker私有仓库,后续需要把打包好的docker镜像上传到仓库后,再部署到k8s集群,使用命令docker run -d -p 5000:5000 --restart=always --name registry registry 进行安装参考

项目打包

通过拉取代码,用maven打包成jar,命令如下

$ git clone https://github.com/mkyong/spring-boot.git
$ cd spring-boot-hello-world
$ mvn spring-boot:run

将jar,打包成docker镜像,创建一个名为Dockerfile的文本文件,内容如下

from openjdk:17.0.2-jdk
copy target/spring-boot-hello-world-1.0.jar /spring-boot-hello-world-1.0.jar
CMD ["java", "-jar", "/spring-boot-hello-world-1.0.jar"]

然后再运行下面命令打包

docker build -t my-java-app .

查看生成的image镜像

docker image ls

运行docker容器,并测试外网访问

# 81是主机端口,外网访问,8080是容器端口,spring 项目监听的端口
docker run -p 81:8080 -it --rm --name my-running-app my-java-app 

将镜像推送到私有仓库

docker push my-java-app

部署到k8s

构建k8s最小管理单元pod,创建名为my-java-app.yaml,内容如下

apiVersion: v1
kind: Pod
metadata:
  name: spring-java-name
  # 指定 label,便于检索 ,这里要记住,后面配置外网访问service的时候需要用到
  labels:
    app: spring-java-lable
spec:
  containers:
  - name: spring-java-container
    # 指定镜像
    image: my-java-app:latest
    #imagePullPolicy: Never
    # 指定暴露端口
    ports:
     # 这里只是个用于标识,和容器内应用监听的端口要一致,如果不一致,以容器实际端口为准
    - containerPort: 8080

运行kubectl apply -f my-java-app.yaml命令进行打包,然后运行kubectl get pods查看打包后的pod状态

创建NodePort类型 service ,将应用暴露出来供外网访问,创建一个名为java-service.yaml的文本文件,内容如下

apiVersion: v1
kind: Service
metadata:
  name: my-java-nodeport-service
spec:
  type: NodePort
  ports:
    - port: 8001 # Service 公开的端口,内部访问
      targetPort: 8080 # Pod 中容器的端口
      nodePort: 30001 # NodePort,需要在 30000-32767 范围内选择,外部访问
  selector:
    app: spring-java-lable # 用于选择匹配的 Pod,基于pod label,而不是pod name

运行 kubectl apply -f java-service.yaml 命令,启动service服务,然后运行kubectl get svc 命令查看所有service,会看到一个TYPE 为 NodePort 的service

在k8s服务器上访问CLUSTER-IP:PORT , 如curl 10.43.90.53:8001 或者在外网访问外放ip和端口,如curl 外网ip:30001 即可测试服务访问性