Kubernetes 概念、部署与运维专业文档
📋 目录
- Kubernetes 核心概念
- 集群架构详解
- 生产环境部署指南
- 运维最佳实践
- 监控与故障排查
安全与备份策略
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 kubectl3.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.283.2.2 配置kubectl
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config3.2.3 安装网络插件
# 使用Calico网络插件 kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml3.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-aAWS部署
# 使用EKS创建集群 eksctl create cluster \ --name my-cluster \ --region us-west-2 \ --nodes 3 \ --node-type t3.medium4. 运维最佳实践
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: 16Gi4.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-config4.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: 804.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: 504.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: true4.5.2 网络策略
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all spec: podSelector: {} policyTypes: - Ingress - Egress4.5.3 RBAC配置
apiVersion: v1 kind: ServiceAccount metadata: name: deployment-sa --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: deployment-roleapiGroups: ["apps"]
resources: ["deployments"]verbs: ["get", "list", "watch", "create", "update", "patch"]
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: deployment-rolebinding
subjects: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 关键监控指标- 节点状态(Ready、NotReady)
- 资源使用率(CPU、内存、磁盘、网络)
- Pod状态(Running、Pending、Failed)
- API Server性能
应用级别指标: - 请求延迟
- 错误率
- 吞吐量
饱和度
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:
- 检查应用日志
- 验证配置正确性
- 检查资源限制
- 验证依赖服务可用性
ImagePullBackOff: - 验证镜像名称和标签
- 检查镜像仓库访问权限
- 验证网络连接
- 检查镜像拉取策略
OOMKilled: - 增加内存限制
- 优化应用内存使用
- 检查内存泄漏
- 调整Pod资源请求
Node Not Ready: - 检查kubelet服务状态
- 验证网络连接
- 检查磁盘空间
验证容器运行时状态
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: 36. 安全与备份策略
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-auth6.1.2 镜像安全
# 使用私有镜像仓库 # 镜像扫描 trivy image my-registry/my-app:latest # 签名验证 cosign verify my-registry/my-app:latest6.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.key6.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-backup6.2.3 灾难恢复计划
RTO/RPO目标:
- 恢复时间目标(RTO): 4小时
- 恢复点目标(RPO): 15分钟
恢复步骤: - 评估灾难影响范围
- 恢复etcd数据
- 重启控制平面组件
- 恢复工作节点
- 验证应用状态
切换流量
6.3 合规性管理
6.3.1 审计日志
apiVersion: audit.k8s.io/v1 kind: Policylevel: Metadata
resources:- group: ""
resources: ["pods", "services", "deployments"]
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. 最佳实践总结- 声明式配置: 使用YAML文件定义期望状态
- 不可变基础设施: 避免手动修改运行中的资源
- 最小权限原则: 限制Pod和用户的权限
- 资源限制: 为所有Pod设置资源请求和限制
健康检查: 配置liveness和readiness探针
8.2 运维建议
- 定期备份: 建立自动化的备份策略
- 监控告警: 设置合理的监控指标和告警阈值
- 日志收集: 集中收集和分析日志
- 安全更新: 定期更新集群组件和应用程序
容量规划: 基于监控数据进行容量规划
8.3 故障处理
- 建立故障处理流程: 定义故障分类和处理步骤
- 文档化: 记录常见问题和解决方案
- 演练: 定期进行故障演练
事后分析: 对重大故障进行根因分析
9. 参考资源
9.1 官方文档
- Kubernetes官方文档
- kubeadm部署指南
9.2 社区资源
- CNCF Landscape
- Kubernetes GitHub
9.3 学习资源
- CKA认证考试
- CKAD认证考试
Kubernetes在线课程
文档版本: v1.0
最后更新: 2026-03-22
维护者: 运维守护者
联系方式: devops@example.com
这份文档涵盖了Kubernetes的核心概念、生产环境部署、运维最佳实践、监控故障排查、安全备份等关键内容,为运维团队提供了全面的指导。建议根据实际环境需求进行调整和补充。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。