在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service

目录

Azure Kubernetes Service(AKS)简介

容器化Django应用程序

为VS Code Extensions安装Docker和Kubernetes

容器化旧版Python应用

创建资源组

创建AKS群集

创建容器注册表

准备AKS以发布应用

安装kubectl

测试应用程序

后续步骤


这是一个由6部分组成的系列文章的第4部分,该系列演示了如何使用Azure工具和服务逐步实现整体式Python应用程序及其数据的现代化。本文介绍如何容器化旧版Python应用、创建AKS群集以及如何使用Visual Studio Code将应用部署到AKS

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

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

在由六部分组成的现代化Azure上的Python应用和数据系列的第四篇文章中,我们将演示如何使用Visual Studio Code容器化旧版Python应用、创建AKS群集以及将应用部署到AKS。要查看前三篇文章,请查看:

  • 第 1 部分:简介
  • 第 2 部分:迁移数据
  • 第 3 部分:切换到Azure应用服务

按照本教程中的步骤运行应用程序。或者,下载并打开此GitHub 存储库文件夹以获取最终项目。你应该知道PythonDjango

Azure Kubernetes Service(AKS)简介

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

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第1张图片

  • Azure负载均衡器:当我们配置 Azure Kubernetes服务时,它会创建一个新的负载均衡器。Azure负载均衡器可帮助缩放应用程序并创建高度可用的服务。
  • Azure CLI:Azure命令行界面(Azure CLI)允许我们创建和管理 Azure 资源。它跨Azure服务提供,可让你快速工作,强调自动化。我们将使用Azure CLI登录到Azure帐户、管理凭据、创建角色和连接到容器注册表等任务。
  • Azure容器注册表:我们将使用 Azure容器注册表来存储和管理容器映像。使用Visual Studio Code在本地生成管道映像后,我们会将镜像推送到Azure容器注册表,以创建一个容器,其中运行了管道应用。
  • Azure Kubernetes Cluster:我们可以使用Azure命令行界面(CLI)、Azure门户或PowerShell创建AKS群集。
  • Azure Active DirectoryRBAC我们可以将Azure Kubernetes Service配置为使用Azure Active Directory(AD)进行用户身份验证。在此配置中,我们使用Azure AD身份验证令牌登录到AKS群集。通过身份验证后,我们将使用内置的Kubernetes基于角色的访问控制(Kubernetes RBAC)根据我们的用户身份管理我们的新集群。
  • 适用于PostgreSQLAzure 数据库:我们的容器化应用将与在本系列的第二篇文章中创建的现有PostgreSQL数据库进行交互。

容器化Django应用程序

Azure应用服务允许我们使用自己喜欢的语言托管Web应用、移动后端和REST API。它使应用能够在WindowsLinux上运行,提供自动缩放和高可用性,并启用自动部署。也就是说,您可能想知道为什么我们要转向基于容器的方法。

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

集装箱已经存在了很长时间,但需要一段时间才能获得牵引力。Docker以其广泛的支持和易于学习的方式普及了容器,并在短时间内成为行业标准。

要让Docker在您的机器上运行,请安装Docker Engine(可在Linux发行版、macOSWindows上通过Docker Desktop 使用)和静态二进制安装。

VS Code Extensions安装DockerKubernetes

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

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第2张图片

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

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第3张图片

容器化旧版Python应用

现在,让我们通过打开命令面板(Ctrl + Shift+P)然后选择Docker:将Docker文件添加到工作区命令来将Docker文件添加到工作区

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第4张图片

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

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

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第5张图片

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

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第6张图片

并添加8000作为应用将侦听的端口。

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第7张图片

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

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第8张图片

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

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第9张图片

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

所以,让我们安装Gunicorn,一个与各种Web框架兼容的Python WSGI HTTP服务器。打开应用程序的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并单击构建镜像以生成Conduit应用程序的容器化镜像。

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第10张图片

然后将图像标记为conduit:v1

创建资源组

若要在Azure上托管基于Kubernetes的应用程序,需要为虚拟机(VM)、存储帐户、虚拟网络、Web应用、数据库和数据库服务器创建资源。在Azure上托管多个应用程序时,管理越来越多的资源可能会变得不堪重负。使用资源组会有所帮助。Azure资源组是持有Azure解决方案相关资源的实体。

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

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第11张图片

接下来,单击创建

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第12张图片

然后,将其命名为conduit-rg并单击查看 + 创建

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第13张图片

创建AKS群集

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

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第14张图片

然后单击创建

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第15张图片

接下来定义Azure订阅Azure订阅授予你对Azure服务的访问权限。Azure还根据订阅提供资源使用情况报告和计费服务。

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

此外,选择群集预设配置。由于这是一个演示,我们的目标是成本最低:开发/测试($)预设。

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第16张图片

以下屏幕截图中的示例创建了一个具有一个节点的名为conduit-cluster的群集。此创建将需要几分钟才能完成。

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第17张图片

创建容器注册表

无论容器部署类型如何,都可以使用Azure容器注册表在专用注册表中生成、存储和管理容器映像和项目。稍后,此容器注册表将存储我们在本地生成的相同映像。

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第18张图片

选择资源组conduit-rg并命名注册表conduitacr。此外,选择基本SKU然后单击查看 + 创建

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第19张图片

准备AKS以发布应用

让我们使用一个带有Azure CLIkubectl的命令行,准备AKS发布我们的应用程序。

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

> az login

此命令将在打开您的Web浏览器Sign in to your account并提示您登录。登录后,您的本地安装将记住您的帐户。

安装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:v1conduitacr镜像推送到存储库:

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

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第20张图片

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服务将正在运行的应用程序的前端暴露给互联网。此过程可能需要几分钟时间。

使用带有--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源:

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第21张图片

打开工作负载选项卡并找到管道部署:

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第22张图片

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

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第23张图片

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

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第24张图片

最后,保存对YAML配置的更改并转到http://<>/api/articles

在Azure上实现Python应用和数据现代化第4部分:Azure Kubernetes Service_第25张图片

后续步骤

在本文中,我们通过将Python应用移动到Azure Kubernetes Service(AKS)来进一步实现其现代化。我们使用DockerVisual Studio Code从我们自本系列开始以来一直在使用的Conduit Django应用程序生成容器映像。

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

Conduit应用迁移到Azure Kubernetes服务可为组织提供许多好处,包括简化基于微服务的体系结构的部署和管理、简化水平缩放以及启用自我修复、负载均衡和机密管理。

尽管我们之前将数据转移到用于PostgreSQL的云托管Azure数据库中,但我们可以进一步进行数据现代化。继续阅读本系列的第5部分,使用Djongo MapperCosmos DBMongoDB API将数据和应用迁移到新的Cosmos DB数据库。

若要详细了解如何使用Kubernetes更快地构建、交付和缩放基于容器的应用程序,以及如何在Azure上使用Kubernetes大规模部署和管理容器,请查看使用Kubernetes启动和运行

https://www.codeproject.com/Articles/5330685/Modernizing-Python-Apps-and-Data-on-Azure-Part-4-A

你可能感兴趣的:(架构及框架,python,azure,python,kubernetes)