关于从控制平面到应用中使用Kubernetes的错误报告

在Box中,我们管理几个大规模的Kubernetes集群,这些集群作为内部PaaS平台部署数百个微服务。这些微服务大多数是应用,且为box.com提供超过了80,000个的客户。PaaS团队还部署了几个属于Iaas层用于控制平面的服务。

Box控制平面用的是公钥基础设施(PKI)处理。在我们的基础设施中,需要符合新的SSL证书的应用程序,也需要在控制平面中做一些处理。由于安全原因,我们大部分应用程序不允许生成新的SSL证书。控制平面拥有不同的安全边界和网络访问权限,因此可以生成证书。

如果应用程序需要一个新的证书,那么需要添加一个明确的CRD到Kubernetes config,这个 CRD指定SSL证书的参数名称、通用名称和其他名称。 控制平面中的微服务监察CRD并触发一些SSL证书生成处理,一旦SSL证书准备就绪,相同的控制平面服务就会将证书发送到Kubernetes Secret 中的API服务器,之后,容器应用使用Kubernetes Secret Volume Mounts 访问证书。你可以在我们的GitHub范例应用程序中看到这个系统的演示demo。

本文的下面部分将介绍控制平面中“触发”处理中的错误情况,特别是,我们十分关心的用户输入错误。由于SSL证书参数来自CRD格式里的应用配置文件,如果CRD规范出现了错误,会发生什么情况?即使是打字错误也会导致SSL证书创建失败。根本原因极大可能是在应用程序的配置文件中,然而错误信息仍可在控制平面中使用。应用程序所有者无权访问控制平面的状态或日志。

为了给应用程序所有者提供正确的诊断信息,以便能够解决这个严重影响生产力的问题。Box快速迁移到微服务,因此每周都能完成几个新的部署,许多不了解基础设施细节的首次用户能够快速成功部署服务并轻松排除故障。作为基础架构的所有者,我们不希望成为是把控制平面日志中读取错误并将错误传递给应用程序所有者的阻碍。如果所有者配置中的某些因素导致其他地方发生错误,那么所有者需要完全授权的诊断。这个错误数据必须自动流动,无需人为参与。

经过很多的思考和试验后,我们发现Kubernetes Events可以很好地自动传达这些错误。如果把错误信息放在pod的事件流中,它将在kubectl描述输出中显示。即使是初学者用户也能执行kubectl描述pod并获得错误诊断。

我们尝试用一个状态页面作为Kubernetes Events的替代方案控制平面服务。我们确定在每次处理SSL证书后都可以更新状态页面,应用程序所有者可以探测状态页面并从页面获取诊断信息。在最初尝试状态页面后,我们发现这不如Kubernetes Events方案那样有效。状态页面成为了应用程序所有者学习的新界面,这是一个需要记住的新Web地址,也是一个能在故障排除过程中完成更多上下文切换的独特工具。另一方面,KubernetesEvents在kubectl描述输出中清晰地显示出来,这很容易被开发人员识别。

这里有一个简单的例子,举例说明我们如何使用Kubernetes Events针对不同的服务来进行错误报告。我们已经开源了一个简单的前文提到的控制平面服务的代表案例,它观察CRD上的变化并输入参数进行检查。一旦发现错误,则会生成Kubernetes Event,并同时更新相关Pod的事件流。

应用程序执行代码来设置Kubernetes Event生成,示例如下:

在一次性设置之后,下面的代码生成与pods有关的事件:

运行示例应用可以了解更多的执行细节。

如前所述,这里是针对应用程序所有者的kubectl相关描述输出。

我们已经用Kubernetes Events展示了一个实际的用例。它能在配置错误的情况下给程序员自动反馈,这样的功能显著改善了我们的故障排除工作。今后,我们计划在类似的使用情况下将Kubernetes Events应用于各种其他的应用程序。最近创建的样本控制器示例也在类似的场景中使用了Kubernetes Events。现在更多的示例应用来到社区指导,这是令人欣喜的。我们对继续探索Kubernetes Eventss和其他的Kubernetes API感到兴奋,因为这能帮助我们的工程师更轻松地开发。

http://blog.kubernetes.io/2018/01/reporting-errors-using-kubernetes-events.html

- End -

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180201G12DI600?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券