📚 学习路径概览
下表列出了从零开始学习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
💡 学习建议与最佳实践
- 迭代学习:从简单部署开始,逐步增加复杂度。
- 充分利用资源:由于你拥有大内存服务器,可以部署更复杂的应用(如微服务架构)进行练习。
- 版本控制:将所有配置文件纳入Git版本控制。
- 日志收集:考虑部署EFK(Elasticsearch、Fluentd、Kibana)栈进行日志管理。
- 监控预警:部署Prometheus + Grafana监控套件,监控应用和集群状态。
🗂 项目结构参考
bash
k8s-learning/
├── src/ # SpringBoot源码
├── Dockerfile # 镜像构建文件
├── k8s/
│ ├── deployment.yaml # 部署配置
│ ├── service.yaml # 服务配置
│ ├── ingress.yaml # 路由配置
│ └── configmap.yaml # 配置管理
└── README.md # 项目说明