第三阶段:进阶概念与生产实践

📅 第三阶段:进阶概念与生产实践 – 每日学习计划 (14天)

🎯 阶段目标

  1. 深入理解 Kubernetes 安全与权限控制(RBAC)

  2. 掌握应用可观测性方案(监控、日志)

  3. 学习高级调度策略与集群运维

  4. 了解生态工具(Helm, Operator)和 GitOps 实践

  5. 具备设计和管理生产级应用的能力


📚 每日学习安排

Day 1:ServiceAccount 与 RBAC 基础

  • 理论学习:

    • ServiceAccount 的作用:为 Pod 中的进程提供身份标识

    • RBAC 核心概念:Role/ClusterRole(定义权限),RoleBinding/ClusterRoleBinding(绑定权限)

    • Role (命名空间内) vs ClusterRole (集群范围)

  • 动手实践:

    # 1. 创建一个新的ServiceAccount
    kubectl create serviceaccount my-sa

    # 2. 创建一个Role,允许获取和列出Pod信息
    kubectl create role pod-reader --verb=get,list,watch --resource=pods

    # 3. 将Role绑定到ServiceAccount
    kubectl create rolebinding my-sa-pod-reader --role=pod-reader --serviceaccount=default:my-sa

    # 4. 验证权限 (应在default命名空间内)
    kubectl auth can-i list pods --as=system:serviceaccount:default:my-sa
    kubectl auth can-i create pods --as=system:serviceaccount:default:my-sa

Day 2:ClusterRole 与 Kubernetes 安全上下文

  • 理论学习:

    • ClusterRoleBinding 的用法和影响范围

    • Pod 安全上下文(Security Context):限制容器权限(以非root用户运行等)

    • 最小权限原则

  • 动手实践:

    # 1. 创建一个使用之前ServiceAccount并设置安全上下文的Pod:pod-with-sa.yaml
    apiVersion: v1
    kind: Pod
    metadata:
    name: pod-with-sa
    spec:
    serviceAccountName: my-sa # 指定SA
    containers:
    - name: busybox
      image: busybox
      command: ['sleep', '3600']
      securityContext:
        runAsNonRoot: true
        runAsUser: 1000
        allowPrivilegeEscalation: false
    kubectl apply -f pod-with-sa.yaml
    kubectl exec -it pod-with-sa -- sh
    # 在容器内尝试访问K8s API(看看SA的权限)
    apk add curl
    curl -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://kubernetes.default/api/v1/namespaces/default/pods --insecure

Day 3:资源监控与 Metrics Server

  • 理论学习:

    • 资源请求(requests)和限制(limits)的重要性(CPU、内存)

    • Metrics Server:集群核心资源度量数据的聚合器

    • 垂直Pod自动伸缩(VPA)与水平Pod自动伸缩(HPA)基础概念

  • 动手实践:

    # 1. 部署Metrics Server(如果尚未部署)
    kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

    # 2. 等待片刻,查看节点和Pod的资源使用情况
    kubectl top nodes
    kubectl top pods

    # 3. 为一个Deployment配置资源限制和请求
    # 修改你之前的web-frontend deployment,在container spec中添加:
    # resources:
    #   requests:
    #     memory: "64Mi"
    #     cpu: "250m"
    #   limits:
    #     memory: "128Mi"
    #     cpu: "500m"
    kubectl apply -f deployment-with-resources.yaml
    kubectl describe pod <pod-name> # 查看资源限制是否生效

Day 4:Prometheus 与 Grafana 入门

  • 理论学习:

    • Prometheus:开源监控系统,拉取并存储时间序列数据

    • Grafana:开源的可视化平台,用于查询和展示监控数据

    • ServiceMonitor CRD:Prometheus Operator 用于发现监控目标的方式

  • 动手实践:

    # 1. 使用Helm添加Prometheus社区仓库并安装kube-prometheus-stack
    # 该Chart包含了Prometheus, Grafana, 以及大量K8s监控看板
    helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
    helm repo update
    helm install my-monitor prometheus-community/kube-prometheus-stack

    # 2. 查看安装的Pod和服务
    kubectl get pods -n default -l "release=my-monitor"
    kubectl get svc -n default -l "release=my-monitor"

    # 3. 端口转发访问Grafana UI
    kubectl port-forward svc/my-monitor-grafana 3000:80
    # 浏览器访问 http://localhost:3000
    # 用户名: admin
    # 密码: 获取命令 kubectl get secret my-monitor-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

Day 5:应用日志管理基础

  • 理论学习:

    • 容器日志的存储和查看方式 (kubectl logs)

    • 节点级日志代理:DaemonSet 模式的日志收集器(如 Fluent Bit)

    • 集中式日志架构(EFK/ELK)

  • 动手实践:

    # 1. 查看指定Pod的日志
    kubectl logs -f <your-pod-name> --tail=50

    # 2. 查看包含多个容器的Pod的日志(指定容器名)
    kubectl logs -f <pod-name> -c <container-name>

    # 3. 部署一个简单的Fluent Bit DaemonSet进行日志收集(示例,可能需要根据环境调整)
    # 这是一个简化示例,生产环境需要配置输出(如Elasticsearch)
    kubectl apply -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/fluent-bit-daemonset.yaml

    # 4. 查看Fluent Bit Pod的运行状态
    kubectl get pods -n logging # 或 default,取决于YAML中的命名空间

Day 6:节点亲和性与污点/容忍度

  • 理论学习:

    • 节点亲和性(nodeAffinity):将 Pod 调度到具有特定标签的节点上

    • 污点和容忍度(Taints and Tolerations):防止 Pod 被调度到特定节点,或优先驱逐

    • 应用场景:专用硬件(GPU)、隔离工作负载

  • 动手实践:

    # 1. 查看节点的标签和污点
    kubectl get nodes --show-labels
    kubectl describe node <node-name> | grep Taint

    # 2. 给一个节点打上污点(模拟Master节点或GPU节点)
    kubectl taint nodes <node-name> special=true:NoSchedule

    # 3. 创建一个Deployment,它无法调度到上述节点(观察Event)
    kubectl create deployment test-taint --image=nginx

    # 4. 创建一个带有容忍度的Pod:pod-with-toleration.yaml
    # spec:
    #   tolerations:
    #   - key: "special"
    #     operator: "Equal"
    #     value: "true"
    #     effect: "NoSchedule"
    kubectl apply -f pod-with-toleration.yaml
    # 观察Pod是否被调度到该节点

Day 7:Pod 亲和性与反亲和性

  • 理论学习:

    • Pod 亲和性(podAffinity):将 Pod 调度到已有同类 Pod 的节点(提高密度)

    • Pod 反亲和性(podAntiAffinity):将 Pod 分散到不同节点/域(提高可用性)

    • topologyKey 的概念(例如 kubernetes.io/hostname, failure-domain.beta.kubernetes.io/zone

  • 动手实践:

    # 1. 创建一个使用反亲和性的Deployment:deployment-anti-affinity.yaml
    # 目标:确保同一应用的Pod不会调度到同一个节点上
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: web-ha
    spec:
    replicas: 3
    selector:
      matchLabels:
        app: web-ha
    template:
      metadata:
        labels:
          app: web-ha
      spec:
        affinity:
          podAntiAffinity:
            preferredDuringSchedulingIgnoredDuringExecution: # 软策略
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchExpressions:
                  - key: app
                    operator: In
                    values:
                    - web-ha
                topologyKey: kubernetes.io/hostname
        containers:
        - name: nginx
          image: nginx
    kubectl apply -f deployment-anti-affinity.yaml
    kubectl get pods -o wide # 观察Pod是否分布在不同节点

Day 8:包管理工具 Helm (一)

  • 理论学习:

    • Helm 是什么:Kubernetes 的包管理器

    • 核心概念:Chart(软件包)、Release(Chart的运行实例)、Repository(Chart仓库)

    • Helm V3 架构(无需 Tiller)

  • 动手实践:

    # 1. 安装Helm
    curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
    helm version

    # 2. 搜索和安装一个公开的Chart(例如安装Nginx)
    helm repo add bitnami https://charts.bitnami.com/bitnami
    helm repo update
    helm search repo nginx
    helm install my-webserver bitnami/nginx

    # 3. 查看安装的Release和对应的K8s资源
    helm list
    kubectl get all -l app.kubernetes.io/instance=my-webserver

Day 9:包管理工具 Helm (二)

  • 理论学习:

    • Chart 结构:Chart.yaml, values.yaml, templates/ 目录

    • 模板语法:{{ .Values.xxx }}, {{ .Release.Name }}

    • 使用 helm install/upgrade --set 覆盖 values

  • 动手实践:

    # 1. 创建一个你自己的Chart骨架
    helm create my-first-chart
    tree my-first-chart

    # 2. 探索Chart结构,编辑 values.yaml 文件(例如修改replicaCount, image等)
    cat my-first-chart/values.yaml

    # 3. 调试和安装你的Chart
    helm install --dry-run --debug my-release ./my-first-chart # 模拟安装,渲染模板
    helm install my-release ./my-first-chart

    # 4. 使用自定义值升级Release
    helm upgrade my-release ./my-first-chart --set replicaCount=2

Day 10:自定义资源定义 (CRD) 与 Operator 模式

  • 理论学习:

    • CRD(Custom Resource Definition):扩展 K8s API

    • 自定义资源(CR):CRD 的实例

    • Operator 模式:通过控制器自动管理CR背后的复杂应用(如数据库、监控系统)

  • 动手实践:

    # 1. 查看集群中已有的CRD
    kubectl get crd

    # 2. 尝试安装一个简单的Operator来体验(例如Cert-Manager,用于自动化TLS证书)
    # 参考官方文档:https://cert-manager.io/docs/installation/
    kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.13.0/cert-manager.yaml

    # 3. 查看Cert-Manager创建的CRD和Pod
    kubectl get crd | grep cert-manager
    kubectl get pods -n cert-manager

Day 11:GitOps 实践 – Argo CD 入门 (一)

  • 理论学习:

    • GitOps 核心思想:声明式配置+版本控制+自动化同步

    • Argo CD:流行的GitOps持续交付工具

    • 应用(Application)CRD:定义源代码仓库和目标集群的映射关系

  • 动手实践:

    # 1. 在集群上安装Argo CD
    kubectl create namespace argocd
    kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

    # 2. 获取Argo CD admin用户的初始密码
    kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo

    # 3. 端口转发访问Argo CD Server UI
    kubectl port-forward svc/argocd-server -n argocd 8080:443
    # 浏览器访问 https://localhost:8080 (用户名admin, 密码为上一步获取的)

Day 12:GitOps 实践 – Argo CD 入门 (二)

  • 理论学习:

    • Argo CD 的同步策略:自动(Auto-Sync)和手动(Manual)

    • 健康状态评估与状态可视化

    • 回滚机制

  • 动手实践:

    # 1. 使用CLI登录Argo CD(可选)
    argocd login localhost:8080 --username admin --password <password> --insecure

    # 2. 通过CLI或UI创建一个Application,指向一个包含K8s YAML的公开Git仓库
    # 例如:https://github.com/argoproj/argocd-example-apps
    # UI: 点击"+CREATE APPLICATION",填写Repository URL和Path,目标集群和命名空间
    # CLI:
    argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default

    # 3. 查看应用状态并同步(如果设置为手动同步)
    argocd app get guestbook
    argocd app sync guestbook
    # 在UI上观察应用状态变化

Day 13:配置与密钥管理进阶 (Secrets Store CSI)

  • 理论学习:

    • 将敏感信息(数据库密码、API密钥)与镜像和部署流程分离

    • Secrets Store CSI Driver:从外部秘密仓库(如AWS Secrets Manager, HashiCorp Vault)动态注入秘密

    • 相比原生Secret对象的优势(加密、审计、轮换)

  • 动手实践:

    # 1. 查看/安装Secrets Store CSI Driver(安装较复杂,本日以了解概念和查阅官方文档为主)
    # 官方文档:https://secrets-store-csi-driver.sigs.k8s.io/
    kubectl get pods -n kube-system -l app=secrets-store-csi-driver

    # 2. 思考如何将之前手工创建的Secret(如db-creds)改为从外部Vault中获取
    # 这是一个重要的生产实践理念,具体实现取决于你的秘密管理基础设施。

Day 14:阶段复习与综合挑战

  • 任务: 目标:将第二阶段部署的“三层应用”(前端+后端+数据库)进行改造升级。 要求

    1. Helm化:将整个应用栈编写成一个Helm Chart。

    2. 安全化:为数据库组件创建独立的ServiceAccount。

    3. 资源化:为所有Pod配置合理的Resources Requests和Limits。

    4. 可观测:为前端和后端添加Prometheus注解,使其能被自动抓取(可选)。

    5. 调度优化:为数据库StatefulSet添加Pod反亲和性(preferredDuringSchedulingIgnoredDuringExecution),尝试分散Pod。

    6. GitOps化:将Chart放入Git仓库,在Argo CD中创建Application指向该仓库。

  • 验证:

    • helm install --dry-run --debug 检查模板渲染是否正确。

    • helm install 部署后,验证所有Pod是否正常运行。

    • 在Argo CD UI中查看应用状态是否为“Healthy”和“Synced”。

发表评论

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

滚动至顶部