“生产就绪”是什么意思?如果你希望生产工作负载出现的问题最少,那么这是应该回答的第一个问题。


这个问题的答案可以从多个角度来讨论:安全性、可维护性、测试、可配置性、稳定性、可升级性、文档等。笔者认为生产就绪的应用程序应该具备上述所有元素。


在生产中部署Kubernetes工作负载时,Kubernetes用户往往选择开源项目Helm。很容易理解为什么:Helm扩展了部署的适应性和可定制性,简化了测试过程,允许历史记录和回滚管理等。


两年多来,笔者为这个项目做出了贡献,扩展了可用目录,提供了各种各样的基础设施应用程序,并审查了pull请求、添加了功能和处理了支持案例。根据笔者的经验,如果开发人员想要创建可以在生产环境中部署的chart,那么应该注意五个要素。


1)通过限制容器操作确保安全:运行非根容器


要部署容器化应用,必须将允许的操作数限制为所需的最小值。要确保这一点,请使用与根用户不同的随机用户启动容器。这些容器称为非根容器。这是一些基于Kubernetes的平台(比如红帽的OpenShift)的强制要求。在稳定存储库中大约有一半的chart已经使用非根容器,并且这个数目还在增加。如果应用程序允许,你可以更进一步,使用完整的只读文件系统或“scratch”容器(这些容器没有任何底层的基本操作系统)。


2)限制对集群的访问:实施基于角色的访问控制策略(RBAC)


Kubernetes集群的核心是它的API服务器(kube-apiserver)。通过访问它,你可以获得集群的当前状态和部署在集群上的工作负载的详细信息。开发人员正在采用这种方法:目前,有许多感知Kubernetes的应用程序可以访问API服务器进行自我发现等操作。但是,对Kubernetes API服务器具有完全访问权限的容器可能会损害集群。为了降低这种风险,你必须确保pod中的进程只能访问所需的最小数据集。


这就是基于角色的访问控制策略发挥作用的地方。例如,如果部署的基础设施应用程序使用kube-apiserver在命名空间“test”中进行自我发现,则可能只需要允许对该特定命名空间中的pod对象执行“get”和“list”操作。在过去,用户向Helm client Tiller这样的应用程序授予集群管理权限(即执行集群内所有操作的权限)。这种做法会导致灾难。


不要忘记确保使用chart部署的应用程序具有尽可能小的RBAC权限集。


3)完成适当的测试,特别是关于升级


更新Statefulset中的标签可能导致中断helm upgrade命令。要处理这种情况,在管道中包括升级测试是一项优先级很高的任务。显然,你不能假设主要版本之间的升级会在没有手动干预的情况下实现。但是,确保非主要版本之间的升级顺利是可行的。


在chart中添加默认禁用的功能是另一个常见问题。由于这些功能在默认情况下是禁用的,正常的helm install测试可能不会检测到任何问题。


这种情况的一个例子是入口规则。这些参数在默认情况下是禁用的,因此你在日常测试中很容易忘记它们。可以预见,当大多数Ingress API Object使用的API Group扩展/v1beta在Kubernetes 1.20中被弃用时,稳定存储库中的数个chart会出现问题。可以通过使用多个values.yaml文件来增加chart的测试覆盖率来防止这一问题。为了帮助解决这个问题,像kubeval这样的解决方案可以派上用场。


4)不惜一切代价避免滚动标签


你可能已经熟悉了容器镜像,并且可能已经执行了至少一次docker pull bitnami/redis:latest这样的命令。这个“latest”是滚动标签的一个例子(即随着时间的推移指向不同镜像的标签)。


想象一下下面的场景:你希望使用最新版本的Redis部署“bitnami/redis”chart。为此,你使用“laest”标签,以便知道集群中将运行Redis 5.0.5。部署chart时,一切都可以无缝工作。现在进一步想象一下,如果将来有一天,你需要用新的pod来扩展Redis集群(将下载“bitnami/redis:latest”镜像)。如果现在最新的Redis是5.0.8呢?你将拥有运行不同版本Redis的同一Redis集群的pod。更糟糕的是,如果Redis6.0.0发布了呢?Redis集群肯定会崩溃。


如果你希望能够维护和控制部署,请确保chart使用不可变的镜像(例如:“bitnami/redis:5.0.5-debian-9-r10”)。通过这种方法,每次部署或扩展时,你都知道正在使用什么镜像。另外,你还可以保证已部署的镜像已使用该chart的特定版本进行了测试,这是使用滚动标签时无法保证的。


5)监控部署


这个技巧很简单:如果你想让工作负载准备好,你需要对它们进行监控。大多数生产就绪的chart都支持指标导出器,因此应用程序状态可以通过Prometheus和Wavefront之类的工具或BKPR之类的套件来观察。此外,确保工作负载与ELK之类的日志堆栈集成对于提高容器化应用的可观察性也是很重要的。其优点不计其数:早期故障预防、审计、趋势检测、性能分析或调试等。


通过遵循上面的提示,你将涵盖Kubernetes生产就绪的所有基础知识。但是还有很多领域需要你去探索,比如稳定性、性能、网络、自动伸缩等。