Kubernetes 是一个复杂而强大的容器编排平台,需要仔细配置才能确保最佳性能、安全性和可管理性。本文概述了配置 Kubernetes 的关键最佳实践,重点介绍实用建议和技术细节。

1. 使用最新的 API 版本并将配置文件存储在版本控制中
定义配置时,指定最新的稳定 API 版本至关重要。这可确保与最新功能和错误修复兼容。此外,配置文件应在推送到集群之前存储在版本控制中。这种做法允许快速回滚配置更改并有助于集群重新创建和恢复。
apiVersion:apps/v1kind:Deploymentmetadata:name:example-deploymentspec:replicas:3selector:matchLabels:app:exampletemplate:metadata:labels:app:examplespec:containers:-name :example-containerimage:example-image:latestresources:requests:cpu:100mmemory:128Milimits:cpu:200mmemory:256Mi
2. 使用 YAML 作为配置文件
YAML 通常比 JSON 更易于使用,建议用于编写配置文件。但是,需要注意 YAML 1.1 和 YAML 1.2 之间的差异,尤其是布尔值方面。Kubernetes 使用的 YAML 解析器与 YAML 1.1 基本兼容,但建议对布尔值使用true和false以避免出现意外错误。
3. 将相关对象分组到单个文件中
将相关对象分组到单个文件中可以简化管理。例如,您可以在单个 YAML 文件中定义多个资源,如 Deployments、Services 和 ConfigMaps。
apiVersion: apps/v1kind: Deploymentmetadata:name: example-deploymentspec:replicas: 3selector:matchLabels:app: exampletemplate:metadata:labels:app: examplespec:containers:- name: example-containerimage: example-image:latestresources:requests:cpu: 100mmemory: 128Milimits:cpu: 200mmemory: 256Mi---apiVersion: v1kind: Servicemetadata:name: example-servicespec:selector:app: exampleports:- name: httpport: 80targetPort: 8080type: ClusterIP---apiVersion: v1kind: ConfigMapmetadata:name: example-configmapdata:example-key: example-value
4. 定义资源请求和限制
定义容器的资源请求和限制对于防止资源争用和确保高效利用资源至关重要。此做法有助于优化集群性能并防止 pod 占用
apiVersion: v1kind: Podmetadata:name: example-podspec:containers:- name: example-containerimage: example-image:latestresources:requests:cpu: 100mmemory: 128Milimits:cpu: 200mmemory: 256Mi
5. 使用命名空间进行组织和安全
命名空间用于组织对象并在 Kubernetes 集群内创建逻辑分区。它们还有助于实现安全目的,允许集群管理员设置资源使用约束并限制命名空间内的对象数量。
apiVersion: v1kind: Namespacemetadata:name: example-namespace---apiVersion: v1kind: ResourceQuotametadata:name: example-resourcequotanamespace: example-namespacespec:hard:cpu: "2"memory: 2Giscope:- BestEffort- NotBestEffort- Terminating---apiVersion: v1kind: LimitRangemetadata:name: example-limitrangenamespace: example-namespacespec:limits:- default:cpu: 200mmemory: 256MidefaultRequest:cpu: 100mmemory: 128Mitype: Container
6. 实施健康检查和就绪探测
健康检查和就绪探测对于确保服务正常运行并准备好处理流量至关重要。就绪探测确定容器何时可以接收流量,而活跃探测确定何时应重新启动容器。
apiVersion: v1kind: Podmetadata:name: example-podspec:containers:- name: example-containerimage: example-image:latestlivenessProbe:httpGet:path: /healthcheckport: 8080initialDelaySeconds: 15periodSeconds: 15readinessProbe:httpGet:path: /readinesscheckport: 8080initialDelaySeconds: 5periodSeconds: 10
7. 配置机密的最低权限访问
敏感信息应存储在 Secrets 中,而不是 ConfigMaps 中。Secrets 应作为卷挂载,而不是作为环境变量传递,以防止敏感数据泄露。
apiVersion: v1kind: Secretmetadata:name: example-secrettype: Opaquedata:username: <base64 encoded username>password: <base64 encoded password>apiVersion: v1kind: Podmetadata:name: example-podspec:containers:- name: example-containerimage: example-image:latestvolumeMounts:- name: example-secret-volumemountPath: /etc/secretsreadOnly: truevolumes:- name: example-secret-volumesecret:secretName: example-secret
8.使用基于角色的访问控制(RBAC)
基于角色的访问控制 (RBAC) 对于管理对 Kubernetes 资源的访问至关重要。它允许您定义角色和绑定,以限制用户可以在集群内执行的操作。
apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata:name: example-rolenamespace: example-namespacerules:- apiGroups: ["*"]resources: ["pods"]verbs: ["get", "list", "watch"]apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata:name: example-rolebindingnamespace: example-namespaceroleRef:name: example-rolekind: Rolesubjects:- kind: Username: example-usernamespace: example-namespace
9. 监控集群资源
监控集群资源对于尽早发现问题和确保最佳性能至关重要。Metrics Server 等工具可以帮助监控资源使用情况。
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml10.遵循 GitOps 工作流程
遵循 GitOps 工作流程涉及使用版本控制作为 Kubernetes 配置的唯一真实来源。这种方法有助于维护一致且可重现的环境。
结论
有效配置 Kubernetes 是平台工程的一个关键方面,可确保集群得到优化、安全且可扩展。通过遵循这些最佳实践,您可以避免常见的陷阱,例如资源配置错误、安全措施不足和监控实践不佳。这些实践对于维护强大而可靠的 Kubernetes 环境至关重要。




