当我们将「The Twelve-Factor APP III.設定」这一概念应用于Kubernetes时,可以进行替换和思考
首先
最近因为某些原因,我读了”The Twelve-Factor APP Ⅲ.設定”。因此,我现在正在热衷学习Kubernetes,思考如何将其转化为”Ⅲ.設定”的形式,或者可以使用什么辅助工具。在这个过程中,我从零开始学习了Kubernetes的知识,以及理解The Twelve-Factor APP所需的知识,并将我学到的内容和参考文献整理在这篇文章中。由于我写了一篇篇幅较长但不太深入的文章,所以我建议您从结论开始阅读。
这篇稿件是我在学习过程中收集的有参考价值的博客和文章,并加上了一些补充说明。内容并不深奥,也有很多个人观点。由于个人观点的存在,可能与原本的观点不同,请谅解。
十二要素 APP Ⅲ. 关于配置的部分。
首先,我们来解释一下”Twelve-Factor APP”。
引用”The Twelve-Factor APP的介绍”部分的话,可以说:
在现代,软件通常以服务的形式提供,被称为Web应用程序或软件即服务。Twelve-Factor App是一种用于开发这种软件即服务的方法论。
– 使用声明性格式来自动化设置,以最小化新加入项目的开发人员所需的时间和成本。
– 明确依赖于底层操作系统,以最大化在不同执行环境间的可移植性。
– 适合部署在现代云平台上,不需要服务器或系统管理,并减少开发环境和生产环境之间的差异,以实现最大的敏捷性并实现持续部署。
– 可以在不大幅更改工具、架构和开发实践的情况下进行扩展。
作为感想,我觉得解释相当困难。成本最小化,最大化可移植性和敏捷性,可部署到云平台上,高度可扩展,需要哪些能够实现这些的服务。我理解The Twelve-Factor APP就是展示了这种方法论。
在这里,我将省略详细解释,简单来说,The Twelve-Factor APP(以下简称”12Factor”)是指至少有12个因素存在的构建Software as a Service(SaaS)的方法,它记录了这些因素的指导或方针。
在这里,我们将讨论主题“12Factor#Ⅲ.配置”。
在“Ⅲ.配置”中,提到了“将配置存储在环境变量中”。这里所说的“配置”如下所示(引用自:https://12factor.net/ja/config)。
1. 对数据库、Memcached和其他后端服务等资源的处理
2. 外部服务(如Amazon S3和Twitter)的认证信息
3. 部署的主机的标准化主机名等,每次部署的值
以下是从上述三个方面来看,设置信息等应该存储在环境变量中的描述。
在实际开发中,“12因素#设置”中的设置指的是哪里?我认为判断的依据是在部署过程中(各种执行环境)是否会发生变化。以下是对设置的定义的摘录。
应用程序的设置是唯一可能在部署(暂存、生产、开发环境等)之间有所不同的东西。
有时应用程序将设置作为常量存储在代码中。这违反了Twelve-Factor的要求,即要求将设置严格地与代码分离。设置可能在每次部署时有很大差异,但代码不会发生变化。
……省略……
需要注意的是,“设置”的定义不包括应用程序内部的设置。内部设置是指Rails中的config/routes.rb或Spring中代码模块如何连接等设置。这类设置在部署之间不会改变,因此应在代码内部进行。
……省略……
Twelve-Factor应用将设置存储在环境变量中。环境变量可以在每次部署时轻松更改,而无需更改代码。
将可能更改的配置信息放入代码中,将导致每次部署都要求更改代码。这被认为与成本最小化和可移植性最大化相矛盾。
通过将配置信息存储在环境变量中,而不是放入代码中,可以表明在每次部署中轻松更改设置而无需更改代码。
另外,它以使用配置文件和使用环境变量的观点作为对称地讨论,并表明应该仍然将其存储在环境变量中。
与配置文件不同,几乎不太可能错误地提交到存储库中。
总结起来,我认为环境变量应该存储配置信息,因为它们可以在每次部署时轻松更改,并且不会被提交到存储库中。
Kubernetes 是什么?
首先,我最初参考的是关于Kubernetes是什么的讨论的以下文章。
现在问别人:Kubernetes 是什么?
我总结了Kubernetes的功能、优势和组成要素(架构)。对于我这样没有基础设施和Docker知识的人来说,一开始确实很难理解,但只要掌握了术语的概念(虽然还不完全),我认为对Kubernetes的印象就会清晰起来。
顺便提一下,我是通过以下参考资料学习了关于Docker的知识。
整理了Docker的基础知识〜第一章:容器?Docker是什么?
https://qiita.com/supaiku2452/items/8b06b774c0e2fce7df92
这篇文章从虚拟化的基本概念开始,详细介绍了Docker的运行原理。对于初学者来说,关于虚拟化和Docker的解释很易懂。要理解Docker的运行原理,需要了解Linux中的命名空间和资源管理(cgroups)的概念知识。
Docker/Kubernetes 实践容器开发入门
https://gihyo.jp/book/2018/978-4-297-10033-9
个人而言,由于我希望有系统地学习,所以我参考了《Docker/Kubernetes实践容器开发入门》进行了手写练习。我的感受是这本书非常易懂。
Kubernetes与12Factor#Ⅲ.配置的相关性
通过以上学习,我对Kubernetes和12Factor有了初步的了解。
现在我们来考虑一下,在Kubernetes中,12Factor第三点的配置如何对应到领域中。
在Kubernetes上部署的意思是什么
在上述的《十二要素应用程序 Ⅲ. 关于配置》中,我描述了对配置的定义的个人解释。在此基础上,我认为配置的定义关键在于在部署过程中配置信息是否可以更改。现在,我简要总结了在 Kubernetes 中的部署机制的学习情况。
在Docker中,通过基于被称为镜像的包含了应用程序的配置和结构的东西来生成容器,并执行应用程序。
而在Kubernetes中,则基本上是构建了由Pod(容器的集合)和Job等资源的集合体以及集群来进行应用程序的部署。在部署配置中,需要类似于构成应用程序组件的东西,这就是资源,而在Kubernetes中存在着各种不同的资源。
在Kubernetes上运行的应用程序与多种资源协同工作以实现其运行。
在这里理解12Factor#Ⅲ的设置与Kubernetes之间的关系,需要了解资源的概念及其类型的知识。此外,我开始关注Kubernetes如何设置和使用环境变量。
关于资源类型我已经参考了以下内容。
对于 Kubernetes 中的每个资源的备忘录
https://qiita.com/apstndb/items/e75c40975183b8aabba6
我参考了以下的知识,例如Pod和Node。
Kubernetes 教程
https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/explore/explore-intro/
关于 k8s pod 概述的自学笔记
https://qiita.com/MahoTakara/items/f5130bb6e9e493c46c6b
环境变量的讨论
基于以上背景,我学习了如何在Kubernetes中处理环境变量。
Kubernetes提供了5种资源来嵌入环境变量。
-
- 静的設定
sepec.containers[].envに静的な値を定義
Pod情報
Podの情報をfieldRefで参照
コンテナ情報
コンテナ情報をresourceFiledRefで参照
ConfigMapリソースの設定値
ConfigMapリソースをspec.containers[].envのvalueFrom.configMapKeyRef`で利用
設定とアプリケーションを切り離す・設定を動的に注入することが容易
同一のコンテナイメージを様々な場面・環境で使い回せる
Secretリソースの機密情報
Secretリソースをspec.containers[].envのvalueFrom.secretKeyRef`で利用
ConfigMap同様、設定とアプリケーションを切り離す・設定を動的に注入することが容易でコンテナイメージの使い回し可能
機密情報を別リソースとして定義しておき、Podからそれを読み込むことができる。
マニフェストをGitリポジトリにアップロードすることはできない。(kubesecと呼ばれるOSS使用によりアップロード可能)
得出的結論
根据「十二要素应用程序 III. 配置」,每次部署都可能会发生变化的设置信息应存储在环境变量中。在Kubernetes中,可以使用静态设置、Pod、容器信息、秘密(Secret)以及配置映射(ConfigMap)来使用环境变量。根据上述总结,根据各个用途,将设置存储在环境变量中吧。
最后
在Kubernetes环境中,最快的方法是检查环境变量,并对其进行描述。然而,为了记下我所理解的知识体系,我选择了进行较长的帖子。
文献引用
-
- https://12factor.net/ja/config
-
- https://qiita.com/MahoTakara/items/85096f8b2632c802ab22
-
- https://qiita.com/supaiku2452/items/8b06b774c0e2fce7df92
-
- https://gihyo.jp/book/2018/978-4-297-10033-9
-
- https://qiita.com/apstndb/items/e75c40975183b8aabba6
-
- https://qiita.com/MahoTakara/items/f5130bb6e9e493c46c6b
- https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/explore/explore-intro/