1. Kubernetes资源与对象概述
在容器编排领域,Kubernetes(简称k8s)通过抽象化的资源对象来管理系统中的各种组件。这些资源对象是k8s集群中的基本构建块,每个对象都代表着集群的一个特定状态。理解这些资源及其管理方式,是掌握k8s核心功能的关键。
我刚开始接触k8s时,最困惑的就是各种资源类型之间的关系。经过多个生产环境的实践,我发现把这些资源按照功能维度分类理解会容易很多。k8s资源大致可以分为工作负载(Workload)、服务发现与负载均衡(Service)、配置与存储(Config&Storage)、集群(Cluster)等几大类。
2. 核心资源类型详解
2.1 工作负载类资源
Pod是k8s中最小的部署单元,它代表集群中运行的一个或多个容器。在实际操作中,我们很少直接管理Pod,而是通过更高层次的抽象来管理:
- Deployment:最常用的无状态应用部署方式
- StatefulSet:用于有状态应用的部署
- DaemonSet:确保每个节点运行一个Pod副本
- Job/CronJob:用于批处理任务
# 典型的Deployment配置示例 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 802.2 服务发现与负载均衡
Service是k8s中实现服务发现的核心资源。根据使用场景不同,Service有几种类型:
- ClusterIP:默认类型,分配集群内部IP
- NodePort:通过节点端口暴露服务
- LoadBalancer:使用云提供商的负载均衡器
- ExternalName:通过CNAME记录映射到外部服务
重要提示:Service通过selector与Pod关联,确保selector中定义的标签与Pod标签匹配,这是服务发现正常工作的关键。
2.3 配置与存储资源
ConfigMap和Secret用于解耦配置与容器镜像:
- ConfigMap:存储非敏感配置数据
- Secret:存储敏感信息(自动base64编码)
持久化存储涉及以下资源:
- PersistentVolume(PV):集群中的存储资源
- PersistentVolumeClaim(PVC):用户对存储的请求
- StorageClass:动态卷供应的模板
3. 资源管理方式
3.1 声明式管理
k8s推荐使用声明式管理,即通过yaml/json文件描述期望状态。这种方式的核心命令是:
kubectl apply -f deployment.yaml声明式管理的好处是:
- 可版本控制
- 可重复部署
- 支持差异比对(kubectl diff)
3.2 命令式管理
虽然不推荐生产环境使用,但命令式管理在调试时很有用:
# 创建Deployment kubectl create deployment nginx --image=nginx # 扩缩容 kubectl scale deployment nginx --replicas=33.3 资源配额管理
在多租户环境中,资源配额(ResourceQuota)非常重要:
apiVersion: v1 kind: ResourceQuota metadata: name: mem-cpu-quota spec: hard: requests.cpu: "2" requests.memory: 4Gi limits.cpu: "4" limits.memory: 8Gi4. 高级资源管理技巧
4.1 资源请求与限制
为容器设置合理的requests和limits是保证集群稳定的关键:
resources: requests: cpu: "500m" memory: "512Mi" limits: cpu: "1000m" memory: "1Gi"经验之谈:生产环境中一定要设置limits,避免单个容器耗尽节点资源。requests总和不要超过节点可用资源的70%,为系统进程留出空间。
4.2 亲和性与反亲和性
通过节点亲和性(nodeAffinity)和Pod亲和性/反亲和性(podAffinity/podAntiAffinity)可以优化调度:
affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - nginx topologyKey: "kubernetes.io/hostname"4.3 水平Pod自动扩缩(HPA)
HPA根据CPU/内存使用率或其他自定义指标自动调整Pod数量:
kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=105. 常见问题排查
5.1 资源创建失败排查流程
- 检查yaml语法:
kubectl apply --validate -f file.yaml - 查看事件:
kubectl describe <resource> <name> - 检查控制器日志:
kubectl logs <pod-name> -c <container-name>
5.2 资源状态异常分析
常见异常状态及原因:
- Pending:调度问题(资源不足、亲和性规则等)
- CrashLoopBackOff:容器启动失败
- ImagePullBackOff:镜像拉取失败
- Evicted:节点资源不足被驱逐
5.3 性能优化建议
- 设置合理的liveness和readiness探针
- 使用podDisruptionBudget保证可用性
- 定期清理未使用的资源(如失败的Job)
- 监控资源使用率并调整requests/limits
6. 资源管理最佳实践
经过多个集群的管理经验,我总结了以下最佳实践:
- 所有资源配置必须版本化,禁止直接使用命令式修改
- 为不同环境(dev/staging/prod)使用不同的命名空间
- 为每个团队/项目设置合理的ResourceQuota
- 使用NetworkPolicy进行网络隔离
- 定期审计集群资源使用情况
对于资源限制的设置,我通常采用"黄金比例"法则:limits是requests的2倍,这样既保证了突发性能,又避免了资源浪费。对于关键业务应用,建议设置podAntiAffinity确保高可用。