1. Kubernetes核心概念解析
Kubernetes(简称K8s)作为容器编排领域的事实标准,已经成为现代云原生应用的基石。我第一次在生产环境接触K8s是在2017年,当时为了迁移一个传统单体应用到容器化架构,经历了从手动管理Docker容器到采用K8s编排的完整转型过程。这个开源系统最初由Google设计,现在由云原生计算基金会(CNCF)维护,它彻底改变了我们部署、扩展和管理容器化应用的方式。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心架构与组件
2.1 控制平面组件
控制平面是K8s集群的大脑,包含以下几个关键组件:
-
API Server:集群的前端接口,所有通信都通过这个RESTful API进行。我们在实际运维中发现,合理配置API Server的--max-requests-inflight参数对避免API过载至关重要。
-
etcd:高可用的键值存储,保存集群所有状态数据。生产环境必须配置至少3个节点的etcd集群,并且要定期备份。有次我们的etcd磁盘写满导致整个集群不可用,教训深刻。
-
Controller Manager:运行各种控制器进程,确保集群状态符合预期。比如Replication Controller确保Pod副本数始终满足定义。
-
Scheduler:决定Pod应该运行在哪个节点上。可以通过自定义调度器策略实现特殊调度需求。
2.2 工作节点组件
每个工作节点运行着以下核心服务:
-
kubelet:节点代理,负责与API Server通信并管理本机容器。我们曾遇到kubelet内存泄漏问题,需要定期监控其资源使用。
-
kube-proxy:维护节点网络规则,实现Service的抽象。性能敏感场景建议使用IPVS模式替代默认的iptables。
-
容器运行时:通常是Docker或containerd。生产环境推荐使用containerd,它比Docker更轻量稳定。
3. 关键对象模型
3.1 Pod:最小部署单元
Pod是K8s中最小的可部署单元,包含一个或多个紧密耦合的容器。实际使用中有几个重要经验:
-
多容器Pod适用于需要共享网络/存储的紧密耦合服务,比如日志收集sidecar。
-
合理设置resources.requests/limits避免资源争抢。我们曾因未设置内存限制导致OOM杀死关键业务Pod。
-
使用readinessProbe和livenessProbe确保应用健康状态。配置不当会导致频繁Pod重启。
3.2 Deployment:声明式更新
Deployment是管理Pod副本集的推荐方式,支持滚动更新和回滚。关键配置项包括:
yaml复制spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
spec:
containers:
- name: app
image: myapp:v1.2.3
resources:
limits:
cpu: "1"
memory: 1Gi
3.3 Service:服务发现与负载均衡
Service为一组Pod提供稳定的访问端点,主要类型包括:
- ClusterIP:默认类型,集群内部访问
- NodePort:通过节点端口暴露服务
- LoadBalancer:使用云提供商的负载均衡器
- ExternalName:映射到外部DNS名称
4. 网络模型深度解析
K8s网络模型要求每个Pod都有唯一IP,且所有Pod可以直接通信。实现这一模型通常需要CNI插件:
-
Flannel:简单易用,适合中小集群。我们早期使用VXLAN后端,后来切换到host-gw提升性能。
-
Calico:支持网络策略,适合安全要求高的场景。BGP模式能提供更好的网络性能。
-
Cilium:基于eBPF,提供高级网络可视化和安全功能。新集群推荐使用。
重要提示:跨可用区部署时,要特别注意网络延迟和带宽限制。我们曾因东西向流量过大导致网络拥塞。
5. 存储管理实践
5.1 持久卷(PV)和持久卷声明(PVC)
K8s通过PV和PVC抽象存储细节。常用卷类型包括:
- AWS EBS/GCP PD/Azure Disk:云块存储
- NFS:适合共享存储场景
- Ceph RBD:自建存储集群方案
5.2 StatefulSet管理有状态应用
StatefulSet为有状态应用提供:
- 稳定的网络标识
- 有序部署和扩展
- 持久存储
配置示例:
yaml复制apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: "mysql"
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
6. 安全最佳实践
6.1 RBAC权限控制
Role和RoleBinding定义细粒度访问控制。生产环境必须禁用匿名访问并启用RBAC:
bash复制kubectl create role pod-reader --verb=get,list,watch --resource=pods
kubectl create rolebinding dev-pod-reader --role=pod-reader --user=dev-user
6.2 网络安全策略
使用NetworkPolicy限制Pod间通信:
yaml复制apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-access
spec:
podSelector:
matchLabels:
role: db
ingress:
- from:
- podSelector:
matchLabels:
role: api
ports:
- protocol: TCP
port: 5432
7. 监控与日志
7.1 监控方案
推荐Prometheus + Grafana组合:
- 使用kube-state-metrics获取集群状态指标
- node-exporter收集节点指标
- 自定义应用指标通过/metrics端点暴露
7.2 日志收集
常用方案:
- EFK(Elasticsearch+Fluentd+Kibana)
- Loki+Promtail+Grafana(轻量级替代方案)
我们采用的技术栈:
mermaid复制graph TD
A[应用Pod] -->|stdout/stderr| B(Fluentd DaemonSet)
B --> C[Kafka]
C --> D[Fluentd]
D --> E[Elasticsearch]
E --> F[Kibana]
8. 常见问题排查
8.1 Pod启动失败
排查步骤:
kubectl describe pod <pod-name>kubectl logs <pod-name> [-c container-name]- 检查事件:
kubectl get events --sort-by=.metadata.creationTimestamp
常见原因:
- 镜像拉取失败(检查镜像地址和凭证)
- 资源不足(检查requests/limits)
- 健康检查配置错误
8.2 网络连接问题
诊断工具:
bash复制# 进入Pod网络命名空间调试
kubectl run -it --rm debug --image=nicolaka/netshoot --restart=Never
常见问题:
- CNI插件未正确安装
- 网络策略阻止了通信
- 节点防火墙规则冲突
9. 集群运维经验
9.1 升级策略
生产环境升级建议:
- 先升级控制平面组件
- 然后升级工作节点(逐个节点滚动升级)
- 使用kubeadm upgrade plan检查升级路径
9.2 备份恢复
关键数据备份:
- etcd数据:定期使用etcdctl snapshot save
- 资源定义:使用kubectl get --export或Velero工具
- 持久卷数据:依赖存储系统快照功能
10. 性能优化技巧
10.1 节点配置
- 关闭swap(K8s v1.8+默认要求)
- 调整内核参数:
bash复制
sysctl -w vm.swappiness=0 sysctl -w vm.overcommit_memory=1 - 使用性能更好的容器运行时(如containerd)
10.2 调度优化
- 设置适当的Pod亲和性/反亲和性规则
- 使用Pod拓扑分布约束平衡节点负载
- 为关键Pod配置优先级和抢占
我在实际运维中发现,K8s集群性能瓶颈往往出现在网络和存储IO上。建议在部署前做好性能基准测试,特别是对网络插件和存储驱动的测试。另外,合理设置HPA(Horizontal Pod Autoscaler)的指标阈值对应对突发流量非常重要。
