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

在 Azure 上现代化 Python 应用和数据(第四部分):Azure Kubernetes Service

2022 年 5 月 2 日

CPOL

9分钟阅读

viewsIcon

5038

如何容器化旧版 Python 应用、创建 AKS 集群,并使用 VS Code 进行部署

Azure 提供各种基于云的服务以满足您的需求。例如,对于您的单个单体应用或具有少量后端服务的 n 层应用,Azure App Service 可能是最佳选择。但是,如果您有多个后端服务或微服务,Azure Kubernetes Service (AKS) 则更适合。

AKS 比 Azure App Service 更复杂。尽管如此,当组织将其应用程序迁移到云并希望在统一的容器运行时环境中运行所有旧版和现代应用程序时,AKS 是一个不错的选择。

在本系列的六部分“在 Azure 上实现 Python 应用和数据的现代化”文章中的第四篇中,我们将演示如何容器化您的旧版 Python 应用、创建 AKS 集群,并使用 Visual Studio Code 将应用部署到 AKS。要回顾前三篇文章,请查看

请遵循本教程中的步骤来运行您的应用程序。或者,下载并打开此 GitHub 存储库文件夹 以获取最终项目。您应该了解 Python 和 Django 才能继续学习。

介绍 Azure Kubernetes Service (AKS)

我们的 Azure Kubernetes Service (AKS) 实现包含以下参与者

  • Azure 负载均衡器:当我们配置 Azure Kubernetes Service 时,它会创建一个新的负载均衡器。Azure 负载均衡器有助于扩展我们的应用程序并创建高可用性服务。

  • Azure CLI:Azure 命令行界面 (Azure CLI) 允许我们创建和管理 Azure 资源。它在所有 Azure 服务中均可用,可帮助您快速工作,并强调自动化。我们将使用 Azure CLI 登录 Azure 帐户、管理凭据、创建角色以及连接到容器注册表等任务。

  • Azure 容器注册表:我们将使用 Azure 容器注册表来存储和管理容器映像。在本地使用 Visual Studio Code 构建 Conduit 映像后,我们将把映像推送到 Azure 容器注册表,以创建一个运行 Conduit 应用的容器。

  • Azure Kubernetes 集群:我们可以使用 Azure 命令行界面 (CLI)、Azure 门户或 PowerShell 创建 AKS 集群。

  • Azure Active Directory 和 RBAC:我们可以将 Azure Kubernetes Service 配置为使用 Azure Active Directory (AD) 进行用户身份验证。在此配置中,我们使用 Azure AD 身份验证令牌登录 AKS 集群。身份验证后,我们将使用内置的 Kubernetes 基于角色的访问控制 (Kubernetes RBAC) 根据我们的用户身份来管理新集群。

  • Azure Database for PostgreSQL:我们的容器化应用程序将与我们在本系列第二篇文章中创建的现有 PostgreSQL 数据库进行交互。

容器化 Django 应用

Azure App Service 允许我们在喜欢的语言中托管 Web 应用、移动后端和 REST API。它支持在 Windows 和 Linux 上运行应用,提供自动缩放和高可用性,并支持自动化部署。也就是说,您可能会想知道为什么我们要迁移到基于容器的方法。

组织通常选择这种模式,因为容器提供了许多可能性。它们是隔离且可移植的环境,开发人员可以在其中打包应用程序及其必要的库和链接。结果是更高的工作效率和简化的部署。

容器存在已久,但花费了一段时间才获得认可。Docker 以其广泛的支持和易学性普及了容器,并很快成为行业标准。

要使 Docker 在您的计算机上运行,请安装 Docker Engine,它可以通过 Docker Desktop 在 Linux 发行版、macOS 和 Windows 上使用,并提供静态二进制安装。

安装用于 VS Code 的 Docker 和 Kubernetes 扩展

让我们安装适用于 Visual Studio Code 的 Docker。使用 Docker 扩展,可以轻松地从 VS Code 构建、管理和部署容器化应用程序。它还方便地提供了许多命令来在 VS Code 中管理您的容器。

然后安装适用于 Visual Studio Code 的 Kubernetes。此扩展使开发人员能够构建在 Kubernetes 集群中运行的应用程序,并帮助 DevOps 人员对 Kubernetes 应用程序进行故障排除。

容器化旧版 Python 应用

现在,让我们通过打开命令面板 (Ctrl+Shift+P),然后选择Docker: Add Docker Files to Workspace 命令,向工作区添加一个 Docker 文件。

此命令会生成 Dockerfile.dockerignore 文件,并将它们添加到您的工作区。VS Code 还会询问您是否要添加 Docker Compose 文件,这是可选的。

该扩展可以为流行的开发语言(包括 Python)生成 Docker 文件。从列表中选择Python: Django 以相应地自定义生成的 Docker 文件。

然后选择 manage.py 作为您应用的入口点。

并将 **8000** 添加为您的应用将监听的端口。

然后选择以包含可选的 Docker Compose 文件。

创建这些文件时,我们还会制作必要的工件以提供 Python 的调试支持。

传统的 Web 服务器无法独立运行 Python 应用程序。它需要一些额外的模块。WSGI 规范提供了 Web 服务器正确执行 Python 代码的标准接口。

因此,让我们安装 Gunicorn,它是一个 Python WSGI HTTP 服务器,与各种 Web 框架兼容。打开应用的 requirements.txt 文件并添加此行

gunicorn==20.1.0

打开 Dockerfile 文件,并在 requirements.txt 安装之前添加此代码块

RUN apt-get update \
    && apt-get -y install libpq-dev gcc \
    && pip install psycopg2

Dockerfile 的末尾,修改此行,以便 Gunicorn 知道如何服务您的 Conduit WSGI 应用程序

CMD ["gunicorn", "--bind", "0.0.0.0:8000", "conduit.wsgi:application"]

现在打开 docker-compose.yml 文件,并将服务名称和映像名称都替换为“conduit”。

version: '3.4'
services:
  conduit:
    image: conduit
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      - 8000:8000

然后打开 docker-compose.debug.yml 文件,并将服务名称和映像名称都替换为“conduit”。

services:
  conduit:
    image: conduit

现在,修改 \conduit\settings.py 文件以包含我们将稍后在 AKS 上通过环境变量配置的新允许主机

ALLOWED_HOSTS = ['127.0.0.1', 'localhost', 
'conduitwebapp.azurewebsites.net', os.environ.get("AKS_HOST")]

最后,右键单击 Dockerfile 并单击Build Image 来构建 Conduit 应用程序的容器化映像。

然后将映像标记为“conduit:v1”。

创建资源组

要在 Azure 上托管基于 Kubernetes 的应用程序,您需要为虚拟机 (VM)、存储帐户、虚拟网络、Web 应用、数据库和数据库服务器创建资源。而且,当您在 Azure 上托管多个应用程序时,管理不断增加的资源数量可能会变得不堪重负。使用资源组可以提供帮助。Azure 资源组是一个包含 Azure 解决方案相关资源的实体。

使用 Microsoft Azure 门户,让我们创建一个名为 conduit-rg 的资源组。首先,单击Create a resource 并搜索“resource group

接下来,单击Create

然后,将其命名为“conduit-rg”,然后单击Review + create

创建 AKS 集群

转到 Azure 门户主页,然后单击加号图标以创建新的 AKS 集群。然后,搜索“Kubernetes Service

然后单击Create

接下来定义 Azure **Subscription**。Azure 订阅授予您访问 Azure 服务的权限。Azure 还提供资源使用报告,并根据您的订阅进行计费。

指定 **Resource group**。此资源集合共享相同的生命周期、权限和策略。

此外,选择 **Cluster preset configuration**。由于这是一个演示,我们旨在以最低成本:选择 **Dev/Test ($)** 预设。

以下屏幕截图中的示例创建了一个名为“conduit-cluster”的集群,其中包含一个节点。此创建过程需要几分钟才能完成。

创建容器注册表

您可以使用 Azure 容器注册表来构建、存储和管理容器映像和工件,无论您的容器部署类型如何,都可以使用私有注册表。稍后,此容器注册表将存储我们本地构建的相同映像。

选择 **Resource group**“conduit-rg”,并将 **Registry** 命名为“conduitacr”。此外,选择“Basic” **SKU**,然后单击Review + create

准备 AKS 以发布应用

让我们使用 Azure CLI 和 kubectl 的命令行并准备 AKS 来发布我们的应用。

如果您使用的是本地安装,请使用 az login 命令通过 Azure CLI 登录。请按照您的终端显示的步骤完成身份验证。

> az login

此命令将在您的 Web 浏览器中打开 https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize 并提示您登录。登录后,您的本地安装将记住您的帐户。

安装 kubectl

kubectl 是一个用于管理 Kubernetes 集群的命令行工具。通过安装 kubectl 在您的计算机上设置 Kubernetes 工具。

使用 az aks get-credentials 命令配置 kubectl 以连接到您的 Kubernetes 集群。此命令将下载凭据并配置 Kubernetes CLI 以使用这些凭据。

> az aks get-credentials --resource-group conduit-rg --name conduit-cluster

命令将产生以下信息

Merged "conduit-cluster" as current context in C:\Users\moliveira\.kube\config

现在,让我们使用以下命令创建一个 服务主体 并为其分配 AcrPull 角色

> az ad sp create-for-rbac --role AcrPull

在范围“/subscriptions/3acc8650-3ea0-42db-b1dd-694439b0aa06”下创建“AcrPull”角色分配。

在推送和拉取容器映像之前,我们必须登录到我们已经创建的 Azure 容器注册表。使用 az acr login 命令,在与 Azure CLI 登录时仅指定“conduitacr”注册表名称。

> az acr login --name conduitacr

Login succeeded

接下来,运行以下命令将 conduitacr ACR 帐户附加到 conduit-rg 资源组内的“conduit-cluster”AKS 集群

> az aks update -n conduit-cluster -g conduit-rg --attach-acr conduitacr

AAD role propagation done[############################################] 100.0000%

现在创建一个标记 conduit:v1,它引用名为 conduit:v1 的源映像

> docker tag conduit:v1 conduitacr.azurecr.io/conduit:v1

然后,运行以下命令将 conduitacr.azurecr.io/conduit:v1 映像推送到 conduitacr 存储库

> docker push conduitacr.azurecr.io/conduit:v1

Kubernetes 清单文件定义了所需的集群状态,例如要运行的容器映像。让我们创建一个名为 conduit-app.yml 的清单文件,其中包含以下 YAML 定义

apiVersion: apps/v1
kind: Deployment
metadata:
  name: conduit
spec:
  replicas: 1
  selector:
    matchLabels:
      app: conduit
  template:
    metadata:
      labels:
        app: conduit
    spec:
      containers:
      - name: conduit
        # image: conduit:v1
        image: conduitacr.azurecr.io/conduit:v1
        resources:
          limits:
            memory: "256Mi"
            cpu: "500m"
        ports:
        - containerPort: 8000
        env:
        - name: DATABASE_NAME
          value: "conduit_db"
        - name: DATABASE_USER
          value: "myadmin@mydemoserver-20220116"
        - name: DATABASE_PASSWORD
          value: "123!@#qweQWE"
        - name: DATABASE_HOST
          value: "mydemoserver-20220116.postgres.database.azure.com"
        - name: AKS_HOST
          value: "my-aks-cluster-external-ip"
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                    - django-app
              topologyKey: "kubernetes.io/hostname"
---
apiVersion: v1
kind: Service
metadata:
  name: conduit
spec:
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8000
  selector:
    app: conduit

最后,使用 kubectl apply 命令部署应用程序,并指定您的 YAML 清单的名称

> kubectl apply -f conduit-app.yml
deployment.apps/conduit created
service/conduit created

测试应用程序

Kubernetes 服务将运行的应用程序的前端公开到 Internet。此过程可能需要几分钟。

使用带 --watch 参数的 kubectl get service 命令来监视进度。

> kubectl get service conduit --watch

NAME      TYPE           CLUSTER-IP   EXTERNAL-IP     PORT(S)        AGE
conduit   LoadBalancer   10.0.81.75   52.147.222.26   80:32599/TCP   15s

现在打开 conduit-cluster 资源

打开 **Workloads** 选项卡,找到 **conduit** 部署

然后单击 YAML 选项卡以编辑配置。查找 AKS_HOST 环境设置

然后,将 AKS_HOST 环境变量的值更改为先前运行 kubectl get service 命令的外部 IP

最后,保存对 YAML 配置的更改,然后转到 http://<<EXTERNAL-IP>>/api/articles。

后续步骤

在本文中,我们通过将其迁移到 Azure Kubernetes Service (AKS) 进一步现代化了我们的 Python 应用。我们使用 Docker 和 Visual Studio Code 从本系列一开始我们就一直在使用的 Conduit Django 应用生成了容器映像。

然后,我们创建了与 AKS 相关的 Azure 资源,包括资源组、部署、服务、容器注册表和 Kubernetes 集群。接下来,我们将本地容器化应用映像推送到容器注册表,并启动 AKS 服务来在线测试我们的容器化应用。

将 Conduit 应用迁移到 Azure Kubernetes Service 为您的组织带来了许多好处,包括简化基于微服务的架构的部署和管理、优化水平缩放,以及实现自愈、负载均衡和秘密管理。

尽管我们先前已将数据迁移到云托管的 Azure Database for PostgreSQL,但我们可以进一步进行数据现代化。请继续阅读第 5 部分,使用 Djongo Mapper 和 Cosmos DB 的 MongoDB API 将您的数据和应用迁移到新的 Cosmos DB 数据库。

要了解有关如何使用 Kubernetes 更快地构建、交付和扩展基于容器的应用程序,以及如何在 Azure 上使用 Kubernetes 大规模部署和管理容器的更多信息,请参阅 Get up and running with Kubernetes

© . All rights reserved.