💻 Windows服务器K8s学习与SpringBoot部署实战指南

📚 学习路径概览

下表列出了从零开始学习K8s并部署SpringBoot应用的关键阶段及主要任务,帮助你清晰规划学习过程。

阶段 主要任务 预期成果
1. 环境准备 安装Docker Desktop,启用Kubernetes,验证安装 准备好本地K8s开发环境
2. K8s核心概念学习 理解Pod/Deployment/Service等核心概念 掌握K8s基本架构和资源模型
3. SpringBoot应用容器化 创建Dockerfile,构建镜像 将Java应用打包为容器镜像
4. K8s部署实战 创建Deployment/Service/Ingress资源配置 成功部署应用到K8s集群
5. 运维与进阶 应用监控、扩缩容、滚动更新 掌握生产环境基本运维技能

🛠 第一阶段:环境安装与配置

1.1 安装Docker Desktop for Windows

在Windows服务器上安装Docker Desktop是运行Kubernetes的前提。Docker Desktop包含了运行容器所需的所有组件,并提供了内置的Kubernetes支持。

访问Docker官网下载Docker Desktop for Windows安装程序,选择Windows版本对应的安装包。安装完成后,启动Docker Desktop,系统托盘中会出现Docker图标。

1.2 启用Kubernetes功能

打开Docker Desktop设置界面,进入"Kubernetes"选项卡,勾选"Enable Kubernetes"选项,点击"Apply & Restart"按钮。Docker Desktop将自动安装Kubernetes集群所需组件(kubectl、kubelet等)。

1.3 验证安装结果

打开PowerShell或命令提示符,执行以下命令验证安装:

sql 复制代码
kubectl version --client
kubectl cluster-info
kubectl get nodes

如果这些命令都能正常执行并显示信息,说明Kubernetes环境已就绪。

📖 第二阶段:Kubernetes核心概念学习

2.1 理解基本资源对象

  • Pod:Kubernetes的最小部署单元,包含一个或多个容器。
  • Deployment:定义Pod的部署策略,支持滚动更新、回滚等操作。
  • Service:提供统一的访问入口,实现负载均衡和服务发现。
  • Ingress:提供HTTP/HTTPS路由功能,实现基于域名的访问。

2.2 初步实践操作

通过简单命令熟悉kubectl工具的基本使用:

ini 复制代码
# 查看集群状态
kubectl get all

# 创建一个简单的Pod
kubectl run my-nginx --image=nginx:latest --port=80

# 查看Pod状态
kubectl get pods

# 暴露Service
kubectl expose pod my-nginx --type=NodePort --port=80

这些基础操作帮助你建立对Kubernetes资源管理的直观认识。

🚀 第三阶段:SpringBoot应用容器化

3.1 准备SpringBoot项目

创建一个简单的SpringBoot项目,包含一个REST接口用于测试:

kotlin 复制代码
@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, K8s!";
    }
}

确保项目能正常打包:mvn clean package

3.2 创建Dockerfile

在项目根目录创建Dockerfile,定义容器镜像构建过程:

bash 复制代码
# 使用OpenJDK官方镜像
FROM openjdk:11-jre-slim

# 设置工作目录
WORKDIR /app

# 复制JAR文件到容器中
COPY target/demo-0.0.1-SNAPSHOT.jar app.jar

# 暴露应用端口
EXPOSE 8080

# 启动应用
ENTRYPOINT ["java", "-jar", "app.jar"]

3.3 构建和测试镜像

执行以下命令构建Docker镜像并在本地测试:

bash 复制代码
# 构建镜像
docker build -t springboot-k8s-demo:v1 .

# 本地运行测试
docker run -p 8080:8080 springboot-k8s-demo:v1

# 访问测试
curl http://localhost:8080/hello

确保应用在容器中能正常运行后再进行下一步。

⚙️ 第四阶段:Kubernetes部署实战

4.1 创建Deployment配置

创建deployment.yaml文件,定义应用的部署规格:

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-demo
spec:
  replicas: 2  # 两个副本实现高可用
  selector:
    matchLabels:
      app: springboot-demo
  template:
    metadata:
      labels:
        app: springboot-demo
    spec:
      containers:
      - name: springboot-app
        image: springboot-k8s-demo:v1  # 本地构建的镜像
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "256Mi"
            cpu: "200m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /actuator/health
            port: 8080
          initialDelaySeconds: 60
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /actuator/health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 5

4.2 创建Service配置

创建service.yaml文件,定义如何访问应用:

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: springboot-demo-service
spec:
  selector:
    app: springboot-demo
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: NodePort  # 在本地环境使用NodePort类型

4.3 部署应用到Kubernetes

执行以下命令部署应用:

csharp 复制代码
# 应用配置
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

# 查看部署状态
kubectl get deployments
kubectl get pods
kubectl get services

# 查看Pod详细状态
kubectl describe pod <pod名称>

🔍 第五阶段:应用验证与运维

5.1 访问应用

获取服务访问信息并验证应用部署结果:

bash 复制代码
# 查看服务详情,获取NodePort端口
kubectl get svc springboot-demo-service

# 使用端口转发临时访问
kubectl port-forward svc/springboot-demo-service 8080:80

# 访问测试
curl http://localhost:8080/hello

5.2 基本运维操作

掌握日常运维所需的命令和操作:

bash 复制代码
# 查看应用日志
kubectl logs <pod名称>

# 扩展应用实例数量
kubectl scale deployment springboot-demo --replicas=3

# 更新应用镜像(触发滚动更新)
kubectl set image deployment/springboot-demo springboot-app=springboot-k8s-demo:v2

# 查看更新状态
kubectl rollout status deployment/springboot-demo

# 回滚到上一版本
kubectl rollout undo deployment/springboot-demo

🧩 第六阶段:进阶实战与优化

6.1 配置管理(ConfigMap)

创建configmap.yaml,将应用配置外部化:

yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  application.properties: |
    server.port=8080
    logging.level.com.example=INFO

在Deployment中引用ConfigMap:

yaml 复制代码
# 在Deployment的容器规格中添加
volumeMounts:
- name: config-volume
  mountPath: /app/config
volumes:
- name: config-volume
  configMap:
    name: app-config

6.2 使用Ingress实现域名访问

创建ingress.yaml,配置基于域名的访问:

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: springboot-ingress
spec:
  rules:
  - host: demo.k8s.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: springboot-demo-service
            port:
              number: 80

💡 学习建议与最佳实践

  1. 迭代学习:从简单部署开始,逐步增加复杂度。
  2. 充分利用资源:由于你拥有大内存服务器,可以部署更复杂的应用(如微服务架构)进行练习。
  3. 版本控制:将所有配置文件纳入Git版本控制。
  4. 日志收集:考虑部署EFK(Elasticsearch、Fluentd、Kibana)栈进行日志管理。
  5. 监控预警:部署Prometheus + Grafana监控套件,监控应用和集群状态。

🗂 项目结构参考

bash 复制代码
k8s-learning/
├── src/                    # SpringBoot源码
├── Dockerfile             # 镜像构建文件
├── k8s/
│   ├── deployment.yaml    # 部署配置
│   ├── service.yaml       # 服务配置
│   ├── ingress.yaml       # 路由配置
│   └── configmap.yaml     # 配置管理
└── README.md              # 项目说明
相关推荐
嘉伟桑25 分钟前
Python调用电价API返回JSON示例:分时电价、现货电价和字段解析
后端
武子康41 分钟前
Shippy:确定性工具、会话级 Sandbox 与 Live-Data Eval(4 类收敛 + 7 步实现方案 + 6 类评测指标)
前端·人工智能·后端
我叫黑大帅1 小时前
我为什么单一消费者的场景下,要用 Redis List 当消息队列?
redis·后端·面试
AskHarries1 小时前
文件上传系统
后端
止语Lab2 小时前
好的 DX 不等于少写代码——三种语言的摩擦力设计课
后端
吃饱了得干活2 小时前
别再手动解析 LLM 输出了!LangChain 四种结构化输出方案对比
后端·python·langchain
程序员天天困2 小时前
Arthas trace 命令怎么用?一行定位最慢那行代码
jvm·后端
Huiturn2 小时前
GPT 5.6 连续编码 10 小时,纯 Python 啃下 Word 二进制格式——doc2docx 实现拆解
后端
用户298698530142 小时前
Python 实现 Excel 与 Markdown 互转的实用指南
后端·python·excel
用户77283104908402 小时前
krono-job:零侵入、单二进制交付的分布式任务调度平台(开源)
后端