SpringBoot项目通过k8s集群发布与管理
笔者这里有个非常简单的Springboot项目(boonya-game-lab),如果要把他发布到k8s集群应该怎么做呢?使用Docker的都知道镜像,k8s按照自己的配置设置好镜像和副本数量就可以实现了。
现在我们分三步来管理我们的k8s服务。即:构建镜像、推送镜像、发布k8s集群服务。
如果能够科学上网,Windows就可以使用Docker Desktop 快速安排k8s环境。
构建镜像
需要编写Dockerfile来构建本地镜像
# 选择一个轻量级的Java基础镜像
FROM openjdk:17.0.1-jdk-slim
# 使用 RUN 命令创建目录
RUN mkdir -p /app
# 将打包好的jar包复制到镜像中,并重命名(方便引用)
COPY target/boonya-game-lab-0.0.1-SNAPSHOT.jar /app/app.jar
# 切换工作目录/app
WORKDIR /app
# 声明容器运行时暴露的端口(与你的SpringBoot应用端口一致)
EXPOSE 8080
# 设置容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "app.jar"]
镜像构建完了之后还要做容器服务的启动校验:
docker run --name boonya-game-lab -p 8080:8080 docker.io/boonyadocker/boonya-game-lab:latest
启动成功访问首页:
推送镜像
推送镜像需要登录对应的Docker 仓库。
登录命令:
docker login docker.io
推送命令:
docker push docker.io/boonyadocker/boonya-game-lab:latest
验证仓库镜像:
也可以在Docker Desktop上看:
K8s部署脚本
编写deployment.yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:name: boonya-game-lab
spec:replicas: 3 # 希望运行的Pod副本数selector:matchLabels:app: boonya-game-labtemplate:metadata:labels:app: boonya-game-labspec:containers:- name: boonya-game-labimage: docker.io/boonyadocker/boonya-game-lab:latest # 替换为你的镜像地址ports:- containerPort: 8080 # 容器端口env: # 可选:设置环境变量- name: JAVA_OPTSvalue: "-Xmx512m"# 可以添加资源限制和健康检查resources:requests:memory: "512Mi"cpu: "250m"limits:memory: "1Gi"cpu: "500m"livenessProbe:httpGet:path: /actuator/health # 假设使用Spring Actuator的健康检查端点port: 8080initialDelaySeconds: 90 # 容器启动后多久开始探测periodSeconds: 10 # 执行探测的频率readinessProbe:httpGet:path: /actuator/healthport: 8080initialDelaySeconds: 30periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:name: boonya-game-lab-service
spec:selector:app: boonya-game-labports:- protocol: TCPport: 80 # Service端口targetPort: 8080 # 容器端口# type: ClusterIP # 默认类型,集群内访问type: LoadBalancer # 如果希望从集群外部访问,可以使用LoadBalancer(云提供商通常支持)或NodePort
发布集群:
kubectl apply -f deployment.yaml
删除集群:
kubectl delete -f deployment.yaml
部署完成的效果:
集群访问方式
获取浏览器访问IP地址方式
kubectl get svc boonya-game-lab-service
或
kubectl get svc boonya-game-lab-service -w
-
在浏览器中访问:
打开浏览器,直接访问第 3 步中获取到的EXTERNAL-IP
。http://123.456.789.101
(请将
123.456.789.101
替换为你实际获取到的 IP 地址)
重要提示:
-
如果你的 Kubernetes 集群运行在本地环境(如 Minikube, Docker Desktop, Kind),它们无法提供云厂商那样的外部负载均衡器。此时
EXTERNAL-IP
会一直显示为<pending>
。-
对于 Minikube:你需要使用
minikube service
命令来访问:minikube service boonya-game-lab-service
这条命令会自动打开浏览器并导航到正确的地址。
-
对于 Docker Desktop:它可以直接使用
localhost
或127.0.0.1
访问。kubectl get svc
显示的端口(例如80:32123/TCP
中的32123
)就是 NodePort。访问地址为:http://localhost:32123
-
如果访问不通大概率是启动Pod失败,查看命令:
kubectl get pods
查看READY状态是1/1 还是0/1 ,后者表示启动未成功,探测失败。
Kuboard可视化
kuboard是k8s常用的可视化工具之一。
数据库支持: Mysql/MariaDB /OpenGauss https://github.com/eip-work/kuboard-presshttps://kuboard.cn/v4/install/#%E8%87%B4-kuboard-v3-%E7%94%A8%E6%88%B7
导入集群:
注:这里实际上是可以通过配置导入的方式来管理集群。后面再补充怎么操作
开源项目分享
按照上面的步骤你也可以实现k8s的集群快速发布
https://github.com/boonyachengdu/boonya-game-lab/tree/master