容器及Kubernetes开发应用程序时的另一个关键原则——尽可能保证镜像轻量化,借此满足性能、安全性以及其他相关要求。
THoughtWorks公司CTO办公室首席技术专家Ken Mugrage表示,“只保留您绝对需要的东西。镜像中往往包含主体应用程序所不需要的其他程序包。”因此,要移除应用程序当中不必要的所有其他软件包——包括shell实用程序。这不仅能够缩小镜像体积,同时也能减少其攻击面。
CloudBolt公司产品营销负责人Nilesh Deo也赞同了这个观点,“开发人员需要重新考虑自己的应用开发方法。例如创建较小的容器与基础镜像等。镜像越小,加载速度越快,应用程序的运行速度也就越快。”
不要盲目信任镜像
在软件开发当中,我们经常会重用某些现有组件,避免“重复造轮子”。对于容器开发更是如此,不过从安全角度而言,也不能盲目相信镜像,特别应该对其中可能存在的安全缺陷保持警惕。
Mugrage表示,“很多人直接从repo中选择镜像,却没有注意到其中安装有某些应用栈。这些镜像往往质量不高,甚至存在不容忽视的安全问题。我们使用的任何镜像,甚至是自有repo的镜像,都应在部署管道内的每一次运行前接受扫描,检查其漏洞与合规性。”
起步阶段就要计划可观察性、遥测与监控机制
故障,是容器与微服务的一部分,当然,这里更多强调的是故障管理,而非彻底避免故障。Kubernetes的自我修复功能无疑是该其核心吸引力之一,但也要求用户拥有适当的可见性。在这一领域,可观察性、遥测与监控机制就成了最关键的能力。
Sentry.io公司软件工程师Andrei Zbikowski指出,“Kubernetes具有内置弹性机制,符合全面监控方面的最佳实践要求。其自我修复功能可以在某些参数不满足健康要求时,重新启动存在故障的容器、或者终止并替换其他的容器。这项功能虽然可以让应用程序长期保持正常运行,但也掩盖了一些其他的问题。”
Zbikowski补充道,缺乏对代码的可见性,可能导致应用程序随时抛出错误,但管理者却因为运行指标的一切正常而误以为万事大吉,“监控应用程序以及容器/后端系统非常重要。全面的监控方法必须有能力提高问题的广泛可见性,以便在重大影响发生之前,识别并纠正问题。”
Mugrage指出, “在起步阶段,大家就应该考虑到可观察性与监控需求。对分布式应用程序进行故障排查往往极为困难,这方面需求必须被包含在应用程序设计当中。后续添加的监管解决方案,往往效果不佳。”
红帽公司技术专业布道师Gordon Haff表示,“使用多种云原生技术工具方案,可以在应用程序当中建立起复杂的监控、跟踪、服务网格以及仪表板。例如Prometheus、Jaeger、Kiali以及Istio等等都在此列,不过,工具种类繁多,这也让技术选型成为一项挑战。”