我们的行业在过去十年中取得了令人难以置信的进步,这在一定程度上要归功于 Docker、Docker Compose 和 Kubernetes 等技术。然而,我们仍在研究如何在我们所处的多样化环境中进行开发。
容器化在开发和运维掀起了一场风暴。在过去,部署是高度依赖于特定技术的,通常需要对每个项目进行大量不可重复的工程工作。
你是否部署到 vps?你是否在分发虚拟机镜像?静态可执行文件?需要特定解释器的脚本? 根据你对这些问题的回答,你可能已经使用了 Capistrano、Puppet、shell 脚本、Ansible、deb 或 rpm 包、cloud-init 脚本、专有云技术、upstart、systemd、init 等很多技术。
在部署阶段,系统管理和开发之间的界限就变得模糊了,DevOps 的原则就诞生了。随着 DevOps 开始成熟,业界发展出了应用开发的最佳实践,比如 12 因素应用程序方法论,但许多实现细节仍然是依赖于特定技术的。
挑战剖析
回归现象看本质,随着业务复杂度的提高,单体应用越来越庞大,对资源形成挑战剧增:
挑战一、资源利用率低
烟囱系统是指一种由相互关联的元素紧密结合在一起的集合,其中单个元素无法区分、升级或重构。
很多企业的IT系统都是烟囱式,这种模式有很多弊端,如:
- 重复建设运维
- 交互成本高昂
- 难以持续运营
- 业务灵活性差
挑战二、应用架构扩展性差
单体架构在规模比较小的情况下工作情况良好,随着系统规模的扩大,暴露出来的问题也越来越多,主要有以下几点:
- 复杂性渐增;
- 技术创新受阻;
- 按需伸缩变难;
- 部署效率下降。
挑战三、开发周期长
庞大代码基线、组件耦合大、责任不清楚,牵一发而动全身。
部署慢、扩容慢:部署过程不可重复、出错率高;不支持自动弹性伸缩。
升级难:固定时间窗、集中大规模人力中断服务升级。
在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。
换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。
IT架构演进
为了解决传统应用升级缓慢、架构臃肿、不能快速迭代、故障不能快速定位、问题无法快速解决等问题,云原生这一概念横空出世。
云原生可以改进应用开发的效率,改变企业的组织结构,甚至会在文化层面上直接影响一个公司的决策。另外,云原生也很好地解释了云上运行的应用应该具备什么样的架构特性——敏捷、可靠、弹性、可扩展、故障可恢复。
行业场景
假设你是一家新能源汽车商解决方案架构师,贵公司为全球各地的客户提供汽车跟踪解决方案。我们可以使用容器化的实例来快速部署到新的客户区域,并按需缩放资源来满足客户需求。我们希望使用容器业务流程平台,以便轻松地开发、部署和管理容器化的应用程序。
假设你是一家大型服装品牌零售担任CIO,你决定将所有服务移动到Azure Kubernetes服务中。哪些组件会对每月Azure费用产生影响?只需考虑群集使用的虚拟机实例、存储和网络资源付费。
假设你是一家大型跨国研发制造行业CTO,我们都须知智能制造行业大量调用需要持久化存储。你将使用AKS的哪些功能?对于需要持久性存储的容器,AKS支持静态和动态存储卷。
假设你就职于一家监视道路状况的交通出行公司担任研发架构师,开发人员团队需要与AKS群集中的其他组件进行端到端测试。该团队希望在不复制或模拟依赖关系的情况下进行测试。他们应该选择哪些服务?借助Azure Dev Spaces,无需复制或模拟依赖关系,即可独立开发代码并与其他组件进行端到端测试。
需求拓展
就拿上述新能源汽车商业务场景深入展开详述,假定业务场景解决方案包含三个主要应用程序:
- 一个主程序网站,其中包括有关要跟踪的车辆的地图和信息;
- 一种数据处理服务,用于收集和处理从所跟踪车辆发送的信息;
- 一个MSSQL数据库,用于存储从网站捕获的跟踪信息和用户信息。
传统思路
通过横向扩展解决方案满足客户需求。为每个应用程序部署新的虚拟机(VM),然后将应用程序部署到 VM 中。
但这样做的话,必须确保是否已为每个应用程序安装和配置适当的操作系统 (OS) 版本和依赖项。
还必须确保安装和升级的是应用程序的适当版本。如果存在错误,则必须确保你能够以影响最小的方式回滚。
AKS思路
优势:
- AKS环境启用了自动更新、自愈和轻松缩放等功能;
- Kubernetes群集主机由Azure免费管理;
- 由你管理群集中的代理节点,且只需为节点在其上运行的VM付费;
- 可以在Azure门户中创建群集,也可以使用Azure CLI 创建群集;
- 创建群集时,可以使用资源管理器模板自动创建群集;
- 利用这些模板,可以指定高级网络、Azure Active Directory (AD) 集成和监视等功能;
- 与自定义Kubernetes群集相比,利用AKS,可以享受开放源代码Kubernetes的优势,不存在复杂性或运营开销。
第一步:创建 AKS 群集
创建 AKS 群集时,有两个选项可供选择。
可以使用 Azure 门户或 Azure CLI。
这两个选项都必须配置有关群集的基本信息。
例如:
- Kubernetes 群集名称;
- 要安装的 Kubernetes 版本;
- 用于使主节点可公开访问的 DNS 前缀;
- 初始节点池大小;
- 初始节点池大小默认为两个节点,但建议在生产环境中至少使用三个节点。
除非另行指定,否则创建工作流会使用默认配置创建 Kubernetes 群集,以用于缩放、身份验证、网络和监视。
创建 AKS 群集通常需要几分钟时间。完成后,可以更改任何默认 AKS 群集属性。
可通过 Azure 门户或从命令行访问和管理群集。
第二步:开发工作负载并将其部署到 AKS
AKS 支持 Docker 映像格式,使用任何开发环境来创建工作负载、将工作负载打包为容器以及将容器部署为 Kubernetes Pod。
此处使用标准 Kubernetes 命令行工具或 Azure CLI 来管理部署。
对标准Kubernetes工具的支持可确保你无需更改当前工作流,即可支持将现有Kubernetes迁移到 AKS。
AKS还支持所有常用开发和管理工具,例如Helm、Draft以及适用于Visual Studio Code 的 Kubernetes 扩展和 Visual Studio Kubernetes Tools。
资源监视-Azure Monitor
Azure Monitor 是一项用于收集、分析和响应来自云和本地环境的遥测数据的服务。
IT运营、DevOps和开发人员团队使用Azure Monitor来最大限度地提高应用程序和服务的可用性和性能。
Azure Monitor 的主要特性包括:
Azure Monitor 可以从应用程序、基础结构、Azure 平台和集成的任何自定义源收集堆栈中所有层的性能和可用性遥测数据。
- 用于数值时序值的 Azure Monitor 指标和用于存储日志数据的 Azure Monitor 日志;
- 系统会自动针对 Azure 资源收集和存储 Azure Monitor 指标;
- 对 Azure 资源进行监视和故障排除。可用见解包括VM见解、应用程序见解和容器见解;
- 通过工作簿和仪表板对数据进行可视化,并且可以通过自定义图表和分析来分析数据;
- Azure Monitor 自带可视化监视数据的功能,并且可以使用其他 Azure 服务将这些数据发布给不同的受众。允许将不同类型的数据合并到 Azure 门户的单个窗格中。
监视选项
指标-描述系统某些方面在特定时间点的情况的数值。
日志-收集用于分析的日志数据。
可视化效果-将不同类型的数据合并到Azure 门户的单个窗格中。用于数据分析和在门户中创建丰富的可视化报表。
- 指标-用于描述系统某些方面在特定时间点的情况。是轻型数据,可以支持近实时方案。
- 日志-使用查询来分析 Azure Monitor 收集的日志数据,快速检索、合并和分析所收集的数据。
- 可视化效果-以 Azure 仪表板和工作簿的形式提供了两种主要的可视化效果。可以利用这两个功能向管理人员或其他相关方提供可视化报表,从而实现轻松使用所监视的数据。
关于Azure Dev Spaces
价值点:
- 最大程度减少每位团队成员的本地开发计算机设置;
- 使用 Visual Studio 或 Visual Studio Code 直接快速执行循环访问和调试代码;
- 生成 Docker 和 Kubernetes 配置即代码资产,供开发到生产使用;
- 独立开发代码,并与其他组件一起进行集成测试,而无需复制或模拟依赖关系。
部署中心:
可以使用配置后的此 DevOps 管道为 AKS Kubernetes 群集设置(CI)和(CD)管道。
利用 Azure DevOps Projects,便可以执行以下操作:
- 自动创建 Azure 资源,例如 AKS 群集;
- 创建用于监视 AKS 群集的 Azure Application Insights 资源;
- 启用适用于容器的 Azure Monitor 以监视 AKS 群集上的容器工作负载的性能;
- 添加更丰富的 DevOps 功能。例如,可在部署之前添加审批,预配其他 Azure 资源,运行脚本或升级工作负载。
补充何时使用 Azure Kubernetes 服务
创建群集或进行以下部署后,都可以配置上述所有功能。