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

全栈学习资源汇总

官方文档(永远的第一手资料)

在线实践平台(不用本地装环境)

视频课程

平台 课程名 特点
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

练习项目清单(做完这些你就出师了)

  1. 在Minikube上部署一个Nginx,通过Service暴露出去
  2. 把Nginx改成5个副本,观察负载均衡效果
  3. 配置HPA,模拟高流量看自动扩容
  4. 用ConfigMap管理Nginx配置,不重建镜像就能改配置
  5. 部署MySQL + 持久化存储,验证数据不丢失
  6. 配置Ingress,通过域名访问不同服务
  7. 写一个NetworkPolicy限制Pod网络访问
  8. 用Helm打包部署一个完整应用
  9. 搭建Prometheus监控告警
  10. 用Argo CD实现GitOps自动部署

学习路径总结

我给你画一条清晰的路径:

第1个月:Docker基础 + K8s核心概念 + Minikube上手
         ↓
第2个月:Deployment/Service/ConfigMap/Secret 实战
         ↓
第3个月:Ingress/HPA/Helm/PV/PVC 进阶
         ↓
第4个月:监控/日志/安全/备份 生产化
         ↓
第5个月起:Argo CD、Service Mesh、多集群管理

学习的核心心法就三条:

  1. 动手第一 — 看懂不等于会了,每个概念都要亲手敲一遍
  2. 学会看日志 — 80%的问题通过 kubectl describe pod 和 kubectl logs 就能定位
  3. 理解原理 — 不要死记yaml模板,理解每个字段背后的含义,遇到问题才能举一反三

K8s的学习曲线确实是先陡后平,刚开始觉得什么都看不懂,一旦过了那个门槛,后面就越来越顺手。别怕,慢慢来,遇到报错别慌,把错误信息复制出来好好读,答案往往就在里面。

祝你学习顺利,早日成为K8s高手!有问题随时回来翻这篇指南。