容器的重要性
在讨论云原生技术时,容器是一个不可忽视的话题。
根据Cornelia Davis在《Cloud Native Patterns》一书中的观点,容器是云原生应用的基础。
云原生基金会将微服务的容器化视为云原生旅程的起点。
微服务的容器化过程相对简单易行。
这一过程涉及将代码、依赖项和运行时打包成一个称为容器镜像的二进制文件,并将该镜像存储在镜像仓库中,Docker Hub是官方维护的一个重要仓库。
在需要时,这些镜像可以被转换为可运行的容器实例,并在任何安装了容器运行时引擎的计算机上执行,从而可以根据需求灵活部署多个容器实例。
下图展示了三个微服务在单台主机上以容器化形式运行的情况。

每个容器独立管理自己的依赖和运行时,可能存在差异。上图中,我们可以看到在同一主机上运行的Product微服务的不同版本。尽管容器共享基础主机的操作系统、内存和处理器资源,但它们之间是相互隔离的。
容器模型遵循了十二要素应用中的依赖性原则。
第二要素强调每个微服务应独立打包自己的依赖项与变更,确保其不会影响整个系统的稳定性。
容器支持Linux和Windows的工作负载。
尽管市场上有多个容器供应商,Docker已成为打包、部署和运行云原生应用程序的事实标准,并在市场中占据了领先地位,推动了软件容器的发展。
为什么选择容器?
容器提供了良好的移植性,确保在不同环境中输出一致的结果。通过将所有内容封装到一个单一的程序包中,微服务及其依赖项与底层基础设施相互隔离。用户可以在任何安装了Docker运行时引擎的环境中部署相同的容器,从而消除了预先配置环境带来的时间成本。
容器编排
使用Docker API和工具可以创建镜像和容器,但还需要其他工具来管理这些容器。
管理容器的软件被称为“容器编排器”,在大规模使用容器时,它们至关重要。

容器编排器的功能包括:
任务描述、调度容器实例的自动配置、在附近或远离的位置调配容器以提高可用性和性能的亲和性/反亲和性、自动探测并修复故障的健康监测、将故障实例自动转移到健康机器的故障转移、根据预期状态自动增减容器的扩展、为容器提供覆盖网络的网络服务发现、容器之间的相互发现、零停机增量升级及自动回滚的滚动升级。
容器编排器也遵循十二要素应用中的可丢弃性和并发性原则。
第九要素强调服务实例应为一次性,以便快速启动并具备可伸缩性,同时优雅关闭以保持系统的正确状态。
第八要素则强调服务应在多个小型相同进程(副本)上扩展,而非在功能最强大的单一计算机上扩展大型实例。
市场上有多种容器编排器,但Kubernetes已成为云原生领域的事实标准。它是一个可移植、可扩展的开源平台,用于管理容器。
用户可以自行构建K8s集群并管理其资源,但这可能会比较复杂。
Azure云提供了K8s作为托管服务(AKS),用户只需利用K8s的功能,而无需维护K8s集群。
关于Azure Kubernetes Services的详细信息,请参见第2章《扩展云原生应用》。
参考资料
https://docs.Microsoft.com/en-US/dotnet/architecture/cloud-native/definition
