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

在 Azure 上创建您的第一个 Kubernetes 集群

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.78/5 (4投票s)

2021 年 4 月 14 日

CPOL

7分钟阅读

viewsIcon

5270

在本文中,我们将通过使用 Azure Kubernetes 服务 (AKS) 构建和部署 Kubernetes 群集来扩展我们现有的云原生应用程序。

在本系列文章的早期,我们使用 Azure Functions 创建了一个基本的、事件驱动的云原生应用程序。然后,我们学习了 容器化和 Kubernetes

虽然我们可以使用 Functions 本身做很多事情,但我们经常需要一些不适合 Functions 模型的功能。为了确保我们的云应用程序能够动态扩展并利用云原生带来的优势,使用容器是有意义的,特别是对于长时间运行的应用程序组件。

在本文中,我们将通过使用 Azure Kubernetes 服务 (AKS) 构建和部署 Kubernetes 群集来扩展我们现有的云原生应用程序。然后,在我们最后一篇文章中,我们将部署应用程序的基于容器的组件。为此,我们使用 Azure DevOps 和 Azure 资源管理器 (ARM) 模板,以便我们的单一代码库包含基础结构和应用程序组件的代码。

Azure Kubernetes 服务

Azure Kubernetes 服务提供了一个由 Azure 管理的简化 Kubernetes 群集。您只需指定配置并部署节点,而无需担心管理和监控群集。Kubernetes 支持多种不同的体系结构,Azure 支持许多不同的配置,但在此示例中,我们将部署一个简单的节点群集来支持单个容器。

Azure 资源管理器

Azure Resource Manager 是管理和部署 Azure 中资源的底层服务。Azure 中的一切都通过 ARM 运行,但为了我们的目的,我们使用 ARM 模板来定义和控制群集所需的资源。

ARM 模板是 Resource Manager 用于配置和部署资源的 JSON 文件,使我们能够像管理应用程序代码一样来创建和管理它们。Azure DevOps(以及 GitHub Actions 等其他工具)也可以在签入这些文件时自动将它们发送到 Azure Resource Manager 进行部署。

先决条件和清理

在创建用于部署资源的模板之前,我们需要配置两个访问组件:

  • 一个 SSH 密钥对,用于连接到群集节点。
  • 一个服务主体,它为 Kubernetes 群集与 Azure 资源进行交互提供基于角色的访问控制。

要生成密钥对,请打开您的 Azure 门户,然后单击顶部菜单栏上的 Cloud Shell()图标。这将打开一个用于处理 Azure 资源的 Bash 或 PowerShell 界面

在此 shell 中,键入命令 ssh-keygen -t rsa -b 2048,然后按照提示操作,使用默认保存的通行码和密码(开发时可以留空,但提供密码是更好的做法)。

此过程完成后,应会保存标识和公钥文件。使用上传和下载()图标,下载这两个文件以备后用。

在我们还在使用此云 shell 时,让我们通过运行命令 az ad sp create-for-rbac --skip-assignment 来创建群集的服务主体。这会在命令窗口中输出 JSON 风格的文本。保存此文本以便访问我们的群集,然后关闭 shell 窗口。

在创建 ARM 模板之前,我们应该清理我们的 Function App 和 Azure DevOps 项目,以便我们有一个地方存放我们的基础结构代码。首先,创建一个 FunctionApp 文件夹,并将我们在第一篇文章中使用的所有代码移到此文件夹中(.gitignore、.git 和 .vscode 除外)。

接下来,创建一个名为 Infrastructure 的空文件夹来存储我们的 ARM 模板。别忘了将这些更改提交并推送到 Azure DevOps。

AKS 群集模板

现在我们的先决条件已完成且项目已清理完毕,我们可以创建我们的 ARM 模板。由于 Azure 资源的规模和范围,创建模板可能是一项艰巨的任务。我们可以 从头开始创建模板,但单个资源的选项数量可能会让人不知所措。如果您查看 AKS 资源,您会发现许多潜在的属性可以设置。幸运的是,Azure 社区有许多 快速入门模板 可以作为起点。

让我们使用 AKS 入门模板,将 azuredeploy.json 文件复制到我们的 Infrastructure 目录中,并命名为 aks_cluster.json。然后,我们将逐步了解其中一些最重要的细节。

所有模板都以定义 $schema 和 contentVersion 属性开始。从那里,我们有三个主要部分:

  • Parameters – 定义模板用于配置资源的输入。
  • Resources – 定义将在 Azure 中部署的资源。
  • Outputs – 定义模板的返回值。

写得好的模板(如本例)使资源相当通用,并将大部分灵活性转移到参数中。我们可以在通过 Azure 门户部署模板时使用这些参数,也可以在 Azure DevOps 管道中定义它们。我们还可以指定一个配置文件,这样就不需要通过管道传递选项。

为此,我们在 Infrastructure 文件夹中创建一个名为 aks_cluster_params.json 的新文件,其中包含以下代码:

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
      "location": {
        "value": "centralus"
      },
      "clusterName": {
        "value": "TSAppCluster"
      },
      "dnsPrefix": {
          "value": "TSAppDns"
       },
       "linuxAdminUsername": {
           "value": "tsAdmin"
        },
        "sshRSAPublicKey": {
            "value": "ssh-rsa AAAAB3NzaC1yc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000R3JIOgtLQ9ORNTi/PN6Avk7rNi0ZS5BKrbLeieLhrD06ct2E23Hsb0vnK0w5aOQKhedQz1IOV43MAPU6Om+KC65qzVKVQk30wUoV/gSJhS9trYz+Y8L9twVQ92NKMo+UNXpG5Uhh2Hk6F5ysJBB45lo0jw5h4JQ13pEkCxotFrWmn9XUIigMZpoUuv4RhMROyLLNmy1csndMWkq9zgdxdIsw7mAUes6KiaHWN7hPOzL0sYtwlnLWPgP0sWfLT glenn@cc-884047f1-74f86db768-lblpf"
         }
    }
}

此代码配置了部署群集的 Azure 位置、群集名称、DNS 前缀和管理员用户名。将最后一个值设置为我们在先决条件步骤中创建的 id_rsa.pub 文件的内容。保存这些文件并提交更改。

Azure DevOps 管道

现在我们有了存储库中的所有组件,我们可以部署我们的群集,但让我们也设置管道来部署我们的应用程序。

单击左侧的 Pipelines,然后创建一个新 Pipeline。

对于连接选项,选择 Azure Repos Git,然后选择您的项目存储库,您将看到一个模板列表。

选择 Node.js Function App to Linux on Azure,连接到您的 Azure 订阅,然后选择我们在第一篇文章中创建的 Function App。

完成后,您将看到已填入订阅详细信息的模板。在运行此命令之前,我们需要更新一些元素,因为我们存储 Function 应用程序的位置以及 Node 的更新版本。具体来说:

  • 在第 35 行,将 Node 版本的 versionSpec 更改为 12.x。
  • 在第 49 行之后,添加行 workingDirectory: '$(Build.SourcesDirectory)/FunctionApp'。这将 npm 指向正确的目录来构建我们的源。
  • 最后,在第 55 行(添加上述行之前的第 54 行),将 Archive files 的 rootFolderOrFile 属性更改为 '$(Build.SourcesDirectory)/FunctionApp'。这确保了我们的构建位于创建的 ZIP 存档的根目录中。

现在,单击 Save and Run 按钮以启动 Function 应用程序的生成和部署过程。此部署模板有两个阶段:build 和 deploy。我们将在 build 之前添加第三个阶段,名为 Infrastructure。但在此之前,我们需要确保我们的 DevOps 项目可以向我们的订阅添加资源。

在左侧的菜单面板中,选择 project settings,然后在 Pipelines 部分下选择 Service Connections。

选择 Azure Resource Manager 选项,并使用服务主体(自动)作为身份验证方法。填写订阅、资源组、名称和描述的详细信息,然后单击 save

设置好服务主体后,我们就可以将新阶段添加到我们的生成管道中。代码如下:

- stage: Infrastructure
  displayName: Deploy Infrastructure
  jobs:
    - job: Cluster
      displayName: Deploy AKS Cluster
      pool:
        vmImage: $(vmImageName)
      steps:
      - task: AzureResourceManagerTemplateDeployment@3
        displayName: 'Deploy AKS Cluster'
        inputs:
          deploymentScope: 'Resource Group'
          azureResourceManagerConnection: 'TSTutorialExample'
          subscriptionId: '37200000-0000-0000-0000-000000000000'
          action: 'Create Or Update Resource Group'
          resourceGroupName: 'TSFunctionTutorial'
          location: 'centralus'
          templateLocation: 'Linked artifact'
          csmFile: 'Infrastructure/aks_cluster.json'
          csmParametersFile: 'Infrastructure/aks_cluster_params.json'
          deploymentMode: 'Incremental'

此阶段有一个步骤,使用 AzureResourceManagerTemplateDeployment 任务类型来部署我们的 ARM 模板和配置文件。如果运行此任务的配置,我们需要填充以下输入:

  • azureResourceManagerConnection:我们的服务主体的名称,以便管道有权部署资源。
  • subscriptionId:我们的 Azure 订阅的唯一标识符。
  • resourceGroupName:我们正在部署资源的资源组。
  • location:我们希望放置资源的 Azure 位置。
  • csmFilecsmParametersFile:我们的 ARM 模板和参数文件的位置。

还值得注意的是,当 deploymentMode 设置为 incremental 时,资源组中已有的资源将保持不变。保存此管道代码并签入后,管道将运行并部署我们的群集。如果您转到 Azure 门户,您应该会在资源文件夹中看到群集出现。

我们还可以使用 kubectl 连接到我们的群集并检查正在运行的节点。最简单的方法是再次打开 Azure 门户中的云控制台,然后使用命令:

az aks get-credentials --resource-group TSFunctionTutorial --name TSAppCluster

这将连接已配置的 kubectl 工具到我们已部署的群集。现在,如果您运行 kubectl get nodes,您应该会看到三个代理节点已返回并就绪。

后续步骤

在本文中,我们了解了 Azure 的托管 Kubernetes 服务 AKS,并使用 ARM 模板和 Azure DevOps 管道将一个简单的群集部署到我们应用程序的资源组。当我们创建管道时,我们还配置了我们的应用程序以自动生成和部署到我们在第一篇文章中配置的资源。

通过将所有应用程序代码合并到一个代码库中,我们可以在签入更改时进行部署,从而无需进一步的工作即可构建和部署我们的应用程序和基础结构。

本系列的下一篇也是最后一篇文章 中,我们将把一个容器化的应用程序组件部署到我们的群集中。

© . All rights reserved.