1. 项目背景与核心价值
在云原生技术领域,Kubernetes(简称k8s)已经成为容器编排的事实标准。从业十年间,我见证了k8s从最初的Borg论文概念发展到如今支撑全球数百万应用的庞大生态。"k8s十年签证"这个比喻形象地描述了掌握k8s核心技能对技术人职业生涯的长期价值——就像获得了一张在云原生领域畅通无阻的长期通行证。
实际工作中,一个完整的k8s生产环境部署往往涉及20+核心组件和100+配置参数。新手常会陷入"部署成功但生产不可用"的困境,这正是我们需要系统化掌握k8s的原因。下面我将从集群搭建、组件配置到生产实践,分享真正经得起十年考验的k8s核心知识体系。
2. 集群搭建:从零到生产就绪
2.1 基础设施选型要点
生产级k8s集群的硬件配置需要遵循"3-2-1"原则:
- 3个控制平面节点(确保etcd集群高可用)
- 2个以上工作节点(根据业务负载动态扩展)
- 1套独立的网络存储(推荐Ceph或NFS)
# 节点最低配置示例(生产环境): 控制节点:4核CPU/8GB内存/100GB磁盘 工作节点:根据业务需求,建议8核CPU起特别注意:Ubuntu 22.04是目前对k8s兼容性最好的Linux发行版,其内置的5.15内核完美支持cgroup v2和eBPF等新特性。
2.2 关键组件部署实战
使用kubeadm部署时需要特别注意以下参数:
kubeadm init \ --control-plane-endpoint "CLUSTER_DNS:6443" \ --pod-network-cidr=10.244.0.0/16 \ --service-cidr=10.96.0.0/12 \ --upload-certs网络插件选择建议:
- Flannel:最适合新手,但功能简单
- Calico:生产首选,支持网络策略
- Cilium:未来趋势,基于eBPF技术
3. 核心组件深度配置
3.1 CoreDNS优化方案
默认的双副本部署确实存在单点风险。生产环境建议:
apiVersion: apps/v1 kind: Deployment metadata: name: coredns spec: replicas: 3 # 根据集群规模调整 strategy: rollingUpdate: maxUnavailable: 1 template: spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: k8s-app operator: In values: [kube-dns] topologyKey: kubernetes.io/hostname3.2 ConfigMap与Secret最佳实践
安全敏感配置必须使用Secret:
# 创建通用Secret kubectl create secret generic db-creds \ --from-literal=username=admin \ --from-literal=password='S!B\*d$zDsb=' # 挂载到Pod volumeMounts: - name: creds-volume mountPath: "/etc/credentials" readOnly: true血泪教训:曾因在ConfigMap中明文存储数据库密码导致安全事故,现在所有敏感信息必须走Secret并启用加密存储(--encryption-provider-config)。
4. 典型工作负载部署
4.1 有状态服务:PostgreSQL部署
apiVersion: apps/v1 kind: StatefulSet metadata: name: postgres spec: serviceName: "postgres" replicas: 3 volumeClaimTemplates: - metadata: name: pgdata spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "ceph-rbd" resources: requests: storage: 100Gi template: spec: containers: - name: postgres image: postgres:14 ports: - containerPort: 5432 volumeMounts: - name: pgdata mountPath: /var/lib/postgresql/data resources: limits: memory: "4Gi" cpu: "2"4.2 GPU资源调度方案
对于AI训练场景:
resources: limits: nvidia.com/gpu: 2配合节点标签实现分片调度:
kubectl label nodes gpu-node-1 gpu-type=a100 kubectl label nodes gpu-node-2 gpu-type=v1005. 生产环境关键配置
5.1 资源限制与配额管理
内存限制必须设置:
resources: requests: memory: "256Mi" cpu: "250m" limits: memory: "512Mi" cpu: "500m"集群级配额示例:
apiVersion: v1 kind: ResourceQuota metadata: name: team-quota spec: hard: pods: "100" requests.cpu: "20" requests.memory: 100Gi limits.cpu: "40" limits.memory: 200Gi5.2 网络策略实战
只允许前端访问API服务:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: api-allow-frontend spec: podSelector: matchLabels: app: api-server policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: frontend ports: - protocol: TCP port: 80806. 运维监控体系搭建
6.1 核心监控指标
必须监控的黄金指标:
- 节点资源利用率(CPU/Mem/Disk)
- Pod重启次数
- API Server延迟
- etcd写入延迟
- 网络丢包率
推荐Prometheus采集配置:
- job_name: 'kubernetes-pods' kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] action: keep regex: true6.2 日志收集方案
EFK栈部署要点:
# Fluentd配置片段 <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>7. 故障排查手册
7.1 常见问题速查表
| 故障现象 | 排查命令 | 解决方案 |
|---|---|---|
| Pod一直Pending | kubectl describe pod <name> | 检查资源配额和节点污点 |
| 服务无法访问 | kubectl get endpoints | 验证Service selector匹配 |
| 镜像拉取失败 | kubectl get events | 检查imagePullSecrets |
| DNS解析超时 | kubectl exec -it <pod> -- nslookup kubernetes.default | 检查CoreDNS副本数 |
7.2 必须掌握的调试命令
# 查看kubelet日志 journalctl -u kubelet -f # 检查证书有效期 openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates # 网络连通性测试 kubectl run -it --rm debug --image=nicolaka/netshoot -- bash8. 版本升级策略
采用滚动升级方案:
- 先升级kubeadm控制平面
kubeadm upgrade apply v1.28.0- 逐个drain工作节点
kubectl drain <node> --ignore-daemonsets- 升级kubelet和kubectl
apt-get update && apt-get install -y kubelet=1.28.0-00 kubectl=1.28.0-00- 解除节点保护
kubectl uncordon <node>十年经验证明,保持k8s版本在N-2范围内(当前最新1.28,则运行1.26+)能获得最佳稳定性与新特性平衡。