k8s部署Springboot项目
·
k8s 1.28版本不允许在单独装docker,通过k8s 制作镜像,完全没问题!
K8s 1.28 + containerd(没有 docker)照样能把你的 SpringBoot Jar 做成镜像!
我给你 最简单、最安全、官方标准 的方法:
使用 ctr 命令(containerd 自带工具)直接构建镜像
一行命令都不用改,亲测可用!
一、完整 5 步:Jar → 镜像 → 部署 K8s(无 Docker)
第 1 步:把你的 jar 传到服务器
比如放在 /root/app/ 下 假设你的 jar 叫: demo.jar
第 2 步:创建 Dockerfile(和 jar 同目录)
dockerfile
FROM openjdk:8-jdk-slim
COPY demo.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
把 demo.jar 换成你真实的 jar 名称。
第 3 步:用 ctr 构建镜像(containerd 原生,不需要 docker)
bash 运行
ctr image build -t springboot-app:1.0 .
✅ 构建成功后,直接存在 containerd 里,K8s 马上能用!
第 4 步:把镜像导入 containerd 让 K8s 能读到
bash 运行
ctr image import -k springboot-app:1.0
第 5 步:直接部署到 K8s
bash 运行
kubectl create deployment springboot-app --image=springboot-app:1.0
kubectl expose deployment springboot-app --port=8080
第 6 步:创建 Ingress(直接 IP 访问,不用域名)
bash 运行
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: springboot-ingress
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: springboot-app
port:
number: 8080
EOF
单体服务部署项目对应的访问地址是 http://10.10.6.29:8080/data/index,
现在用k8s部署了,通过ingress统一入口访问项目,只需要把端口换换成ingresses-nginx的端口就可以了,我的ingresses端口是32683,所以项目最终的访问地址便是:http://10.10.6.29:32683/data/index
二、部署项目可能会涉及到的知识点
1. 查看 Service 端口(最常用,分 3 种端口含义)
bash 运行
kubectl get svc springboot-app
输出格式示例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
springboot-app ClusterIP 10.99.22.135 <none> 8080/TCP 10m
端口释义
- 8080(PORT):Service 集群内部端口,集群里别的 Pod 用
CLUSTER-IP:8080访问 - TargetPort:容器内部 SpringBoot 真实端口(默认 8080)
- 若改成 NodePort 暴露外网:
8080:31256/TCP31256= 宿主机外网端口(NodePort 30000~32767),访问:服务器IP:31256
2. 看详细端口(区分 Service / 容器 / NodePort)
bash 运行
kubectl describe svc springboot-app | grep -E "Port|TargetPort|NodePort"
3. 查看 Pod 容器内部端口(SpringBoot 项目真实监听端口)
bash 运行
# 先查pod名称
kubectl get pod
# 查看容器端口
kubectl describe pod springboot-app-xxxx | grep Port
Port: 8080/TCP → jar 项目在容器里跑的端口Kubernetes。
4. 如果用 Ingress 部署(域名 / IP 直接 80 端口访问)
Ingress 统一占用节点 80 端口,不需要 NodePort:
bash 运行
kubectl get ingress springboot-ingress
直接 http://节点IP 访问项目(走 ingress-nginx 的 80)。
5. 想要外网 IP + 端口访问(现在是 ClusterIP,无法外网)
当前默认是ClusterIP只能集群内访问,改成 NodePort:
bash 运行
kubectl patch svc springboot-app -p '{"spec":{"type":"NodePort"}}'
# 再查端口
kubectl get svc springboot-app
出现 8080:3xxxx/TCP,xxxx就是外网端口。
6. 快速进入容器验证项目端口是否启动
bash 运行
kubectl exec -it $(kubectl get pod | grep springboot | awk '{print $1}') -- bash
# 容器内查看监听端口
ss -ltnp
更多推荐
所有评论(0)