2023年 Kubernetes 最佳实践

标签: dev | 发表时间:2022-12-07 00:00 | 作者:
出处:https://itindex.net/relian

作为容器编排平台,Kubernetes(K8s)具有诸多优势。例如,K8s 在工作负载发现、自我修复和应用容器化扩展等方面具备很强的自动化能力。

然而,在经过一些调整后,Kubernetes 并不总是适用于生产环境。

本文向您分享了一些重要的 Kubernetes 最佳实践,以提高您的 K8s 安全性、性能和成本。

1. 保持最稳定版本

一般是将您的 K8s 更新到最新的稳定版本。此版本很可能已经针对任何安全或性能问题进行了修补。基本上也会有更多基于社区版本或供应商提供的支持。最后,K8s 最佳实践可以让您避免出现一些可能危及服务交付的安全、性能和成本异常。

2. 整理清单

也许您发现 YAML 很难用。那么你可以使用 yamllint,它可以在一个文件中处理多个文档。

此外也有 Kubernetes 特定的 linters 可用:

  • 您可以使用 kube-score 整理您的清单并遵循最佳实践。

  • Kubeval 也会检查你的清单。但是,它只检查有效性。

  • Kubernetes 1.13 中 kubectl 的 dry-run 选项允许 Kubernetes 检查但不应用您的清单。此功能将验证 K8s 的 YAML 文件。

3. 管理好配置文件的版本控制

将所有配置文件(例如 deployment、services 和 ingress)存储在版本控制系统中。GitHub 是目前最流行的开源分布式版本控制平台,其他平台还包括 GitLab、BitBucket 和 SourceForge。

在将您的代码推送到集群之前执行此操作,使您能够跟踪源代码变更以及谁进行了变更。必要时,您可以快速回滚变更、重新创建或恢复集群,以确保稳定性和安全性。

4. Git 工作流是应该选择的方法

GitOps 或基于 Git 的工作流,是一个用于自动化所有任务的优秀模型,包括 CI/CD 管道把 Git 托管作为事实的独立源头。。除了提高生产力之外,GitOps 框架还可以通过以下方式为您提供帮助:

  1. 加速部署

  2. 增强错误跟踪能力

  3. CI/CD 流程自动化

总之,使用 GitOps 方法可以简化集群管理并加快应用程序开发。

5. 利用声明式 YAML 文件

编写声明式的 YAML 文件,而不是使用诸如 kubectl run 等命令。之后,使用 kubectl apply 命令,您可以将它们添加到集群中。声明式方法允许您指定所需的状态, Kubernetes 也能够处理。

所有对象以及代码都可以存储在 YAML 文件中并进行版本控制。如果出现问题,您可以通过恢复较早的 YAML 文件并重新应用它来实现轻松回滚。此外,此模式可确保您的团队可以看到集群的当前状态,以及从时间线上看到对其所做的更改。

6. 指定资源请求和限制

当定义 CPU 和内存的资源限制和请求时,CPU和内存的单位通常会使用千分比核数和字节或兆字节。需要注意的是,容器运行时会禁止容器使用超出所设置资源限制的资源。

当资源稀缺时,生产集群可能会在没有资源限制和请求的情况下失败。集群中的 Pod 可能会消耗过多的资源,从而增加您的 Kubernetes 成本。此外,如果 pod 消耗太多 CPU 或内存并且调度程序无法添加新的 pod,节点可能会崩溃。

7. 将 Pods 与Deployments, ReplicaSets, 和 Jobs绑定

尽可能不要使用独立的 Pod(即未绑定到 ReplicaSet 或 Deployment 的 Pod)。如果节点发生故障,将不会重新调度这些独立的 Pod。

deployment 能够实现两个目标:

  1. 创建一个 ReplicaSet 来确保预期个数的 Pod 始终可用

  2. 指定替换 Pod 的策略,例如 RollingUpdate

除了一些显式的 restartPolicy: Never 场景外,Deployment 通常比直接创建 Pod 要好得多。

8. 清晰标记 K8s 资源

标签是可帮助您识别 Kubernetes 集群中资源特性的键/值对。标签还允许您使用 kubectl 过滤和选择对象,让您可以根据特定特征快速识别对象。

即使您认为您当前不会使用它们,给您的对象贴上标签也是极好的。此外,尽可能多地使用描述性标签来区分您的团队将使用的资源。对象可以按所有者、版本、实例、组件、管理者、项目、团队、保密级别、合规性和其他标准进行标记。

9. 运行存活探测(在其他探测之后)

存活探测定期检查 pod 的健康状况,防止 Kubernetes 将流量路由到不健康的 pod。Kubernetes(kubelet 默认策略)会重启未通过健康检查的 pod,确保应用程序的可用性。

探针向 pod 发送 ping 以查看是否能收到响应。无响应则表示您的应用程序未在该 pod 上运行,进而启动新的 pod 并在那里运行应用程序。

还有一点。您必须先运行启动探测,这是第三种类型的探测,它会在 pod 的启动阶段完成时向 K8s 发出警报。如果 pod 的启动探测不完整,则 存活探针 和 就绪态探针 也不会再去探测。

10. 通过命名空间简化资源管理

命名空间可帮助您的团队在逻辑上将一个集群划分为多个子集群。当您想同时在多个项目或团队之间共享 Kubernetes 集群时,这尤其有用。命名空间允许开发、测试和生产团队在同一集群内协作,而不会覆盖或干扰彼此的项目。

Kubernetes 附带三个命名空间:default、kube-system 和 kube-public。一个集群可以支持多个逻辑上独立但可以相互通信的命名空间。

11. 保持无状态

无状态应用程序通常比有状态应用程序更易于管理,尽管随着 Kubernetes Operators 越来越受欢迎,这种情况正在发生变化。

对于不熟悉 Kubernetes 的团队来说,无状态后端消除了维持长期连接的可扩展性限制。

无状态应用程序还可以更轻松地按需迁移和扩展。

更重要的是,保持工作负载无状态,您就可以使用临时实例。

使用临时实例的一个缺点是 AWS 和 Azure 等提供商经常需要您在短时间内返还这些廉价的计算资源,这可能会中断您的工作负载。您可以通过使您的应用程序无状态来规避此问题。

12. 建立网络策略

Kubernetes 中的网络策略指的是哪些流量被允许,哪些不被允许。这类似于在 Kubernetes 集群中的 pod 之间放置防火墙。无论流量如何在您环境中的 pod 之间流动,只有在您的网络策略认可的情况下流量才会被允许。

在创建网络策略之前,您必须定义授权连接并指定该策略应用于哪些 pod。这能帮助您过滤掉任何不符合条件的流量。

您可以在此找到 Kubernetes 网络策略的各种示例和示例 YAML 文件。

13. 设置基于角色的访问控制

先看以下数据。

RedHat 在 2022 年对 300 多名 DevOps 专业人员的调查中发现了以下内容:

  • 对于 55% 的受访者来说,安全问题会延后应用程序发布。

  • 在持续使用 Kubernetes 和容器方面,59% 的人认为安全是主要障碍。

  • 31% 表示安全漏洞导致了收入或客户流失。

  • 几乎所有人 (94%) 在前一年至少发生过一次 Kubernetes 安全事件。

您可以使用 RBAC 指定哪些用户可以访问哪些 Kubernetes 资源,例如他们可以访问哪些集群、谁可以进行更改以及他们可以更改到什么程度。

可以通过两种方式配置 RBAC 权限:

  • 如果你希望定义集群范围的角色,应该使用 ClusterRole。

  • 如果你希望在名字空间内定义角色,应该使用 by Role。

14. 为 Kubernetes 环境设置防火墙

这是另外一种重要的 Kubernetes 安全最佳实践。

在集群前面设置防火墙以限制外部请求到达 API 服务器,此外还设置网络策略来控制集群内的内部流量。可以通过使用常规或端口防火墙规则来完成。

此外,需要确保 IP 地址已列入白名单并且设置开放端口限制。

15. 镜像越小越好

使您的镜像小而分层。因为镜像越小,构建速度越快,所需的存储空间也越少。通过有效地分层可以显着减小镜像的大小。通过从零开始构建,也可以优化镜像大小。

如果做呢?

如果您需要许多不同的组件,请在单个 Dockerfile 中使用多个 FROM 语句。该设置将根据 FROM 命令从已部署的容器中提取每一层。

在生成阶段,每个部分都引用不同的基本镜像。这样生成的 Docker 容器更小,因为它不再包含前面的层,只包含您需要的组件。

在我的下一篇文章中见!

原文地址:https://myhistoryfeed.medium.com/best-practices-for-kubernetes-in-2023-bd0aaada1f72 原文作者:MyHistoryFeed 本文永久链接:https://github.com/gocn/translator/blob/master/2022/w48_Best_Practices_for_Kubernetes_in_2023.md 译者:lsj1342

校对:cvley ***


往期推荐



「每周译Go」如何在Go中编写 Switch 语句

深入理解golang的互斥锁


Go runtime:4年之后的变化

想要了解Go更多内容,欢迎扫描下方关注公众号,回复关键词 [实战群]  ,就有机会进群和我们进行交流

分享、在看与点赞Go 

相关 [kubernetes 最佳实践] 推荐:

2023年 Kubernetes 最佳实践

- - IT瘾-dev
作为容器编排平台,Kubernetes(K8s)具有诸多优势. 例如,K8s 在工作负载发现、自我修复和应用容器化扩展等方面具备很强的自动化能力. 然而,在经过一些调整后,Kubernetes 并不总是适用于生产环境. 本文向您分享了一些重要的 Kubernetes 最佳实践,以提高您的 K8s 安全性、性能和成本.

Kubernetes 服务部署最佳实践(一)

- - 腾讯云容器团队
业务容器化后,如何将其部署在 K8S 上. 如果仅仅是将它跑起来,很简单,但如果是上生产,我们有许多地方是需要结合业务场景和部署环境进行方案选型和配置调优的. 比如,如何设置容器的 Request 与 Limit、如何让部署的服务做到高可用、如何配置健康检查、如何进行弹性伸缩、如何更好的进行资源调度、如何选择持久化存储、如何对外暴露服务等.

最全Kubernetes加固指南:12个最佳实践,防止Kubernetes配置错误

- - DockOne.io
在容器环境中,Kubernetes管理着拥有数个、数百个甚至数千个节点的容器集群,其配置的重要性不可忽略. Kubernetes的配置选项很复杂,一些安全功能并非默认开启,这加大了安全管理难度. 如何有效地使用包括Pod安全策略、网络策略、API服务器、Kubelet及其他Kubernetes组件和功能策略建立安全的Kubernetes环境.

Kubernetes在微服务中的最佳实践

- - DockOne.io
你可以在网上找到许多关于如何正确构建微服务体系架构的最佳实践. 其中之一是我以前写的一篇文章 Spring Boot在微服务中的最佳实践. 我把重点放在在生产上基于Spring Boot构建的微服务应用程序应该考虑哪些方面. 我没有使用任何用于编排或管理应用程序的平台,而只是一组独立的应用程序. 在本文中,我将基于已经介绍的最佳实践,在Kubernetes平台上部署微服务,你需要注意的一些新规则和事项.

生产环境中的Kubernetes最佳实践

- - DockOne.io
2020年,12月1日 Pavan Belagatti. DevOps从提出到现在,已经走过了一段很长的路. 包括Docker和Kubernetes在内的多种平台也已经帮助企业用前所未有的速度实现了软件应用的交付. 同时,随着应用的容器化构建和发布比率不断上升,作为事实上的容器编排工具,Kubernetes在企业用户中备受欢迎和广泛认可.

五大Kubernetes最佳实践_Docker的专栏-CSDN博客

- -
在最近的一次Weave用户组在线会议WOUG[1]上两个工程师做了Kubernetes相关的分享. 谷歌云的开发者布道师Sandeep Dinesh(@SandeepDinesh)做了一个演讲,给大家列举了在Kubernetes上运行应用的最佳实践清单;Jordan Pellizzari(@jpellizzari),是来自Weaveworks的工程师,随后也做了一个分享,内容是在他们使用Kubernetes开发运行SaaS Weave Cloud两年之后学到的经验教训.

在 Kubernetes 中部署高可用性应用程序的最佳实践 - 第1部分 Best practices for deploying highly available apps in Kubernetes. Part 1 – Flant blog

- -
如您所知,在 Kubernetes 中部署一个基本可行的应用程序配置是轻而易举的事. 另一方面,试图使您的应用程序尽可能地可用和容错不可避免地会带来大量的障碍和陷阱. 在本文中,我们分解了我们认为在 Kubernetes 中部署高可用性应用程序并以简洁的方式共享它们时最重要的规则. 请注意,我们不会使用任何开箱即用的功能.

jQuery最佳实践

- andi - 阮一峰的网络日志
上周,我整理了《jQuery设计思想》. 那篇文章是一篇入门教程,从设计思想的角度,讲解"怎么使用jQuery". 今天的文章则是更进一步,讲解"如何用好jQuery". 我主要参考了Addy Osmani的PPT《提高jQuery性能的诀窍》(jQuery Proven Performance Tips And Tricks).

PHP最佳实践

- xiangqian - 阮一峰的网络日志
虽然名字叫《PHP最佳实践》,但是它主要谈的不是编程规则,而是PHP应用程序的合理架构. 它提供了一种逻辑和数据分离的架构模式,属于MVC模式的一种实践. 我觉得,这是很有参考价值的学习资料,类似的文章网上并不多,所以一边学习,一边就把它翻译了出来. 根据自己的理解,我总结了它的MVC模式的实现方式(详细解释见译文):.

MongoDB最佳实践

- - NoSQLFan
将 MongoDB加入到我们的服务支持列表中,是整个团队年初工作计划中的首要任务. 但我们感觉如果先添加一项对NoSQL存储的支持,而不是先升级已支持的关系型数据库,可能对用户不太好,毕竟目前的用户都使用关系型数据库. 所以我们决定将引入MongoDB这项工作放到升级MySQL和PostgreSQL之后来做.