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

目录

Azure Kubernetes服务

Azure资源管理器

先决条件和清理

AKS群集模板

Azure DevOps管道

下一步


在本系列的前面部分,我们使用Azure Functions创建了一个基本的、事件驱动的、云原生应用程序。然后,我们了解了容器化和Kubernetes

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

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

Azure Kubernetes服务

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

Azure资源管理器

Azure资源管理器是在Azure中管理和部署资源的底层服务。Azure中的所有内容都通过ARM运行,但出于我们的目的,我们使用ARM模板来定义和控制集群所需的资源。

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

先决条件和清理

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

  • 用于连接到集群节点的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社区有许多快速入门模板,我们可以将其用作起点。

让我们通过将azuredeploy.json文件作为aks_cluster.json复制到我们的基础结构目录中来使用AKS启动模板。然后让我们逐步了解一些最重要的细节。

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

  • 参数——定义用于配置资源的模板的输入
  • 资源——定义要在Azure中部署的资源
  • 输出——定义模板的返回值

像这样一个编写良好的模板,使资源相当通用,并将大部分灵活性推给了参数。我们可以在通过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。

完成后,您将看到包含订阅详细信息的模板。在我们可以运行之前,我们需要更新一些元素,因为我们存储我们的函数应用程序的位置,以及Node.js的更新版本。具体来说:

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

现在,单击Save and Run按钮开始我们的Function应用程序的构建和部署过程。这个部署模板有两个阶段,构建和部署。我们在构建之前添加了第三个阶段,称为基础设施。但是,在我们执行此操作之前,我们需要确保我们的DevOps项目可以向我们的订阅添加资源。

在左侧的菜单面板中,选择项目设置,然后选择管道部分下的服务连接。

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

一旦我们设置了我们的服务主体,我们就可以将新阶段添加到我们的构建管道中。代码如下:

- 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设置为增量后,资源组中已有的资源将保持不变。保存此管道代码并签入后,管道将运行并部署我们的集群。如果您转到Azure门户,您应该会看到群集出现在资源文件夹中。

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

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

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

下一步

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

通过将我们所有的应用程序代码组合到一个我们可以在检查更改时部署的代码库,我们可以构建和部署我们的应用程序和基础设施,而无需任何进一步的工作。

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

Creating Your First Kubernetes Cluster On Azure - CodeProject

Guess you like

Origin blog.csdn.net/mzl87/article/details/121162794