1. Kubernetes核心概念深度解析
Gateway API作为Kubernetes生态中新一代流量管理标准,正在逐步替代传统的Ingress资源。与Ingress相比,Gateway API提供了更丰富的路由匹配条件和流量切分能力。在实际项目中,我们通常会创建GatewayClass来定义网关类型(如Nginx、Istio等),然后通过Gateway资源实例化具体的负载均衡器。一个典型配置示例如下:
apiVersion: gateway.networking.k8s.io/v1beta1 kind: Gateway metadata: name: production-gateway spec: gatewayClassName: nginx listeners: - protocol: HTTPS port: 443 hostname: "*.example.com" tls: certificateRefs: - kind: Secret name: example-com-certPriorityClass则是控制Pod调度优先级的关键机制。我们曾经在集群资源紧张时,通过合理设置PriorityClass成功保障了核心业务的稳定运行。系统预定义了两个特殊值:system-cluster-critical(2000000000)和system-node-critical(2000001000),用户自定义的PriorityClass值必须小于这两个值。创建示例如下:
apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: high-priority value: 1000000 globalDefault: false description: "用于关键业务Pod"2. 自动扩缩容实战技巧
Horizontal Pod Autoscaler(HPA)的配置看似简单,但实际使用中有几个关键点需要注意:
- 指标采集间隔:默认15秒的采集周期对于突发流量可能不够敏感,可通过
--horizontal-pod-autoscaler-sync-period参数调整 - 冷却延迟:扩容后的冷却期默认3分钟(可通过
--horizontal-pod-autoscaler-downscale-stabilization调整),防止频繁波动 - 指标类型选择:除CPU/Memory外,现在更推荐使用自定义指标(如QPS、连接数等)
一个支持自定义指标的HPA配置示例:
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: payment-service-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: payment-service minReplicas: 2 maxReplicas: 10 metrics: - type: Pods pods: metric: name: transactions_per_second target: type: AverageValue averageValue: 100重要提示:HPA依赖metrics-server收集基础指标,部署集群时务必确认其正常运行。验证命令:
kubectl top pods
3. GitOps实践与Argo CD进阶
Argo CD作为GitOps理念的典型实现,其核心优势在于:
- 自动同步:持续监控Git仓库与集群状态的差异
- 回滚能力:保留完整的应用版本历史
- 多集群管理:通过一个控制平面管理多个集群
在大型项目中,我们通常会采用ApplicationSet来实现批量应用部署。以下是一个使用集群生成器的示例:
apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: regional-apps spec: generators: - clusters: selector: matchLabels: env: production template: metadata: name: '{{name}}-app' spec: project: default source: repoURL: https://git.example.com/argo-apps.git targetRevision: HEAD path: '{{metadata.labels.region}}/app' destination: server: '{{server}}' namespace: default常见问题排查技巧:
- 同步卡在Progressing状态:通常是健康检查未通过,使用
argocd app get <app-name>查看详细状态 - 资源差异显示异常:尝试
argocd app diff <app-name>进行对比 - 权限问题:检查项目中的角色绑定(RoleBinding)配置
4. 生产环境巡检清单
根据我们管理多个K8s集群的经验,总结出以下关键巡检项:
| 检查类别 | 具体项目 | 检查命令/方法 | 正常标准 |
|---|---|---|---|
| 节点状态 | Ready节点数量 | kubectl get nodes | 所有节点状态为Ready |
| 资源使用 | 节点资源水位 | kubectl top nodes | CPU<70%, MEM<80% |
| 工作负载 | 异常Pod数量 | kubectl get pods --all-namespaces --field-selector=status.phase!=Running | 0个异常Pod |
| 网络 | CoreDNS可用性 | kubectl exec -it <pod> -- nslookup kubernetes.default | 能正常解析 |
| 存储 | PV/PVC绑定状态 | kubectl get pv,pvc --all-namespaces | 所有PVC都Bound状态 |
| 安全 | 证书有效期 | openssl x509 -noout -dates -in /etc/kubernetes/pki/apiserver.crt | 有效期剩余>30天 |
5. 面试高频问题解析
以下是技术面试中常见的K8s问题及深度解答:
问题1:Deployment和StatefulSet的本质区别是什么?
考察点:对有状态应用的理解参考答案:
- Deployment适合无状态服务,Pod可随意替换,使用随机名称和相同存储
- StatefulSet为每个Pod维护固定标识(名称、网络标识、存储),典型场景包括:
- 需要稳定持久化存储(如数据库)
- 需要稳定网络标识(如ZooKeeper集群)
- 需要有序部署和扩展(如主从架构服务)
问题2:如何排查Pod一直处于Pending状态?
排查步骤:
- 查看详细事件:
kubectl describe pod <pod-name> - 常见原因:
- 资源不足:检查节点资源
kubectl describe nodes - 不满足节点选择器:检查nodeSelector配置
- 污点限制:检查节点taints
kubectl get nodes -o json | jq '.items[].spec.taints'
- 资源不足:检查节点资源
- 若因资源不足,可考虑:
- 增加集群节点
- 调整Pod资源请求(requests)
- 配置优先级(PriorityClass)
问题3:Service的ClusterIP、NodePort和LoadBalancer类型有何区别?
对比分析:
- ClusterIP:仅集群内部访问,默认类型
- NodePort:通过节点IP+静态端口暴露(范围30000-32767)
- LoadBalancer:需要云提供商支持,自动创建外部负载均衡器
- 生产建议:通常组合使用Ingress+ClusterIP,或使用LoadBalancer+ExternalDNS实现域名访问
6. 性能调优实战经验
API Server参数优化:
# 增加请求超时时间(默认1分钟可能不够) --request-timeout=3m # 提高事件保留天数(默认1天) --event-ttl=168h # 调整内存限制(根据集群规模) --target-ram-mb=8192etcd调优建议:
- 使用SSD存储,保证低延迟
- 分离数据目录和wal目录到不同磁盘
- 监控关键指标:
- etcd_disk_wal_fsync_duration_seconds(应<100ms)
- etcd_server_leader_changes_seen_total(应尽量少)
kubelet配置调整:
# /var/lib/kubelet/config.yaml apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration serializeImagePulls: false # 并行拉取镜像 maxPods: 150 # 根据节点容量调整 kubeAPIQPS: 50 # 默认5可能太低 kubeAPIBurst: 100 # 默认10可能太低7. 安全加固最佳实践
RBAC配置原则:
- 遵循最小权限原则
- 使用RoleBinding而非ClusterRoleBinding
- 定期审计权限:
kubectl get rolebindings,clusterrolebindings --all-namespaces -o yaml
Pod安全策略示例:
apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: restricted spec: privileged: false allowPrivilegeEscalation: false requiredDropCapabilities: - ALL volumes: - 'configMap' - 'emptyDir' - 'secret' hostNetwork: false hostIPC: false hostPID: false runAsUser: rule: 'MustRunAsNonRoot' seLinux: rule: 'RunAsAny' supplementalGroups: rule: 'MustRunAs' ranges: - min: 1 max: 65535 fsGroup: rule: 'MustRunAs' ranges: - min: 1 max: 65535网络策略示例(限制命名空间间访问):
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-cross-namespace namespace: production spec: podSelector: {} policyTypes: - Ingress - Egress ingress: - from: - podSelector: {} egress: - to: - podSelector: {}8. 常见故障处理手册
案例1:Pod不断重启
- 查看日志:
kubectl logs <pod-name> --previous - 常见原因:
- 内存不足被OOMKill:
dmesg | grep -i kill - 健康检查失败:调整liveness/readiness探针
- 镜像拉取失败:检查镜像仓库权限
- 内存不足被OOMKill:
案例2:节点Not Ready
- 检查组件状态:
journalctl -u kubelet查看kubelet日志docker ps或crictl ps检查容器运行时
- 常见修复步骤:
- 重启kubelet:
systemctl restart kubelet - 检查磁盘空间:
df -h(特别是/var分区) - 验证网络:
ping <api-server-ip>
- 重启kubelet:
案例3:HPA不生效
- 检查指标收集:
kubectl get --raw /apis/metrics.k8s.io/v1beta1验证metrics APIkubectl describe hpa查看事件
- 可能原因:
- 资源请求未设置:Deployment中必须配置resources.requests
- 指标名称错误:自定义指标需完全匹配
- 权限问题:检查相关ServiceAccount的权限
9. 版本升级注意事项
从1.23升级到1.24的关键变化:
- Dockershim移除:必须切换至containerd或其他CRI兼容运行时
- 迁移步骤:
# 各节点执行 apt-get remove docker-ce docker-ce-cli apt-get install containerd systemctl restart kubelet
- 迁移步骤:
- Beta API移除:如autoscaling/v2beta2需改为autoscaling/v2
- 新特性:
- 基于cgroup v2的Pod QoS
- 更精细的CPU管理策略
滚动升级最佳实践:
- 先升级worker节点:
kubectl drain <node> --ignore-daemonsets apt-get update && apt-get upgrade kubeadm kubelet kubectl kubeadm upgrade node systemctl restart kubelet kubectl uncordon <node> - 最后升级control-plane:
kubeadm upgrade plan kubeadm upgrade apply v1.24.3 kubectl -n kube-system get pods # 验证组件状态
10. 扩展生态系统工具链
监控方案选型对比:
| 工具 | 核心优势 | 适用场景 | 学习曲线 |
|---|---|---|---|
| Prometheus | 多维数据模型,强大的查询语言 | 需要深度监控指标 | 中 |
| Grafana | 丰富的可视化面板 | 需要美观的监控仪表盘 | 低 |
| EFK | 日志全文检索能力强 | 日志分析与审计 | 高 |
| Datadog | 全栈APM能力 | 企业级统一监控 | 低 |
CI/CD集成模式:
- GitLab CI示例:
deploy: stage: deploy image: bitnami/kubectl:latest script: - kubectl apply -f k8s/manifest.yaml only: - master- Jenkins Pipeline示例:
pipeline { agent any stages { stage('Deploy') { steps { sh 'kubectl apply -f k8s/' timeout(time: 15, unit: 'MINUTES') { waitUntil { def status = sh(script: 'kubectl get pods -l app=myapp -o jsonpath="{.items[*].status.phase}"', returnStdout: true) return status.contains("Running") } } } } } }在长期维护生产级K8s集群的过程中,最大的体会是:文档化和自动化是一切稳定性的基础。我们建立了完整的变更记录体系,任何手动操作都会立即转化为Ansible Playbook或Terraform配置。同时,建议每个季度进行一次全集群的配置审计,使用kube-bench等工具检查安全合规状态。