「译文」在 K8S/OpenShift 上开发应用程序的 14 种最佳实践

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 「译文」在 K8S/OpenShift 上开发应用程序的 14 种最佳实践

在这一年中,我一直在与几个开发团队合作,他们开始在 K8S/OpenShift 上构建应用程序。 我的目标是为开发人员提供指导和最佳实践,以帮助他们成功地将应用程序部署到生产环境中。 如果您是在 K8S/OpenShift 之上构建应用程序的开发人员,那么您可能会对此博客感兴趣。

该博客包括两类最佳实践。 第一类列出了提高应用程序可靠性的实践,第二类包括了提高安全性的实践。 请注意,这两个类别之间有些重叠。 您会发现在某种程度上可以提高安全性的可靠性实践,反之亦然。

应用程序可靠性

以下 9 种最佳实践可提高应用程序可用性,正常运行时间,并总体上改善应用程序用户体验。

1. 将应用程序配置外部化

包含环境特定配置的容器镜像不能在环境(Dev,QA,Prod)中升级。 为了实现可靠的发布过程,应将在较低环境中测试过的相同镜像部署到生产中。(译者注: 一次构建, 到处运行)

将特定于环境的配置保留在容器镜像之外。 例如,使用 ConfigMaps 和 Secrets 存储应用程序配置。

2. 在 pod 定义中定义资源请求和资源限制

由于请求资源的配置不正确,应用程序可能会耗尽内存或导致 CPU 饥饿。 指定请求的内存和 CPU 资源可以使群集做出适当的调度决策,以确保应用程序具有请求的资源可用。

3. 始终在 POD 定义中定义 liveness 和 readiness 探针

运行状况检查探针使群集可以为您的应用程序提供基本的弹性。 它允许群集重新启动您的应用程序(liveness 探测失败),或者避免在未准备好服务请求的情况下将流量路由到您的应用程序(readiness 探测)。

4. 使用 pod disruption budgets 保护应用程序

在某些情况下,需要从集群节点中驱逐应用程序 pods。例如,在管理员可以执行节点维护之前,或者在集群 autoscaler 在降级时从集群中删除节点之前,需要进行驱逐。为了确保您的应用程序在需要驱逐 pods 时仍然可用,您必须定义各自的 PodDistruptionBudget 对象。

5. 确保应用程序 Pod 正常终止

终止时,应用程序容器应完成所有进行中的请求并正常终止现有连接。 这允许在终端用户不注意的情况下重新启动 pod,例如在部署应用程序的新版本时。

6. 每个容器运行一个进程

避免在单个容器中运行多个进程。 在单独的容器中运行 1 个进程可以更好地隔离进程,避免信号路由出现问题,并避免出现僵尸进程。

7. 实现应用程序监控和告警

应用程序监控和告警对于保持应用程序在生产中良好运行并满足业务目的至关重要。 使用 Prometheus&Grafana 等监控工具来监控您的应用程序.

8. 配置应用程序以将其日志写入 stdout / stderr (译者注: 其他 K8S 发行版按需采纳)

OpenShift 将收集这些日志 (指 stdout/stderr) 并将其发送到集中位置(ELK,Splunk)。 在分析生产问题时,应用程序日志是宝贵的资源。 基于应用程序日志内容的告警有助于确保应用程序按预期运行.

9. 考虑实施以下弹性措施:

  1. 断路器
  2. 超时
  3. 重试
  4. 速率限制

列出的弹性措施可以使您的应用程序在出现故障时表现更好。 它们可保护您的应用程序免于过载(速率限制,断路器),并在遇到连接问题(超时,重试)时提高性能。 考虑利用 Service Mesh 实现这些措施,而无需在应用程序中更改代码。

应用程序安全性

本节包括 5 个最佳实践,它们将提高应用程序的安全性。 我强烈建议您考虑在您的环境中实施所有这些实践。

10. 使用受信任的基础镜像

尽可能使用供应商提供的容器镜像。 供应商镜像已经过测试,强化和支持。 如果使用社区支持的图像,请仅使用您信任的社区提供的图像。 在公共注册表(例如 Docker Hub)中有未知来源的图像。 不要使用它们!

11. 使用最新版本的基础镜像

仅最新版本的容器镜像包含所有可用的安全修复程序。 设置 CI 管道以在构建应用程序镜像时始终提取最新版本的基础镜像。 另外,设置 CI 管道以在更新的基础镜像可用时重建应用程序。

12. 使用单独的构建镜像和运行时镜像

译者注:

即 docker 的多阶段构建功能

创建具有最小依赖性的单独的运行时镜像可减少攻击面并产生较小的运行时镜像。 构建镜像包含构建依赖关系,构建依赖关系对于构建应用程序是必需的,而对于运行应用程序则不是必需的

13. 尽可能遵守受限的安全上下文约束(restricted security context constraint)

译者注:

应该是 OpenShift 特有的安全加固功能。

标准 K8S 中可以考虑通过 OPA(OpenPolicyAgent)来实现。

修改您的容器镜像以允许在受限的 SCC(security context constraint 简写)下运行。

应用程序容易受到攻击,攻击者可以控制应用程序。 强制使用 OpenShift 受限制的 SCC 可提供最高级别的安全性,以防止在应用程序被破坏的情况下损害集群节点。

14. 使用 TLS 保护应用程序组件之间的通信

应用程序组件可能会传达应受到保护的敏感数据。 除非您认为基础 OpenShift 网络是安全的,否则您可能希望利用 TLS 保护应用程序组件之间的通信。 考虑利用 Service Mesh 对应用程序 TLS 进行管理。

总结

在此博文中,我们回顾了 14 种最佳实践,可以帮助您在 K8S/OpenShift 上构建更可靠,更安全的应用程序。 开发人员可以使用此列表导出自己的强制性实践列表,所有团队成员都必须遵循该列表.

该博客中列出的实践列表是一个良好的开端。 如果您想了解更多信息,可以在 OpenShift 文档的 创建镜像 部分中找到另一套很好的建议。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3月前
|
Kubernetes 开发工具 Docker
微服务实践k8s与dapr开发部署实验(2)状态管理
微服务实践k8s与dapr开发部署实验(2)状态管理
89 3
微服务实践k8s与dapr开发部署实验(2)状态管理
|
12天前
|
Kubernetes 网络协议 Python
运维开发.Kubernetes探针与应用
运维开发.Kubernetes探针与应用
35 2
|
2天前
|
人工智能 Kubernetes 持续交付
Kubernetes环境下基于微服务架构的容器化AI应用部署与管理最佳实践
【8月更文第19天】随着AI技术的快速发展,越来越多的企业开始将AI应用部署到生产环境。然而,AI应用往往包含大量的组件和服务,这使得其部署和管理变得非常复杂。微服务架构和容器化技术(如Docker)结合Kubernetes集群管理,为解决这些问题提供了强大的工具。本文将介绍如何在Kubernetes环境中部署和管理基于微服务架构的容器化AI应用。
6 0
|
27天前
|
存储 Kubernetes 监控
Kubernetes集群管理的最佳实践
【7月更文挑战第25天】遵循上述最佳实践可以显著提升Kubernetes集群的管理效率、安全性和性能。然而,每个集群的环境和需求都是独特的,因此在实际操作中还需根据具体情况进行调整和优化。希望本文能为你管理Kubernetes集群提供一些有益的参考。
|
1月前
|
Kubernetes 持续交付 Python
Kubernetes(通常简称为K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。
Kubernetes(通常简称为K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。
|
20天前
|
Kubernetes Cloud Native 搜索推荐
探索云原生技术:Kubernetes在现代应用部署中的角色打造个性化移动体验:从开发到操作系统定制
【7月更文挑战第31天】本文深入探讨了云原生技术的核心组件之一——Kubernetes,并分析了其在现代云计算环境中的关键作用。通过实际代码示例和案例分析,文章揭示了Kubernetes如何优化资源管理、提高部署灵活性以及增强服务的可靠性。读者将获得对Kubernetes操作实践的直观理解,并认识到采用云原生架构对企业数字化转型的推动力。
38 0
|
1月前
|
Kubernetes 负载均衡 Java
Kubernetes在Java应用部署中的最佳实践
Kubernetes在Java应用部署中的最佳实践
|
2月前
|
Kubernetes 负载均衡 Java
Kubernetes在Java应用部署中的最佳实践
Kubernetes在Java应用部署中的最佳实践
|
3月前
|
Prometheus 监控 Kubernetes
Kubernetes 集群的监控与维护最佳实践
【5月更文挑战第30天】 在现代云计算环境中,容器编排工具如Kubernetes已成为部署和管理微服务的关键。随着其日益广泛的应用,对集群进行有效的监控和维护显得尤为重要。本文将深入探讨Kubernetes集群监控的策略,并分享维护的最佳实践,以确保系统的稳定性和性能优化。我们将从监控工具的选择、关键指标的跟踪到故障排除流程等方面进行详细阐述,并提供实用的操作建议。
|
3月前
|
运维 监控 Kubernetes
Kubernetes 集群的监控与维护最佳实践
【5月更文挑战第25天】 在现代微服务架构中,容器编排平台如Kubernetes已成为不可或缺的组成部分。随着其广泛应用,对集群进行有效的监控和维护变得至关重要。本文将探讨针对Kubernetes集群监控的最佳工具选择、常见问题的诊断方法以及预防性维护措施。通过深入分析Prometheus和Grafana在性能监控中的应用,以及介绍如何使用ELK栈进行日志管理,文章旨在为运维专家提供一系列实用的策略和步骤,以确保集群的健康和优化性能。