第二阶段:核心资源对象实践

📅 第二阶段:核心资源对象实践 – 每日学习计划 (14天)

🎯 阶段目标

  1. 掌握各种工作负载控制器(Deployment/StatefulSet等)的特性

  2. 理解服务发现机制和网络配置

  3. 熟练使用配置管理和存储方案

  4. 能够部署完整的三层应用(前端+后端+数据库)


📚 每日学习安排

Day 1:Deployment 基础

  • 理论学习:

    • 无状态应用管理

    • 副本集(ReplicaSet)原理

    • 滚动更新策略

  • 动手实践:

    # 创建 deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: web-frontend
    spec:
    replicas: 3
    selector:
      matchLabels:
        app: frontend
    template:
      metadata:
        labels:
          app: frontend
      spec:
        containers:
        - name: nginx
          image: nginx:1.20
          ports:
          - containerPort: 80
    kubectl apply -f deployment.yaml
    kubectl get deploy,rs,pod -l app=frontend

Day 2:Deployment 更新策略

  • 理论学习:

    • 滚动更新 vs 重建更新

    • maxSurge/maxUnavailable 参数

    • 版本回滚机制

  • 动手实践:

    # 触发滚动更新
    kubectl set image deploy/web-frontend nginx=nginx:1.21
    kubectl rollout status deploy/web-frontend

    # 回滚到上一版本
    kubectl rollout undo deploy/web-frontend
    kubectl rollout history deploy/web-frontend

Day 3:StatefulSet 基础

  • 理论学习:

    • 有状态应用特点(稳定网络标识/持久存储)

    • Headless Service 作用

    • 有序部署策略

  • 动手实践:

    # 创建 statefulset.yaml
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
    name: db
    spec:
    serviceName: "db-service"
    replicas: 3
    selector:
      matchLabels:
        app: database
    template:
      metadata:
        labels:
          app: database
      spec:
        containers:
        - name: mysql
          image: mysql:5.7
          env:
          - name: MYSQL_ROOT_PASSWORD
            value: "password"
    kubectl get sts,pod -l app=database
    kubectl exec db-0 -- hostname

Day 4:StatefulSet 持久化

  • 理论学习:

    • volumeClaimTemplates 机制

    • 持久卷动态供应

    • 数据持久性验证

  • 动手实践:

    # 在 StatefulSet 中添加 PVC 模板
    volumeClaimTemplates:
    - metadata:
      name: mysql-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "standard"
      resources:
        requests:
          storage: 1Gi
    kubectl get pvc
    kubectl describe pod db-0

Day 5:DaemonSet 与 Job

  • 理论学习:

    • DaemonSet:节点级部署(日志收集/监控)

    • Job:批处理任务

    • CronJob:定时任务

  • 动手实践:

    # 创建 DaemonSet
    kubectl create deploy nginx-ds --image=nginx -n kube-system --dry-run=client -o yaml > ds.yaml
    # 修改 kind: DaemonSet

    # 创建 CronJob
    kubectl create cronjob daily-report --image=busybox --schedule="*/5 * * * *" -- /bin/sh -c "date > /tmp/report"
    kubectl get cj

Day 6:Service 基础

  • 理论学习:

    • ClusterIP/NodePort/LoadBalancer 类型

    • Endpoints 自动管理

    • kube-proxy 工作原理

  • 动手实践:

    # 创建 service.yaml
    apiVersion: v1
    kind: Service
    metadata:
    name: frontend-svc
    spec:
    selector:
      app: frontend
    ports:
      - protocol: TCP
        port: 80
        targetPort: 80
    type: NodePort
    kubectl apply -f service.yaml
    minikube service frontend-svc --url
    kubectl get ep frontend-svc

Day 7:Service 进阶

  • 理论学习:

    • 会话保持(sessionAffinity)

    • 多端口服务

    • ExternalName 服务类型

  • 动手实践:

    # 多端口配置示例
    ports:
    - name: http
    port: 80
    targetPort: 80
    - name: metrics
    port: 9113
    targetPort: 9113

Day 8:Ingress 控制器

  • 理论学习:

    • Ingress vs LoadBalancer

    • Nginx Ingress 架构

    • 路径重写规则

  • 动手实践:

    # 启用 Ingress 插件
    minikube addons enable ingress

    # 创建 Ingress 资源
    kubectl create ingress demo --rule="demo.test/*=frontend-svc:80"
    kubectl get ing
    echo "$(minikube ip) demo.test" | sudo tee -a /etc/hosts
    curl http://demo.test

Day 9:Ingress 高级路由

  • 理论学习:

    • 基于主机名的路由

    • TLS 证书配置

    • 注解(Annotations)定制

  • 动手实践:

    # 多路由配置
    spec:
    rules:
    - host: app.test
    http:
    paths:
    - path: /api
    backend:
    service:
    name: api-svc
    port: 3000
    - path: /
    backend:
    service:
    name: web-svc
    port: 80

Day 10:ConfigMap 配置管理

  • 理论学习:

    • 环境变量注入

    • 配置文件挂载

    • 热更新机制

  • 动手实践:

    # 创建 ConfigMap
    kubectl create configmap app-config --from-literal=LOG_LEVEL=debug --from-file=nginx.conf

    # Pod 中挂载
    volumes:
    - name: config-vol
    configMap:
    name: app-config

Day 11:Secret 安全管理

  • 理论学习:

    • Opaque vs docker-registry vs tls

    • Base64 编码原理

    • 安全最佳实践

  • 动手实践:

    # 创建 Secret
    kubectl create secret generic db-creds \
    --from-literal=username=admin \
    --from-literal=password=S3cret!

    # 在环境变量中使用
    env:
    - name: DB_PASSWORD
    valueFrom:
    secretKeyRef:
    name: db-creds
    key: password

Day 12:持久化存储

  • 理论学习:

    • PV/PVC 生命周期

    • StorageClass 动态供应

    • 访问模式(RWO/ROX/RWX)

  • 动手实践:

    # 创建 PVC
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: mysql-pvc
    spec:
    accessModes:
    - ReadWriteOnce
    storageClassName: standard
    resources:
    requests:
    storage: 2Gi
    kubectl get pv,pvc

Day 13:综合实战

  • 任务: 部署完整应用栈:

    1. 前端(Deployment + ClusterIP)

    2. API服务(Deployment + ClusterIP)

    3. 数据库(StatefulSet + PVC)

    4. 通过Ingress暴露服务

  • 验证:

    curl -L http://app.test
    kubectl exec -it db-0 -- mysql -u root -p

Day 14:故障排查日

  • 模拟场景:

    1. 服务无法访问(检查Endpoints)

    2. 持久卷挂载失败(describe pvc)

    3. Ingress路由404(检查Annotations)

    4. 配置更新未生效(热更新限制)

  • 工具使用:

    kubectl describe pod <name>
    kubectl logs <pod> -c <container>
    kubectl get events --sort-by=.metadata.creationTimestamp

🔧 环境准备

  1. 启用 Minikube 插件:

    minikube addons enable ingress
    minikube addons enable storage-provisioner
  2. 安装网络诊断工具:

    kubectl apply -f https://github.com/nicolaka/netshoot/releases/latest/download/netshoot.yaml

📚 学习资源

⚠️ 注意事项

  1. 每天完成所有YAML文件的手动编写

  2. 使用kubectl describe查看资源详情

  3. 记录所有操作命令和问题排查过程

  4. 重点理解控制器的工作原理(观察-对比-执行)


> **进阶技巧**:
> 1. 使用`kubectl get <resource> -o yaml > debug.yaml`导出配置分析
> 2. 通过`minikube ssh`进入节点查看容器实际运行状态
> 3. 使用`kubectl port-forward`临时访问内部服务
> 4. 定期执行`kubectl get all --all-namespaces`查看全局状态

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部