记录一次从零开始使用k8s部署java项目
记录一次从零开始使用k8s部署java项目
先说整体部署流程
Java 项目 → Docker 镜像 → k8s → 访问成功
1.把 Java 项目 打成 jar
mvn clean package -DskipTests
2.制作java应用Docker 镜像
2.1.写Dockerfile
# 默认基础jdk 8u_231;不需要修改
FROM registry.platform.cn/jdk_17-ibc
LABEL maintainer="mcpserver"
WORKDIR /usr/local/project
COPY target/mcp-server-*.jar mcp-server.jar
EXPOSE 8081
ENTRYPOINT ["java", "-jar", "/usr/local/project/mcp-server.jar"]
MY_REPO:这里指定从该镜像仓库拉取jdk
问题1
这里正确的地址是registry.platform.cn/jdk_17-ibc,但是在我写的时候我并不知道是这个地址。可以通过一下步骤查询真实地址
先查看是否运行了镜像仓库
docker ps | grep registry
存在仓库的情况下,查看仓库的路径(看暴露的端口选择http或者https)
curl http://localhost:5000/v2/_catalog
curl -k https://localhost/v2/_catalog
2.2.构建 Docker 镜像
# 构建 Docker 镜像
docker build -t mcp-server:1.0 .
# 确认镜像存在
docker images | grep mcp-server
问题2
这里构建是jdk版本选择的不对,实际应该使用jdk17,所以现在需要jdk17的镜像
# 检查仓库有没有
curl -k https://localhost/v2/_catalog | grep jdk
仓库没有需要制作jdk17的镜像
制作jdk17镜像的步骤如下:
- 新建 Dockerfile(命名为 Dockerfile.jdk17)
# 使用官方 JDK 17 运行环境作为基础
FROM eclipse-temurin:17-jre
LABEL maintainer="mcpserver"
# 设置工作目录
WORKDIR /usr/local/project
- 构建镜像
在 Dockerfile.jdk17 所在目录执行:
docker build -t jdk_17-ibc:latest -f Dockerfile.jdk17 .
- 给镜像打上私有 Registry tag
docker tag jdk_17-ibc:latest registry.platform.cn/jdk_17-ibc:latest
- 推送到私有 Registry
docker push registry.platform.cn/jdk_17-ibc:latest
- 修改你的 Spring Boot 项目 Dockerfile,重新制作镜像
问题3
Sending build context to Docker daemon 82.14MB Step 1/2 : FROM eclipse-temurin:17-jre Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
这个错误的原因是需要从 Docker 官方 Registry 拉镜像,但是当前服务器 无法访问外网,所以报错。
解决办法:直接将jdk17下载好,制作jdk17的镜像
- 编写jdk17的Dockerfile
# 使用最小基础镜像
FROM centos:7
LABEL maintainer="mcpserver"
# 创建 JDK 安装目录
RUN mkdir -p /usr/local/project/java
# 将本地 JDK tar 包拷贝到镜像
COPY openjdk-17.0.0.1+2_linux-x64_bin.tar.gz /usr/local/project/java/
# 解压 JDK,并重命名为 jdk17
RUN tar -xzf /usr/local/project/java/openjdk-17.0.0.1+2_linux-x64_bin.tar.gz -C /usr/local/project/java/ \
&& mv /usr/local/project/java/jdk-* /usr/local/project/java/jdk17 \
&& rm -f /usr/local/project/java/openjdk-17.0.0.1+2_linux-x64_bin.tar.gz
# 设置环境变量
ENV JAVA_HOME=/usr/local/project/java/jdk17
ENV PATH=$JAVA_HOME/bin:$PATH
# 默认工作目录
WORKDIR /usr/local/project
- 把 JDK tar 包和 Dockerfile 放在同一个目录
./Dockerfile.jdk17
./openjdk-17.0.0.1+2_linux-x64_bin.tar.gz
- 构建镜像
docker build -t jdk_17-ibc:latest -f Dockerfile.jdk17 .
问题4
Sending build context to Docker daemon 186.7MB Step 1/7 : FROM centos:7 Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
现在遇到的问题是Docker 构建镜像时仍然尝试拉 centos:7 基础镜像,但是服务器没有外网访问,所以超时失败
解决办法:从电脑下载centos:7镜像,拷贝到内网机器直接加载
# 外网的电脑下载
docker pull centos:7
docker save centos:7 -o centos_7.tar
# 内网电脑加载
docker load -i centos_7.tar
现在jdk17的镜像就可以成功制作,java应用的镜像也可以制作成功了
2.3 把镜像推送到镜像仓库
# 重新构建java应用镜像
docker build -t mcp-server:1.0 .
# 根基仓库地址打tag
docker tag mcp-server:1.0 registry.platform.cn/mcp-server:1.0
# 推送镜像到仓库
docker push registry.platform.cn/mcp-server:1.0
3. k8s部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: mcp-server
namespace: sit
labels:
app: mcp-server
spec:
replicas: 1
selector:
matchLabels:
app: mcp-server
template:
metadata:
labels:
app: mcp-server
spec:
containers:
- name: mcp-server
image: registry.platform.cn/mcp-server:1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8081
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1"
---
apiVersion: v1
kind: Service
metadata:
name: mcp-server
namespace: sit
spec:
selector:
app: mcp-server
type: NodePort
ports:
- name: http
protocol: TCP
port: 8081
targetPort: 8081
nodePort: 30081
更多推荐
所有评论(0)