Kubernetes容器编排学习路线图从零入门到实战部署新手避坑指南全网最全学习资源推荐
嘿,朋友,咱们今天不整那些虚头巴脑的。说实在的,Kubernetes(K8s)这玩意儿学起来确实有点陡,我当年第一次接触的时候也是对着那些yaml文件发懵。但只要你按对路子,其实没有想象中那么可怕。下面我把这趟学习旅程掰开揉碎了讲给你听,保证你看完心里有底。
先搞明白:K8s到底是干啥的
说白了,Kubernetes就是一个”容器管家”。
想象一下,你跑着一堆小程序(容器),每个小程序住在一个小房间里。以前你一个个手动开房间、接水电、修bug,累得半死。K8s来了之后,它帮你自动分配房间、自动修复坏掉的房间、自动在人多时加房间、人少时关房间。
它最核心的几个能力:
| 能力 | 大白话解释 |
|---|---|
| 自动部署 | 你说要几个副本,它自动帮你启动 |
| 自愈能力 | 容器挂了自动重启,节点坏了自动迁移 |
| 水平扩展 | 流量大了自动加机器,流量小了自动减 |
| 服务发现 | 容器地址变了也不怕,自动帮你找到 |
| 负载均衡 | 请求均匀分发到各个容器 |
| 滚动更新 | 升级时不宕机,逐个替换老版本 |
| 配置管理 | 密码、密钥、配置文件统一管理 |
第一阶段:打地基(大约2-3周)
在碰K8s之前,你得先把前置知识补好。很多新人一上来就死磕K8s,结果处处碰壁,根子就在前面没打牢。
1. 必须掌握的Linux基础
K8s本质上是跑在Linux上的,你总得能看懂命令吧?
# 这几个命令你必须滚瓜烂熟
ps aux # 查看进程
top / htop # 查看系统资源
docker ps -a # 查看容器
tail -f /var/log/messages # 实时看日志
grep "error" log.txt # 查日志里的错误
chmod / chown # 文件权限操作
vim 或 nano # 编辑文件(至少会一个)
不用背所有命令,但上面这些是日常必须用的,用多了自然就熟了。
2. Docker容器基础(至少1周)
K8s管的是容器,所以Docker你得会。不需要成为Docker专家,但基本的会用。
# 先写一个简单的Dockerfile练手
FROM nginx:latest
COPY index.html /usr/share/nginx/html/
EXPOSE 80
# 构建镜像
docker build -t my-nginx:v1 .
# 运行容器
docker run -d -p 8080:80 --name webapp my-nginx:v1
# 查看容器状态
docker ps
# 查看容器日志
docker logs webapp
# 进入容器内部调试
docker exec -it webapp bash
理解这几个概念就够了:镜像(Image)、容器(Container)、仓库(Registry)、Dockerfile。
3. 网络基础(不用太深,但要懂)
- IP地址和端口是什么
- DNS怎么工作的
- HTTP/HTTPS请求流程
- 什么是TCP和UDP
不用成为网络专家,知道”容器怎么互相通信”就够了。
第二阶段:初识K8s(大约2-3周)
核心概念速通
K8s里有一堆术语,刚学的时候像天书。我帮你捋一捋最核心的:
Pod → 最小部署单元,可以跑一个或多个容器
Deployment → 管理Pod的"老板",决定跑几个Pod、怎么更新
Service → 给Pod提供稳定的访问入口
Namespace → 划分隔离环境的"文件夹"
ConfigMap → 存放配置信息的"仓库"
Secret → 存放敏感信息(密码、密钥)的"保险箱"
Node → 集群里的每一台机器
Cluster → 所有Node组成的整体
第一套集群:Minikube上手(最推荐的入门方式)
别一上来就搞生产集群,Minikube是你本地运行的单机K8s,免费、快速、方便。
# 安装Minikube(macOS)
brew install minikube
# 启动集群
minikube start
# 查看集群状态
minikube status
kubectl get nodes
# 安装kubectl(管理K8s的命令行工具)
# macOS
brew install kubectl
# Ubuntu
sudo apt-get install -y kubelet kubectl kubeadm
第一个真实例子:跑一个Web应用
# deployment.yaml - 部署一个Nginx应用
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3 # 跑3个副本
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: nginx
image: nginx:1.25 # 镜像版本
ports:
- containerPort: 80 # 容器内部端口
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
# service.yaml - 给上面那个部署暴露访问入口
apiVersion: v1
kind: Service
metadata:
name: web-app-service
spec:
selector:
app: web-app
ports:
- protocol: TCP
port: 80 # Service端口
targetPort: 80 # 容器端口
type: LoadBalancer # 负载均衡类型
# 依次执行
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
# 查看所有资源
kubectl get all
# 查看Pod运行状态
kubectl get pods
# 查看Service
kubectl get svc
# 访问应用(Minikube环境)
minikube service web-app-service --url
# 查看Pod日志
kubectl logs -l app=web-app
# 进入Pod调试
kubectl exec -it <pod-name> -- bash
跑通这三个文件,你就迈出最关键的一步了。
第三阶段:深入核心资源(大约3-4周)
这一阶段要把K8s的核心资源逐个吃透。
Deployment详解
# 滚动更新的Deployment配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-server
spec:
replicas: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 更新时最多比期望多1个Pod
maxUnavailable: 0 # 更新时不允许有Pod不可用
selector:
matchLabels:
app: api-server
template:
metadata:
labels:
app: api-server
spec:
containers:
- name: api
image: my-api:v2.0
ports:
- containerPort: 8080
# 健康检查 - 这个很重要!
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
# 环境变量
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: app-config
key: db.host
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: db.password
Service的三种类型
# 1. ClusterIP - 集群内部访问(默认)
apiVersion: v1
kind: Service
metadata:
name: internal-api
spec:
type: ClusterIP
selector:
app: backend
ports:
- port: 80
targetPort: 8080
# 2. NodePort - 通过节点端口访问(开发调试常用)
apiVersion: v1
kind: Service
metadata:
name: external-api
spec:
type: NodePort
selector:
app: backend
ports:
- port: 80
targetPort: 8080
nodePort: 30080 # 固定节点端口
# 3. LoadBalancer - 云厂商负载均衡(生产常用)
apiVersion: v1
kind: Service
metadata:
name: lb-api
spec:
type: LoadBalancer
selector:
app: backend
ports:
- port: 80
targetPort: 8080
ConfigMap和Secret
# ConfigMap - 存放非敏感配置
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DB_HOST: "mysql.default.svc.cluster.local"
DB_PORT: "3306"
LOG_LEVEL: "info"
app.properties: |
server.port=8080
spring.redis.host=redis
# Secret - 存放敏感信息(base64编码)
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
db.password: YmFkMDNwYXNzd29yZA== # echo -n "bad03password" | base64
api.key: c2VjcmV0YXBpa2V5MTIz
# 在Pod中使用ConfigMap和Secret
# 作为环境变量
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: app-secret
# 作为文件挂载(更推荐,避免泄露到环境变量)
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: app-config
PersistentVolume和PersistentVolumeClaim
# PV - 定义一块持久化存储
apiVersion: v1
kind: PersistentVolume
metadata:
name: data-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
hostPath:
path: "/mnt/data"
---
# PVC - 申请使用这块存储
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: manual
resources:
requests:
storage: 5Gi # 申请5G,比PV小也能用
第四阶段:实战项目(大约3-4周)
光看不练假把式,来几个实战项目。
项目一:部署一个完整的前后端分离应用
假设你有:
- 前端:React打包的静态资源
- 后端:Java Spring Boot API
- 数据库:MySQL
- 缓存:Redis
# 完整的应用部署清单
# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: myapp
---
# mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
namespace: myapp
spec:
accessModes: [ReadWriteOnce]
resources:
requests:
storage: 10Gi
---
# mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: myapp
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: root-password
- name: MYSQL_DATABASE
value: "myapp_db"
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "1000m"
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-pvc
---
# mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: myapp
spec:
selector:
app: mysql
ports:
- port: 3306
targetPort: 3306
clusterIP: None # Headless Service,用于StatefulSet或固定DNS
---
# redis-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: myapp
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:7-alpine
ports:
- containerPort: 6379
resources:
limits:
memory: "256Mi"
cpu: "250m"
---
# redis-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: myapp
spec:
selector:
app: redis
ports:
- port: 6379
targetPort: 6379
---
# backend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
namespace: myapp
spec:
replicas: 2
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: backend
image: myregistry/backend:v1.2.0
ports:
- containerPort: 8080
env:
- name: DB_HOST
value: "mysql" # 在同一个namespace内,直接用服务名
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: root-password
- name: REDIS_HOST
value: "redis"
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
---
# backend-service.yaml
apiVersion: v1
kind: Service
metadata:
name: backend
namespace: myapp
spec:
selector:
app: backend
ports:
- port: 80
targetPort: 8080
---
# frontend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
namespace: myapp
spec:
replicas: 2
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: nginx
image: nginx:1.25-alpine
ports:
- containerPort: 80
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d
- name: frontend-static
mountPath: /usr/share/nginx/html
resources:
limits:
memory: "128Mi"
cpu: "100m"
volumes:
- name: nginx-config
configMap:
name: frontend-nginx-config
- name: frontend-static
configMap:
name: frontend-static-files
---
# frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
name: frontend
namespace: myapp
spec:
selector:
app: frontend
ports:
- port: 80
targetPort: 80
---
# ingress.yaml - 外部访问入口
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
namespace: myapp
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: myapp.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: backend
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80
# 一次性部署
kubectl apply -f .
# 查看整体状态
kubectl get all -n myapp
# 查看Ingress状态
kubectl get ingress -n myapp
项目二:实现自动扩缩容(HPA)
# HPA配置 - 当CPU使用率超过60%时自动扩容到5个副本
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: backend-hpa
namespace: myapp
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: backend
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
# 查看HPA状态
kubectl get hpa -n myapp
# 模拟压力测试
kubectl run load-test --image=busybox --restart=Never -n myapp -- /bin/sh -c "while true; do wget -q -O- http://backend/api/health; sleep 0.1; done"
# 观察Pod数量变化
kubectl get pods -n myapp -w
项目三:滚动更新和回滚
# 查看当前版本
kubectl rollout status deployment/backend -n myapp
# 更新镜像版本
kubectl set image deployment/backend backend=myregistry/backend:v1.3.0 -n myapp
# 实时查看滚动更新进度
kubectl rollout status deployment/backend -n myapp --watch
# 如果新版本有问题,立即回滚
kubectl rollout undo deployment/backend -n myapp
# 查看更新历史
kubectl rollout history deployment/backend -n myapp
# 回滚到指定版本
kubectl rollout undo deployment/backend -n myapp --to-revision=2
第五阶段:生产级进阶(大约4-6周)
Ingress详解
# 更完整的Ingress配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: production-ingress
annotations:
# nginx ingress controller配置
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/configuration-snippet: |
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
# 限流
nginx.ingress.kubernetes.io/limit-rps: "100"
# 自定义错误页
nginx.ingress.kubernetes.io/default-backend: error-pages
spec:
ingressClassName: nginx
tls:
- hosts:
- api.example.com
- www.example.com
secretName: tls-cert
rules:
- host: api.example.com
http:
paths:
- path: /v1(/|$)(.*)
pathType: ImplementationSpecific
backend:
service:
name: backend-v1
port:
number: 80
- path: /v2(/|$)(.*)
pathType: ImplementationSpecific
backend:
service:
name: backend-v2
port:
number: 80
- host: www.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80
NetworkPolicy(网络安全策略)
# 只允许frontend访问backend
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: myapp
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- port: 8080
---
# 禁止backend访问外部网络
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-backend-egress
namespace: myapp
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Egress
egress: [] # 空列表 = 禁止所有出站
Helm包管理
# 安装Helm
brew install helm
# 添加官方仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add stable https://charts.helm.sh/stable
helm repo update
# 搜索MySQL chart
helm search repo mysql
# 安装MySQL
helm install my-db bitnami/mysql \
--set auth.rootPassword=mysecretpassword \
--set auth.database=myapp_db \
--namespace myapp
# 查看已安装的chart
helm list -n myapp
# 升级
helm upgrade my-db bitnami/mysql \
--set image.tag=8.0.33 \
-n myapp
# 卸载
helm uninstall my-db -n myapp
新手最容易踩的坑(血泪教训)
坑1:不设置资源限制
# ❌ 错误示范 - 不设限制,容器可能吃光节点资源
spec:
containers:
- name: app
image: myapp:v1
# 没有resources配置!
# ✅ 正确做法 - 一定要设requests和limits
spec:
containers:
- name: app
image: myapp:v1
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "1000m"
不设置的话,一个容器可能把整个节点内存吃光,导致其他Pod被驱逐。K8s的调度器依赖requests来决定把Pod放在哪台机器上,不设requests等于让调度器瞎猜。
坑2:没有健康检查
# ❌ 没有探针,K8s不知道容器是否真正可用
spec:
containers:
- name: app
image: myapp:v1
ports:
- containerPort: 8080
# ✅ 加上探针
spec:
containers:
- name: app
image: myapp:v1
ports:
- containerPort: 8080
livenessProbe: # 活不活着?
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
failureThreshold: 3
readinessProbe: # 能不能接客?
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 3
livenessProbe:死了就重启。readinessProbe:没准备好就不分发流量。两个探针功能不同,别混用。
坑3:用latest标签
# ❌ 绝对不要用latest
image: myapp:latest
# ✅ 用具体版本号
image: myapp:v1.2.3
# 原因:latest每次pull可能拿到不同版本,导致生产环境不可预测
坑4:忽略日志管理
# ❌ 日志默认存在容器里,容器重建就没了
# ✅ 使用sidecar模式收集日志
# 在Pod里加一个fluentd sidecar
spec:
containers:
- name: app
image: myapp:v1
- name: log-collector
image: fluentd:v1.16
volumeMounts:
- name: app-logs
mountPath: /var/log/app
volumes:
- name: app-logs
emptyDir: {}
生产环境建议上EFK栈(Elasticsearch + Fluentd + Kibana)或Promtail + Loki。
坑5:没有备份策略
# 使用Velero做集群备份
# 安装Velero
velero install \
--provider aws \
--bucket my-backup-bucket \
--secret-file ./credentials-aws.ini \
--use-volume-snapshots=true
# 手动备份整个namespace
velero backup create myapp-backup \
--include-namespaces myapp \
--snapshot-volumes
# 查看备份状态
velero backup describe myapp-backup
# 恢复
velero restore create --from-backup myapp-backup
坑6:所有东西都放一个namespace
# ❌ 全部塞进default namespace
kubectl apply -f deployment.yaml # 默认在default
# ✅ 按环境/团队划分namespace
apiVersion: v1
kind: Namespace
metadata:
name: payment-service
labels:
team: payments
env: production
apiVersion: v1
kind: Namespace
metadata:
name: user-service
labels:
team: users
env: production
监控和排障体系
# 查看Pod详细状态(事件很重要!)
kubectl describe pod <pod-name>
# 查看Events(集群级事件)
kubectl get events --sort-by='.lastTimestamp'
# 实时查看Pod变化
kubectl get pods -w
# 查看节点状态
kubectl get nodes -o wide
kubectl describe node <node-name>
# 查看资源使用情况(需要metrics-server)
kubectl top pods -n myapp
kubectl top nodes
# 日志实时跟随
kubectl logs -f <pod-name> -n myapp
# 多容器Pod查看指定容器日志
kubectl logs -f <pod-name> -n myapp -c sidecar-container
推荐监控方案:Prometheus + Grafana
# 使用Prometheus Operator快速部署
# 添加官方chart
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# 安装
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--set grafana.adminPassword=admin123 \
--create-namespace
# 暴露Grafana
kubectl port-forward svc/prometheus-grafana 3000:80 -n monitoring
# 然后访问 http://localhost:3000
全栈学习资源汇总
官方文档(永远的第一手资料)
- Kubernetes官方文档 — 中文文档很完善,遇到问题先看这个
- Kubernetes概念图解 — 从概念入手理解架构
在线实践平台(不用本地装环境)
- Kubernetes Playground — 免费,浏览器里直接玩K8s集群
- Killercoda — 多种场景的交互式练习
视频课程
| 平台 | 课程名 | 特点 |
|---|---|---|
| B站 | 尚硅谷Kubernetes教程 | 中文,系统全面,适合零基础 |
| B站 | 马哥K8s教程 | 偏实战,内容深入 |
| Udemy | Kubernetes for the Absolute Beginners | 英文,节奏友好 |
| 极客时间 | Kubernetes实战 | 偏生产场景 |
书籍推荐
- 《Kubernetes权威指南》(第5版)— 中文K8s经典,内容全面但偏厚,适合当工具书查阅
- 《Kubernetes在淘宝的实践》 — 国内大厂实战经验,很接地气
- Kubernetes Up and Running — 英文原版,简洁实用
- Cloud Native Infrastructure — 讲云原生整体架构,不只是K8s
工具链推荐
| 用途 | 工具 |
|---|---|
| 本地集群 | Minikube / Kind / MicroK8s |
| 包管理 | Helm / Kustomize |
| 监控 | Prometheus + Grafana |
| 日志 | EFK / Loki |
| 备份 | Velero |
| CI/CD | Argo CD / GitLab CI |
| 安全扫描 | Trivy / Falco |
练习项目清单(做完这些你就出师了)
- 在Minikube上部署一个Nginx,通过Service暴露出去
- 把Nginx改成5个副本,观察负载均衡效果
- 配置HPA,模拟高流量看自动扩容
- 用ConfigMap管理Nginx配置,不重建镜像就能改配置
- 部署MySQL + 持久化存储,验证数据不丢失
- 配置Ingress,通过域名访问不同服务
- 写一个NetworkPolicy限制Pod网络访问
- 用Helm打包部署一个完整应用
- 搭建Prometheus监控告警
- 用Argo CD实现GitOps自动部署
学习路径总结
我给你画一条清晰的路径:
第1个月:Docker基础 + K8s核心概念 + Minikube上手
↓
第2个月:Deployment/Service/ConfigMap/Secret 实战
↓
第3个月:Ingress/HPA/Helm/PV/PVC 进阶
↓
第4个月:监控/日志/安全/备份 生产化
↓
第5个月起:Argo CD、Service Mesh、多集群管理
学习的核心心法就三条:
- 动手第一 — 看懂不等于会了,每个概念都要亲手敲一遍
- 学会看日志 — 80%的问题通过
kubectl describe pod和kubectl logs就能定位 - 理解原理 — 不要死记yaml模板,理解每个字段背后的含义,遇到问题才能举一反三
K8s的学习曲线确实是先陡后平,刚开始觉得什么都看不懂,一旦过了那个门槛,后面就越来越顺手。别怕,慢慢来,遇到报错别慌,把错误信息复制出来好好读,答案往往就在里面。
祝你学习顺利,早日成为K8s高手!有问题随时回来翻这篇指南。
