K8s 最佳实践

管理不同环境下的 Yaml 清单与 Helm Values文件 在Kubernetes(K8s)环境中管理大量自研应用的YAML清单以及通过Helm部署的Values文件,尤其是涉及多个集群(如生产、测试、开发环境)时,最佳实践的核心是采用声明式配置管理、版本控制和自动化工具,以确保一致性、可审计性和可扩展性。以下是基于行业标准和官方指导的推荐做法,我将分模块说明。 1. 版本控制和存储配置 将所有YAML清单和Helm Values文件存储在版本控制系统中(如Git),作为单一事实来源。这允许快速回滚、审计变更,并便于在多个集群间重现配置。 避免直接在集群中编辑资源,而是通过Git提交变更后应用。 对于多环境,使用分支策略(如main分支为生产,dev/test分支为其他环境)或目录结构(如envs/dev/values.yaml、envs/prod/values.yaml)来分离配置。 推荐使用GitOps工具如Argo CD或Flux CD,将Git仓库与集群同步,实现自动化部署和漂移检测(如果集群状态与Git不符,自动校正)。 2. YAML清单的管理 纯YAML清单容易在多环境间重复和出错,因此采用工具简化: 使用Kustomize:Kubernetes内置工具,用于在基YAML上应用overlay(覆盖层)。例如,创建一个base目录存放通用YAML,然后为每个环境(如dev、test、prod)创建overlay目录,定义环境特定的patch(如资源限制、镜像标签)。这避免了复制整个YAML文件。 分组和优化YAML:将相关对象(如Deployment、Service、ConfigMap)合并到一个文件中,使用kubectl apply -f dir/批量应用。避免不必要的默认值,使用最新稳定API版本,并在注解中添加描述以便自省。 标签和选择器:为所有资源添加语义标签(如app.kubernetes.io/name: myapp、env: prod),便于Service发现和资源管理。使用kubectl命令时优先用标签选择器而非具体名称。 健康检查和资源管理:在YAML中定义liveness/readiness probes、资源请求/限制,以确保Pod健康和集群稳定性。优先使用Deployment/ReplicaSet而非裸Pod。 3. Helm Values的管理 Helm是打包和部署K8s应用的首选工具,尤其适合自研应用和服务。 单一Chart,多环境Values:为每个应用创建一个Helm Chart,将通用模板放在templates/目录中。然后,为不同环境准备独立的Values文件(如values-dev.yaml、values-prod.yaml),覆盖特定参数(如副本数、环境变量、镜像版本)。部署时使用helm install --values values-dev.yaml。 Chart晋升(Promotion):在CI/CD管道中,从测试环境开始部署Chart,测试通过后晋升到生产。使用共享配置存储Values,避免重复定义。工具如Codefresh或Jenkins可以可视化管理这一过程。 避免硬编码:在Chart中参数化所有可变部分,使用Values注入。针对多集群,结合Namespaces隔离资源(如每个环境一个Namespace),增强安全性。 4. 多集群管理 针对生产、测试、开发各一套集群: Namespaces隔离:在每个集群中使用Namespaces逻辑分隔环境资源,避免冲突。 CI/CD集成:使用Jenkins、GitHub Actions或GitLab CI构建管道,自动化构建、测试和部署。例如,代码合并到分支后,触发Helm upgrade到对应集群。 工具组合:Helm + Kustomize(Helm支持post-render使用Kustomize),或直接用Helm Operator/ChartMuseum管理Chart仓库。 监控和审计:集成Prometheus/Grafana监控配置变更,使用RBAC限制访问,确保生产集群更严格。 5. 其他注意事项 安全性:使用 Secrets 管理敏感数据,避免明文Values。启用集群DNS,并优先创建Service再部署工作负载。 可扩展性:对于大型团队,避免每个服务一个独立Chart,而是创建一个基础Chart供复用。 测试:在开发环境中使用Minikube或kind快速迭代,生产前在测试集群验证。

2024年3月15日 · 1 分钟 · 阿征

Endpoints 与 EndpointSlice

Endpoints Endpoints 资源代表了 Service 后端实际运行的 Pod 的网络地址(IP 地址和端口)。当一个 Service 被创建时,Kubernetes 会根据 Service 的选择器(selector)来查找匹配的 Pod,并将这些 Pod 的 IP 和端口信息填充到 Endpoints 对象中。它是 手动管理服务后端 的方式之一,但在大多数情况下,EndpointSlice 资源和 Endpoint 控制器会自动创建和管理它。 apiVersion: v1 kind: Endpoints metadata: name: my-service # Endpoints对象的名称通常与它关联的Service名称相同 subsets: - addresses: # 匹配的后端Pod的IP地址列表 - ip: "10.244.0.4" - ip: "10.244.0.5" ports: # 匹配的后端Pod的端口列表 - port: 8080 name: http protocol: TCP EndpointSlice EndpointSlice 是一种更具可扩展性和效率的 Endpoints 替代品。它旨在解决在拥有大量 Pod 后端的 Service 中,单个 Endpoints 对象变得非常大而导致的性能问题。每个 EndpointSlice 对象通常只包含少量的 Endpoint(最多约 100 个),这意味着对于一个大型 Service,可能会有多个 EndpointSlice 对象,每个对象包含一部分后端信息。这使得网络传输和客户端(如 kube-proxy)处理更新时更加高效。 ...

2023年7月7日 · 2 分钟 · 阿征