1. Kubernetes基础概念快速回顾
Kubernetes(简称k8s)作为容器编排领域的事实标准,其核心架构由以下几个关键组件构成:
- Master节点:集群的大脑,包含API Server(唯一入口)、Scheduler(调度决策)、Controller Manager(状态维护)和etcd(分布式存储)
- Node节点:工作负载执行者,包含kubelet(节点代理)、kube-proxy(网络代理)和容器运行时(如Docker)
- Pod:最小调度单元,包含一个或多个紧密关联的容器
- Service:稳定的网络端点,为动态Pod提供访问抽象
注意:生产环境中Master组件需要高可用部署,通常采用3节点或5节点集群
2. 核心组件工作原理深度解析
2.1 API Server的请求处理流程
- 认证(Authentication):验证客户端身份,支持X509证书、Bearer Token等多种方式
- 授权(Authorization):RBAC检查操作权限
- 准入控制(Admission Control):动态修改或拒绝请求(如资源限制、镜像校验)
- 持久化:通过etcd存储集群状态
# 典型API请求示例 curl -X GET $APISERVER/api/v1/namespaces/default/pods \ --header "Authorization: Bearer $TOKEN" \ --cacert /path/to/ca.crt2.2 kube-scheduler的调度决策
调度分为两个阶段:
- 过滤阶段:排除不满足条件的节点(如资源不足、节点亲和性冲突)
- 打分阶段:对剩余节点评分(考虑资源平衡、跨AZ分布等)
# 自定义调度器配置示例 apiVersion: kubescheduler.config.k8s.io/v1beta2 kind: KubeSchedulerConfiguration profiles: - schedulerName: custom-scheduler plugins: score: enabled: - name: NodeResourcesBalancedAllocation - name: ImageLocality3. 网络模型与Service实现机制
3.1 CNI插件工作原理
- kubelet调用CNI插件二进制(如Calico、Flannel)
- 插件配置容器网络命名空间
- 建立跨主机通信通道(VxLAN/IPIP等)
# 查看CNI配置 cat /etc/cni/net.d/10-calico.conflist3.2 Service的四种类型对比
| 类型 | 特点 | 典型用例 |
|---|---|---|
| ClusterIP | 集群内访问 | 内部服务通信 |
| NodePort | 节点端口暴露 | 开发测试环境 |
| LoadBalancer | 云厂商负载均衡集成 | 生产环境对外服务 |
| ExternalName | CNAME映射外部服务 | 集成传统系统 |
4. 存储卷管理与StatefulSet实践
4.1 PV/PVC生命周期
- 管理员创建PV(指定容量、访问模式等)
- 用户创建PVC进行声明
- 控制器绑定可用PV
- Pod挂载PVC使用存储
# StatefulSet存储配置示例 apiVersion: apps/v1 kind: StatefulSet spec: volumeClaimTemplates: - metadata: name: www spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "ssd" resources: requests: storage: 10Gi4.2 常见存储方案选型
- 本地存储:hostPath(仅测试)、local volume(生产可用)
- 网络存储:NFS、iSCSI
- 云存储:AWS EBS、Azure Disk
- 分布式存储:Ceph RBD、GlusterFS
5. 安全管控最佳实践
5.1 RBAC配置要点
- 遵循最小权限原则
- 使用RoleBinding限定命名空间
- 定期审计权限分配
# 只读权限配置示例 apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: monitoring name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"]5.2 安全上下文配置
securityContext: runAsNonRoot: true runAsUser: 1000 capabilities: drop: ["ALL"] seccompProfile: type: "RuntimeDefault"6. 运维排错实战技巧
6.1 故障排查命令速查
# 查看事件日志 kubectl get events --sort-by='.lastTimestamp' # 诊断API延迟 kubectl get --raw /metrics | grep apiserver_request_duration_seconds # 检查节点资源 kubectl top node6.2 常见问题处理方案
Pending Pod:
- 检查资源配额(kubectl describe quota)
- 验证节点选择器匹配(kubectl get nodes --show-labels)
CrashLoopBackOff:
- 查看容器日志(kubectl logs -p)
- 检查存活探针配置
NetworkPolicy冲突:
- 使用网络诊断工具(如calicoctl)
- 检查命名空间标签匹配
7. 自定义资源开发指南
7.1 Operator开发流程
- 定义CRD(CustomResourceDefinition)
- 实现控制器逻辑(client-go库)
- 部署Operator到集群
// 控制器核心逻辑示例 func (c *Controller) syncHandler(key string) error { obj, exists, err := c.informer.GetStore().GetByKey(key) if !exists { return nil } // 业务逻辑处理... }7.2 Webhook开发要点
- 证书管理(cert-manager推荐)
- 幂等性处理
- 性能优化(批量处理请求)
# ValidatingWebhookConfiguration示例 apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration webhooks: - name: validate.example.com rules: - apiGroups: ["apps"] operations: ["CREATE", "UPDATE"] resources: ["deployments"]8. 性能优化关键指标
8.1 集群健康指标
| 指标名称 | 健康阈值 | 监控方法 |
|---|---|---|
| API请求延迟 | <500ms P99 | Prometheus metric |
| etcd写入延迟 | <50ms | etcdctl check perf |
| 调度器绑定延迟 | <1s | scheduler日志分析 |
8.2 资源优化建议
设置合理的Requests/Limits:
resources: requests: cpu: "500m" memory: "512Mi" limits: cpu: "1000m" memory: "1Gi"使用HPA自动扩缩容:
kubectl autoscale deployment nginx --cpu-percent=50 --min=2 --max=10启用Pod垂直扩缩容(VPA):
apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: nginx
9. 版本升级注意事项
9.1 升级路径规划
- 查阅官方支持版本矩阵
- 按顺序逐步升级(如1.20→1.22→1.24)
- 先升级次要版本再升级主版本
9.2 关键检查项
废弃API迁移状态
kubectl convert --list-versions存储兼容性验证
网络插件版本要求
10. 生态工具链推荐
10.1 开发调试工具
- k9s:终端可视化管理
- kubectx:快速切换上下文
- stern:多Pod日志聚合
10.2 CI/CD集成方案
- Argo CD:声明式GitOps工具
- Tekton:云原生CI/CD流水线
- Flux:持续交付控制器
# Argo CD应用示例 apiVersion: argoproj.io/v1alpha1 kind: Application spec: destination: namespace: production server: https://kubernetes.default.svc source: repoURL: git@github.com:myorg/myrepo.git path: k8s/manifests targetRevision: HEAD