目录
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)更适合。
AKS比Azure应用服务更复杂。尽管如此,当组织将其应用程序迁移到云并希望在统一的容器运行时环境中运行其所有旧版和现代应用时,这是一个不错的选择。
在由六部分组成的现代化Azure上的Python应用和数据系列的第四篇文章中,我们将演示如何使用Visual Studio Code容器化旧版Python应用、创建AKS群集以及将应用部署到AKS。要查看前三篇文章,请查看:
按照本教程中的步骤运行应用程序。或者,下载并打开此GitHub 存储库文件夹以获取最终项目。你应该知道Python和Django。
我们的Azure Kubernetes Service (AKS)实现包括以下参与者:
Azure应用服务允许我们使用自己喜欢的语言托管Web应用、移动后端和REST API。它使应用能够在Windows和Linux上运行,提供自动缩放和高可用性,并启用自动部署。也就是说,您可能想知道为什么我们要转向基于容器的方法。
组织通常选择这种模式,因为容器提供了许多可能性。它们是隔离的可移植环境,开发人员可以在其中使用必要的库和链接打包应用程序。结果是更高的工作效率和简化的部署。
集装箱已经存在了很长时间,但需要一段时间才能获得牵引力。Docker以其广泛的支持和易于学习的方式普及了容器,并在短时间内成为行业标准。
要让Docker在您的机器上运行,请安装Docker Engine(可在Linux发行版、macOS和Windows上通过Docker Desktop 使用)和静态二进制安装。
让我们安装Docker for Visual Studio Code。使用Docker扩展从VS Code轻松构建、管理和部署容器化应用程序。它还方便地提供了许多命令来管理VS Code中的容器。
然后安装Kubernetes for Visual Studio Code。此扩展允许开发人员构建要在Kubernetes集群中运行的应用程序,并帮助DevOps员工对Kubernetes应用程序进行故障排除。
现在,让我们通过打开命令面板(Ctrl + Shift+P)然后选择Docker:将Docker文件添加到工作区命令来将Docker文件添加到工作区。
此命令生成Dockerfile和 .dockerignore文件,并将它们添加到工作区。VS Code还会询问您是否要添加Docker Compose文件,这是可选的。
该扩展可以为流行的开发语言(包括Python)搭建Docker文件的脚手架。从列表中选择Python: Django以相应地自定义生成的Docker文件。
然后选择“manage.py”作为应用的入口点。
并添加8000作为应用将侦听的端口。
然后选择“是”以包含可选的Docker撰写文件。
当我们创建这些文件时,我们还制作了必要的工件来为Python提供调试支持。
传统的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应用程序的容器化镜像。
然后将图像标记为“conduit:v1”。
若要在Azure上托管基于Kubernetes的应用程序,需要为虚拟机(VM)、存储帐户、虚拟网络、Web应用、数据库和数据库服务器创建资源。在Azure上托管多个应用程序时,管理越来越多的资源可能会变得不堪重负。使用资源组会有所帮助。Azure资源组是持有Azure解决方案相关资源的实体。
使用Microsoft Azure门户,让我们创建一个资源组,如conduit-rg。首先,单击创建资源并搜索“resource group”:
接下来,单击创建。
然后,将其命名为“conduit-rg”并单击“查看 + 创建”。
转到Azure门户主页,单击加号以创建新的AKS群集。然后,搜索“Kubernetes Service”:
然后单击“创建”。
接下来定义Azure订阅。Azure订阅授予你对Azure服务的访问权限。Azure还根据订阅提供资源使用情况报告和计费服务。
指定资源组。此资源集合共享相同的生命周期、权限和策略。
此外,选择群集预设配置。由于这是一个演示,我们的目标是成本最低:开发/测试($)预设。
以下屏幕截图中的示例创建了一个具有一个节点的名为“conduit-cluster”的群集。此创建将需要几分钟才能完成。
无论容器部署类型如何,都可以使用Azure容器注册表在专用注册表中生成、存储和管理容器映像和项目。稍后,此容器注册表将存储我们在本地生成的相同映像。
选择资源组“conduit-rg”并命名注册表”conduitacr”。此外,选择“基本”SKU,然后单击“查看 + 创建”。
让我们使用一个带有Azure CLI和kubectl的命令行,准备AKS发布我们的应用程序。
如果使用的是本地安装,请使用az login命令使用Azure CLI登录。按照终端显示的步骤完成身份验证。
> az login
此命令将在打开您的Web浏览器Sign in to your account并提示您登录。登录后,您的本地安装将记住您的帐户。
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
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源:
打开“工作负载”选项卡并找到管道部署:
然后单击YAML选项卡以编辑配置。查找AKS_HOST环境设置:
然后,将AKS_HOST环境变量的值更改为先前运行的kubectl get service命令的外部IP:
最后,保存对YAML配置的更改并转到http://<
在本文中,我们通过将Python应用移动到Azure Kubernetes Service(AKS)来进一步实现其现代化。我们使用Docker和Visual Studio Code从我们自本系列开始以来一直在使用的Conduit Django应用程序生成容器映像。
然后,我们创建了与AKS相关的Azure资源,包括资源组、部署、服务、容器注册表和Kubernetes群集。接下来,我们将本地容器化应用映像推送到容器注册表,并启动AKS服务以联机测试容器化应用。
将Conduit应用迁移到Azure Kubernetes服务可为组织提供许多好处,包括简化基于微服务的体系结构的部署和管理、简化水平缩放以及启用自我修复、负载均衡和机密管理。
尽管我们之前将数据转移到用于PostgreSQL的云托管Azure数据库中,但我们可以进一步进行数据现代化。继续阅读本系列的第5部分,使用Djongo Mapper和Cosmos DB的MongoDB API将数据和应用迁移到新的Cosmos DB数据库。
若要详细了解如何使用Kubernetes更快地构建、交付和缩放基于容器的应用程序,以及如何在Azure上使用Kubernetes大规模部署和管理容器,请查看使用Kubernetes启动和运行。
https://www.codeproject.com/Articles/5330685/Modernizing-Python-Apps-and-Data-on-Azure-Part-4-A