Kubernetes 概念、部署与运维专业文档

📋 目录

  1. Kubernetes 核心概念
  2. 集群架构详解
  3. 生产环境部署指南
  4. 运维最佳实践
  5. 监控与故障排查
  6. 安全与备份策略

    1. Kubernetes 核心概念

    1.1 基础概念

    Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了声明式配置和自动化运维的能力。

    1.2 核心组件

    控制平面组件

    API Server: Kubernetes控制平面的前端,处理内部和外部的REST调用
    etcd: 高可用的键值存储,用于存储集群配置数据
    Scheduler: 负责将Pod调度到合适的节点上
    Controller Manager: 运行控制器进程,处理集群状态
    Cloud Controller Manager: 云提供商特定的控制器管理

    工作节点组件

    kubelet: 在每个节点上运行的主要代理,确保容器运行在Pod中
    kube-proxy: 维护网络规则,实现网络代理
    Container Runtime: 负责运行容器的软件(如containerd、CRI-O)

    1.3 核心对象

    Pod: Kubernetes中最小的可部署单元,包含一个或多个容器
    Service: 定义一组Pod的访问策略,提供稳定的网络端点
    Deployment: 管理无状态应用的部署和扩展
    StatefulSet: 管理有状态应用的部署
    ConfigMap: 存储配置数据
    Secret: 存储敏感信息

    Ingress: 管理外部访问的规则

    2. 集群架构详解

    2.1 集群组成

    Kubernetes集群由控制平面工作节点组成:

    ┌─────────────────────────────────────────────────────────┐
    │                    控制平面 (Control Plane)              │
    ├─────────────────────────────────────────────────────────┤
    │  API Server  │  etcd  │  Scheduler  │  Controller Manager │
    └─────────────────────────────────────────────────────────┘
                             ↕
    ┌─────────────────────────────────────────────────────────┐
    │                     工作节点 (Worker Nodes)              │
    ├─────────────────────────────────────────────────────────┤
    │  Node 1: kubelet + kube-proxy + container runtime       │
    │  Node 2: kubelet + kube-proxy + container runtime       │
    │  Node 3: kubelet + kube-proxy + container runtime       │
    └─────────────────────────────────────────────────────────┘

    2.2 网络架构

    Kubernetes网络模型要求:
    所有Pod可以在不使用NAT的情况下相互通信
    所有节点可以与所有Pod通信
    Pod看到的自己IP与其他节点看到的IP相同
    网络组件
    CNI插件: 实现网络策略(Calico、Flannel、Cilium等)
    Service: 提供服务发现和负载均衡
    Ingress: 管理外部访问规则

    2.3 存储架构

    PersistentVolume (PV): 集群级别的存储资源
    PersistentVolumeClaim (PVC): 用户对存储的请求

    StorageClass: 定义存储的动态供应策略

    3. 生产环境部署指南

    3.1 部署前准备

    系统要求

    操作系统: Ubuntu 20.04+、CentOS 7+、RHEL 7+
    CPU: 2核以上
    内存: 2GB以上(推荐4GB+)
    磁盘: 20GB以上
    网络: 节点间网络互通

    软件依赖
    # 容器运行时
    containerd.io 或 CRI-O
    # kubeadm、kubelet、kubectl
    apt-get update && apt-get install -y apt-transport-https curl
    curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
    apt-get update
    apt-get install -y kubelet kubeadm kubectl
    apt-mark hold kubelet kubeadm kubectl

    3.2 使用kubeadm部署集群

    3.2.1 初始化控制平面
    # 在主节点上执行
    kubeadm init --apiserver-advertise-address=$(hostname -i) \
      --pod-network-cidr=10.244.0.0/16 \
      --service-cidr=10.96.0.0/12 \
      --kubernetes-version=stable-1.28
    3.2.2 配置kubectl
    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config
    3.2.3 安装网络插件
    # 使用Calico网络插件
    kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
    3.2.4 添加工作节点
    # 在工作节点上执行
    kubeadm join <control-plane-host>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

    3.3 高可用集群部署

    对于生产环境,建议部署高可用集群:
    架构选项
    堆叠etcd拓扑: etcd与控制平面组件运行在同一节点
    外部etcd拓扑: etcd运行在独立节点上
    关键配置

    # 使用负载均衡器(如HAProxy、Nginx)实现API Server高可用
    # 配置多个控制平面节点
    # 使用外部etcd集群提供数据存储

    3.4 云平台部署

    GCP部署
    # 使用GKE创建集群
    gcloud container clusters create my-cluster \
      --num-nodes=3 \
      --machine-type=e2-medium \
      --zone=us-central1-a
    AWS部署
    # 使用EKS创建集群
    eksctl create cluster \
      --name my-cluster \
      --region us-west-2 \
      --nodes 3 \
      --node-type t3.medium

    4. 运维最佳实践

    4.1 资源管理

    4.1.1 资源请求和限制
    apiVersion: v1
    kind: Pod
    metadata:
      name: resource-limits-pod
    spec:
      containers:
      - name: app
     image: nginx
     resources:
       requests:
         cpu: "100m"
         memory: "128Mi"
       limits:
         cpu: "500m"
         memory: "512Mi"
    4.1.2 资源配额
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: compute-resources
      namespace: development
    spec:
      hard:
     requests.cpu: "4"
     requests.memory: 8Gi
     limits.cpu: "8"
     limits.memory: 16Gi

    4.2 配置管理

    4.2.1 ConfigMap使用
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: app-config
    data:
      database_url: "postgresql://localhost:5432/mydb"
      cache_enabled: "true"
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: configmap-demo-pod
    spec:
      containers:
     - name: demo
       image: nginx
       envFrom:
       - configMapRef:
           name: app-config
    4.2.2 Secret管理
    apiVersion: v1
    kind: Secret
    metadata:
      name: db-secret
    type: Opaque
    data:
      username: YWRtaW4=  # base64编码
      password: cGFzc3dvcmQ=

    4.3 部署策略

    4.3.1 滚动更新
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: rolling-update-demo
    spec:
      replicas: 3
      strategy:
     type: RollingUpdate
     rollingUpdate:
       maxSurge: 1        # 升级过程中最多可以比原先设置的Pod数多出的数量
       maxUnavailable: 1  # 升级过程中最多有多少个Pod处于不可用状态
      selector:
     matchLabels:
       app: nginx
      template:
     metadata:
       labels:
         app: nginx
     spec:
       containers:
       - name: nginx
         image: nginx:1.14.2
         ports:
         - containerPort: 80
    4.3.2 金丝雀发布
    # 创建新版本的Deployment
    kubectl apply -f canary-deployment.yaml
    # 逐步调整流量比例
    kubectl patch deployment canary-app -p '{"spec":{"replicas":1}}'

    4.4 自动扩展

    4.4.1 水平Pod自动扩展(HPA)
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: php-apache
    spec:
      scaleTargetRef:
     apiVersion: apps/v1
     kind: Deployment
     name: php-apache
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Resource
     resource:
       name: cpu
       target:
         type: Utilization
         averageUtilization: 50
    4.4.2 集群自动扩展
    # Cluster Autoscaler配置
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cluster-autoscaler
      namespace: kube-system
    data:
      balance-similar-node-groups: "true"
      skip-nodes-with-system-pods: "true"

    4.5 安全最佳实践

    4.5.1 Pod安全策略
    apiVersion: v1
    kind: Pod
    metadata:
      name: security-context-demo
    spec:
      securityContext:
     runAsNonRoot: true
     runAsUser: 1000
     fsGroup: 2000
      containers:
      - name: sec-ctx-demo
     image: gcr.io/google-samples/node-hello:1.0
     securityContext:
       allowPrivilegeEscalation: false
       capabilities:
         drop:
         - ALL
       volumeMounts:
       - name: data-vol
         mountPath: /data
         readOnly: true
    4.5.2 网络策略
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all
    spec:
      podSelector: {}
      policyTypes:
      - Ingress
      - Egress
    4.5.3 RBAC配置
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: deployment-sa
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: deployment-role
  7. apiGroups: ["apps"]
    resources: ["deployments"]

    verbs: ["get", "list", "watch", "create", "update", "patch"]

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
    name: deployment-rolebinding
    subjects:

  8. kind: ServiceAccount
    name: deployment-sa
    roleRef:
    kind: Role
    name: deployment-role
    apiGroup: rbac.authorization.k8s.io

    ---
    ## 5. 监控与故障排查
    ### 5.1 监控体系
    #### 5.1.1 监控架构

    应用层 → Prometheus → Grafana → AlertManager

    Node Exporter

    Kube-State-Metrics

    cAdvisor

    #### 5.1.2 关键监控指标
  9. 节点状态(Ready、NotReady)
  10. 资源使用率(CPU、内存、磁盘、网络)
  11. Pod状态(Running、Pending、Failed)
  12. API Server性能
    应用级别指标
  13. 请求延迟
  14. 错误率
  15. 吞吐量
  16. 饱和度

    5.1.3 Prometheus配置
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: prometheus-config
      namespace: monitoring
    data:
      prometheus.yml: |
     global:
       scrape_interval: 15s
       evaluation_interval: 15s
     
     scrape_configs:
     - job_name: 'kubernetes-apiservers'
       kubernetes_sd_configs:
       - role: endpoints
       scheme: https
       tls_config:
         ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
       bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
       relabel_configs:
       - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
         action: keep
         regex: default;kubernetes;https
     
     - job_name: 'kubernetes-nodes'
       kubernetes_sd_configs:
       - role: node
       scheme: https
       tls_config:
         ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
       bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
       relabel_configs:
       - action: labelmap
         regex: __meta_kubernetes_node_label_(.+)

    5.2 日志管理

    5.2.1 日志架构
    应用日志 → Fluentd/Fluent Bit → Elasticsearch → Kibana
          ↓
       日志轮转
          ↓
       日志归档
    5.2.2 日志收集配置
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: fluentd-config
      namespace: kube-system
    data:
      fluent.conf: |
     <source>
       @type tail
       path /var/log/containers/*.log
       pos_file /var/log/fluentd-containers.log.pos
       tag kubernetes.*
       read_from_head true
       <parse>
         @type json
         time_format %Y-%m-%dT%H:%M:%S.%NZ
       </parse>
     </source>
     
     <filter kubernetes.**>
       @type kubernetes_metadata
     </filter>
     
     <match **>
       @type elasticsearch
       host elasticsearch.logging
       port 9200
       logstash_format true
       logstash_prefix kubernetes
       <buffer>
         @type file
         path /var/log/fluentd-buffers/kubernetes.system.buffer
         flush_mode interval
         flush_interval 5s
       </buffer>
     </match>

    5.3 故障排查

    5.3.1 常见问题诊断流程

    Pod启动失败

    # 查看Pod状态
    kubectl get pods -n <namespace>
    # 查看Pod详情
    kubectl describe pod <pod-name> -n <namespace>
    # 查看Pod日志
    kubectl logs <pod-name> -n <namespace>
    # 查看事件
    kubectl get events -n <namespace> --sort-by='.lastTimestamp'

    节点问题

    # 查看节点状态
    kubectl get nodes
    # 查看节点详情
    kubectl describe node <node-name>
    # 检查kubelet日志
    journalctl -u kubelet -f

    网络问题

    # 检查DNS解析
    kubectl exec -it <pod-name> -- nslookup kubernetes.default
    # 检查网络策略
    kubectl get networkpolicies -A
    # 检查Service端点
    kubectl get endpoints <service-name>
    5.3.2 常见错误及解决方案

    CrashLoopBackOff

  17. 检查应用日志
  18. 验证配置正确性
  19. 检查资源限制
  20. 验证依赖服务可用性
    ImagePullBackOff
  21. 验证镜像名称和标签
  22. 检查镜像仓库访问权限
  23. 验证网络连接
  24. 检查镜像拉取策略
    OOMKilled
  25. 增加内存限制
  26. 优化应用内存使用
  27. 检查内存泄漏
  28. 调整Pod资源请求
    Node Not Ready
  29. 检查kubelet服务状态
  30. 验证网络连接
  31. 检查磁盘空间
  32. 验证容器运行时状态

    5.3.3 性能调优

    集群级别优化

    # 调整kubelet参数
    cat > /etc/systemd/system/kubelet.service.d/10-kubeadm.conf <<EOF
    [Service]
    Environment="KUBELET_EXTRA_ARGS=--max-pods=110 --pod-max-pids-per-container=4096"
    EOF
    systemctl daemon-reload
    systemctl restart kubelet

    应用级别优化

    # 资源限制优化
    resources:
      requests:
     cpu: "200m"
     memory: "256Mi"
      limits:
     cpu: "1000m"
     memory: "1Gi"
    # 健康检查优化
    livenessProbe:
      httpGet:
     path: /health
     port: 8080
      initialDelaySeconds: 30
      periodSeconds: 10
      timeoutSeconds: 5
      failureThreshold: 3
    readinessProbe:
      httpGet:
     path: /ready
     port: 8080
      initialDelaySeconds: 5
      periodSeconds: 5
      timeoutSeconds: 3
      failureThreshold: 3

    6. 安全与备份策略

    6.1 集群安全

    6.1.1 集群加固
    # 加固API Server
    --anonymous-auth=false
    --authorization-mode=Node,RBAC
    --enable-admission-plugins=NodeRestriction,PodSecurityPolicy
    # 加固kubelet
    --authorization-mode=Webhook
    --client-ca-file=/etc/kubernetes/pki/ca.crt
    --read-only-port=0
    # 加固etcd
    --client-cert-auth
    --peer-client-cert-auth
    6.1.2 镜像安全
    # 使用私有镜像仓库
    # 镜像扫描
    trivy image my-registry/my-app:latest
    # 签名验证
    cosign verify my-registry/my-app:latest

    6.2 备份与恢复

    6.2.1 etcd备份
    # 备份etcd数据
    ETCDCTL_API=3 etcdctl snapshot save snapshot.db \
      --cacert=/etc/kubernetes/pki/etcd/ca.crt \
      --cert=/etc/kubernetes/pki/etcd/server.crt \
      --key=/etc/kubernetes/pki/etcd/server.key
    # 恢复etcd数据
    ETCDCTL_API=3 etcdctl snapshot restore snapshot.db \
      --data-dir=/var/lib/etcd-backup \
      --cacert=/etc/kubernetes/pki/etcd/ca.crt \
      --cert=/etc/kubernetes/pki/etcd/server.crt \
      --key=/etc/kubernetes/pki/etcd/server.key
    6.2.2 应用备份

    使用Velero进行应用备份:

    # 安装Velero
    velero install --provider aws \
      --plugins velero/velero-plugin-for-aws:v1.5.0 \
      --bucket velero-backup \
      --secret-file ./credentials-velero \
      --use-volume-snapshots=false \
      --backup-location-config region=us-west-2
    # 创建备份
    velero backup create my-backup --include-namespaces my-namespace
    # 恢复备份
    velero restore create --from-backup my-backup
    6.2.3 灾难恢复计划

    RTO/RPO目标

  33. 恢复时间目标(RTO): 4小时
  34. 恢复点目标(RPO): 15分钟
    恢复步骤
  35. 评估灾难影响范围
  36. 恢复etcd数据
  37. 重启控制平面组件
  38. 恢复工作节点
  39. 验证应用状态
  40. 切换流量

    6.3 合规性管理

    6.3.1 审计日志
    apiVersion: audit.k8s.io/v1
    kind: Policy
  41. level: Metadata
    resources:

    • group: ""

    resources: ["pods", "services", "deployments"]

  42. level: RequestResponse
    resources:

    • group: ""

    resources: ["secrets"]

    #### 6.3.2 合规性检查

    使用kube-bench进行安全检查

    kube-bench --benchmark cis-1.23

    使用kube-hunter进行漏洞扫描

    kube-hunter --remote kube-cluster.example.com

    ---
    ## 7. 运维工具链
    ### 7.1 部署工具
    **kubeadm**: 官方集群初始化工具
    **kops**: AWS上的集群管理工具
    **RKE**: Rancher Kubernetes Engine
    **Kubespray**: 基于Ansible的部署工具
    ### 7.2 监控工具
    **Prometheus**: 时序数据库和监控系统
    **Grafana**: 可视化仪表板
    **AlertManager**: 告警管理
    **Thanos**: 长期存储解决方案
    ### 7.3 日志工具
    **ELK Stack**: Elasticsearch、Logstash、Kibana
    **EFK Stack**: Elasticsearch、Fluentd、Kibana
    **Loki**: 轻量级日志聚合系统
    ### 7.4 CI/CD集成
    **ArgoCD**: GitOps持续交付工具
    **Flux**: 声明式GitOps操作工具
    **Jenkins**: 自动化服务器
    **GitLab CI/CD**: 集成的CI/CD工具
    ---
    ## 8. 最佳实践总结
  43. 声明式配置: 使用YAML文件定义期望状态
  44. 不可变基础设施: 避免手动修改运行中的资源
  45. 最小权限原则: 限制Pod和用户的权限
  46. 资源限制: 为所有Pod设置资源请求和限制
  47. 健康检查: 配置liveness和readiness探针

    8.2 运维建议

  48. 定期备份: 建立自动化的备份策略
  49. 监控告警: 设置合理的监控指标和告警阈值
  50. 日志收集: 集中收集和分析日志
  51. 安全更新: 定期更新集群组件和应用程序
  52. 容量规划: 基于监控数据进行容量规划

    8.3 故障处理

  53. 建立故障处理流程: 定义故障分类和处理步骤
  54. 文档化: 记录常见问题和解决方案
  55. 演练: 定期进行故障演练
  56. 事后分析: 对重大故障进行根因分析

    9. 参考资源

    9.1 官方文档

  57. Kubernetes官方文档
  58. kubeadm部署指南
  59. Kubernetes安全最佳实践

    9.2 社区资源

  60. CNCF Landscape
  61. Kubernetes GitHub
  62. Kubernetes社区论坛

    9.3 学习资源

  63. CKA认证考试
  64. CKAD认证考试
  65. Kubernetes在线课程

    文档版本: v1.0
    最后更新: 2026-03-22
    维护者: 运维守护者
    联系方式: devops@example.com
    这份文档涵盖了Kubernetes的核心概念、生产环境部署、运维最佳实践、监控故障排查、安全备份等关键内容,为运维团队提供了全面的指导。建议根据实际环境需求进行调整和补充。


西安小哥
1.3k 声望88 粉丝

thinking、doing、do better、do much better than today。exchange 、sharing、improve as quickly as possible。