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

端口释义

  1. 8080(PORT):Service 集群内部端口,集群里别的 Pod 用 CLUSTER-IP:8080 访问
  2. TargetPort:容器内部 SpringBoot 真实端口(默认 8080)
  3. 若改成 NodePort 暴露外网:8080:31256/TCP
    • 31256 = 宿主机外网端口(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/TCPxxxx就是外网端口。

6. 快速进入容器验证项目端口是否启动

bash 运行

kubectl exec -it $(kubectl get pod | grep springboot | awk '{print $1}') -- bash
# 容器内查看监听端口
ss -ltnp

更多推荐