65.9K
CodeProject 正在变化。 阅读更多。
Home

Java on Azure: 第一个 Kubernetes 集群

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2021 年 4 月 26 日

CPOL

6分钟阅读

viewsIcon

4235

在本文中,我们将了解如何使用 IaC (ARM 模板) 和 GitOps,通过 Azure DevOps 管道以云原生方式自动预置我们的基础设施来设置 AKS。

在本系列的上一篇文章中,我们学习了如何使用无服务器 Azure 函数构建云应用程序。我们还了解到这种方法有一些局限性(例如从 Azure 表中过滤数据)。如果使用容器化的 Java 微服务,我们可以获得更大的灵活性。

要使用容器化服务,我们需要一个部署它们的地方。Kubernetes 正在成为大规模管理分布式系统的标准。因此,主要的云提供商提供托管的 Kubernetes 服务,帮助您部署生产就绪、自愈的解决方案,这些解决方案能够自动适应流量峰值,并具有自动发布和回滚功能。

从架构的角度来看,云托管的 Kubernetes 集群包括两个主要组件:控制平面和节点。控制平面由 kube-apiserver、etcd 键值存储、kube-scheduler、kube-controller-manager 和 cloud-controller-manager 组成。控制器响应通过 kube-apiserver 发送的请求,并管理应用程序副本、Pod 调度等。它们还与云通信,在集群自动扩缩、设置负载均衡器以及类似活动期间预置额外服务。节点是虚拟机 (VM),带有 kube-proxy、kubelet 和容器运行时等附加的 Kubernetes 组件。Kubernetes 使用工作节点来运行您的工作负载。

Azure Kubernetes Service (AKS) 是一种托管的 Kubernetes 服务,这意味着您无需自行预置控制平面。AKS 免费为您完成这项工作。但是,您需要支付实现集群节点的虚拟机的费用。您需要在主节点池中至少有一个可用的虚拟机。您可以配置您的节点池,以便在需要时添加更多虚拟机——例如,如果出现流量高峰。

要在 AKS 中设置集群,您可以使用 Azure Portal、Azure PowerShell、Azure CLI 或 Azure CloudShell。然而,这些工具要求您手动执行重复性任务。在某些时候,这变得过于耗时且容易出现人为错误。

因为您使用上述工具执行的所有操作,在底层都由Azure 资源管理器 (ARM) 处理,所以您也可以使用 ARM 模板。这些模板以 JSON 文件的形式包含您基础设施的声明。您可以将 JSON 文件保存在源代码控制系统(例如 Azure Git 存储库)中,这将使它们像您的源代码文件一样接受拉取请求。这使您能够避免许多意外创建资源,并避免代价高昂的错误。这就是我们所说的基础设施即代码 (IaC)。基础设施的声明以声明性形式(JSON 文件)保存,而不是您需要逐个执行的一组操作。

在本文中,我们将了解如何使用 IaC (ARM 模板) 和 GitOps,通过 Azure DevOps 管道以云原生方式自动预置我们的基础设施来设置 AKS。然后,我们将使用 Azure 容器注册表 (ACR) 来托管容器化的 Java 微服务。Docker 镜像将被推送到 ACR,然后 AKS 将从那里拉取该镜像进行部署。

创建模板

要创建 ARM 部署模板,您可以使用 Visual Studio Code,并从头开始创建模板。然而,在实际生活中,从头开始创建模板是很困难的,因为您需要复杂的模板,例如 Azure Kubernetes Service 的模板。这样的模板将包含许多配置元素,包括节点池、网络,以及通常还有 Azure 容器注册表。

为了简化模板创建,请从 Azure 门户开始。首先,创建 aks-group 资源组,然后使用 Azure Kubernetes Services 如下配置新集群

  • Kubernetes 集群名称:akscluster
  • 区域:美国中部
  • 可用区:1、2、3
  • Kubernetes 版本:1.18.14
  • 主节点池:2x Standard B2s
  • 身份验证方法:系统分配的托管标识
  • 网络策略:Calico
  • 容器监控:已禁用
  • 所有其他设置:保留默认值

在最终配置面板(“审核 + 创建”)上,单击“下载自动化模板”(见下图)以下载您的 ARM 模板

下载的模板包括两个文件

  • template.json — 实际的 ARM 模板,包含资源定义。
  • parameters.json — 模板的模板参数。您使用此文件进行参数化部署。例如,您可以使用相同的模板和不同的参数部署许多集群。

设置 Azure DevOps 项目和存储库

ARM 模板准备就绪后,我们可以继续在 Azure DevOps 中设置项目。登录此服务后,创建一个名为“TemperatureMonitoring”的新项目。然后,转到“Repos”,单击“Import”,并导入我们之前创建的 GitHub 存储库

使用内置的 Azure DevOps 代码编辑器将 template.jsonparameters.json 上传到 infrastructure/k8s 文件夹。完成上述更改后,我们的项目结构如下。

构建管道

项目准备就绪后,我们可以设置一个管道来部署我们的集群。在“Pipelines”下,单击“New pipeline”。这将打开以下页面,您可以在其中选择 Azure Repos Git 并指向您的存储库。

在下一步中,选择“Starter”管道。

这将在 YAML 编辑器中打开您的管道定义。

删除 `steps` 以下的所有内容(第 13-19 行)。然后,单击“Show assistant pane”并选择“Copy files”任务。

按如下配置“Copy files”任务

  • 源文件夹:infrastructure/k8s
  • 内容:**
  • 目标文件夹:$(Build.ArtifactStagingDirectory)

点击“Add”。这会将以下任务添加到您的管道 YAML 定义中

- task: CopyFiles@2
  inputs:
    SourceFolder: 'infrastructure/k8s'
    Contents: '**'
    TargetFolder: '$(Build.ArtifactStagingDirectory)'

此任务用于将 ARM 模板复制到执行构建的虚拟机。

使用任务助手创建另一个将应用 ARM 模板的任务。找到 ARM 模板部署任务并按如下配置

  • 部署范围:资源组
  • Azure 资源管理器连接和订阅:使用这些控件来验证您的 Azure 订阅
  • 操作:创建或更新资源组
  • 资源组:aks-group(或您在创建 ARM 模板时使用的组名)
  • 位置:美国中部(或任何其他地区——只需确保所选地区支持您的模板参数中 AKS 集群版本)
  • 模板:$(Build.ArtifactStagingDirectory)/template.json
  • 参数:$(Build.ArtifactStagingDirectory)/parameters.json
  • 部署模式:增量

点击“Add”后,新任务将添加到管道中

- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Resource Group'
    azureResourceManagerConnection: '<YOUR_CONNECTION>'
    subscriptionId: '<YOUR_SUBSCRIPTION_ID>'
    action: 'Create Or Update Resource Group'
    resourceGroupName: 'aks-group'
    location: 'Central US'
    templateLocation: 'Linked artifact'
    csmFile: '$(Build.ArtifactStagingDirectory)/template.json'
    csmParametersFile: '$(Build.ArtifactStagingDirectory)/parameters.json'
    deploymentMode: 'Incremental'

现在您可以单击“Save and run”。

然后,提供提交消息并单击“保存并运行”。这将触发管道。但是,在作业开始之前,您需要授予权限。

部署应在几分钟内完成。

您将在 Azure 门户中看到您的集群。

通过 GitOps 更新基础设施

为了展示通过 GitOps 部署基础设施的优势,让我们更改模板。将工作节点数从 2 更改为 4。将更改提交到 template.json 后,Azure DevOps 将自动运行管道以修改集群配置。

按如下步骤操作(见下图)

  1. 转到“Repos”并打开 template.json
  2. 单击右侧的“Edit”。
  3. 转到第 113 行并将 count 参数从 2 更改为 4。
  4. 单击“Commit”,输入您的消息,然后单击“Commit”。

这将触发管道。

后续步骤

在本文中,我们了解了如何以云原生方式预置 Azure Kubernetes Service。我们创建了一个 Azure 资源管理器 (ARM) 模板,然后使用 Azure DevOps 配置了一个 GitOps 管道。我们修改了模板,这触发了管道,并且更新后的配置已部署到 Microsoft Azure。在下一篇文章中,我们将使用集群部署基于 Java 的容器化微服务。

© . All rights reserved.