在本教程中,你将在 Azure Kubernetes 服务(AKS)上托管清单应用程序,并了解如何使用活动异地复制跨 Azure 区域复制 Azure 托管 Redis 实例中的数据。
先决条件
- 一份 Azure 订阅。 如果没有 Azure 订阅,请创建一个试用帐户。
- Azure Kubernetes 服务群集 - 有关创建群集的详细信息,请参阅快速入门:使用 Azure 门户部署 Azure Kubernetes 服务 (AKS) 群集。 或者,可以在两个不同的 AKS 群集上托管两个演示应用程序的实例。 在生产环境中,你将使用与群集位于同一区域中的两个不同的群集来部署应用程序的两个版本。 在本教程中,你要将两个应用程序实例部署在同一 AKS 群集上。
重要
本教程假定你熟悉基本的 Kubernetes 概念,如容器、Pod 和服务等。
概述
本教程使用了一个示例库存页面,其中显示了三种不同的 T 恤选项。 用户可以“购买”每件 T 恤,并看到库存下降。 此演示的独特之处在于,我们会在两个不同的区域运行库存应用。 通常,必须在单个区域中运行存储库存数据的数据库,以免出现一致性问题。 如果使用其他数据库后端和同步,由于不同 Azure 区域中调用的延迟较高,客户可能会获得不愉快的体验。
设置两个 Azure Redis 实例
使用 Azure 门户或首选 CLI 工具在中国 北部 2 区域中创建新的 Azure 托管 Redis 实例。 或者,可以任选其他的区域。 使用快速入门指南来开始使用。
在“高级”选项卡上:
- 启用“仅限非 TLS 访问”。
- 将“群集策略”设置为“Enterprise”
- 使用本指南配置新的活动异地复制组。 最后,将这两个缓存添加到同一个复制组。 使用第一个缓存创建组名称,并将第二个缓存添加到同一组。
重要
本教程使用非 TLS 端口进行演示,但我们强烈建议对生产中的任何内容使用 TLS 端口。
在中国 北部 区域设置另一个 Azure Redis 缓存,其配置与第一个缓存相同。 或者,可以任选其他的区域。 确保你选择了与第一个缓存相同的复制组。
准备 Kubernetes 部署文件
按照以下过程创建两个 .yml 文件。 在两个区域中创建的每个缓存对应一个文件。
为了演示跨区域的数据复制,我们在不同区域中运行同一应用程序的两个实例。 让一个实例在西雅图西部命名空间中运行,而第二个实例在纽约东部命名空间运行。
西部命名空间
更新以下 YAML 文件中的以下字段,并将其保存为 app_west.yaml。
- 删除端口后缀 10000 后,使用
REDIS_HOST
URL 更新变量 - 用
REDIS_PASSWORD
来更新,此密钥属于您的中国北部 2缓存。 - 更新
APP_LOCATION
以显示运行此应用程序实例的区域。 对于此缓存,将APP_LOCATION
配置为“Seattle
”以指示此应用程序实例正在西雅图运行。 - 验证文件中变量
namespace
的值是否在两个位置都为west
。
它应如以下代码所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: shoppingcart-app
namespace: west
spec:
replicas: 1
selector:
matchLabels:
app: shoppingcart
template:
metadata:
labels:
app: shoppingcart
spec:
containers:
- name: demoapp
image: mcr.microsoft.com/azure-redis-cache/redisactivereplicationdemo:latest
resources:
limits:
cpu: "0.5"
memory: "250Mi"
requests:
cpu: "0.5"
memory: "128Mi"
env:
- name: REDIS_HOST
value: "DemoWest.chinanorth2.redisenterprise.cache.chinacloudapi.cn"
- name: REDIS_PASSWORD
value: "myaccesskey"
- name: REDIS_PORT
value: "10000" # redis enterprise port
- name: HTTP_PORT
value: "8080"
- name: APP_LOCATION
value: "Seattle, WA"
---
apiVersion: v1
kind: Service
metadata:
name: shoppingcart-svc
namespace: west
spec:
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 8080
selector:
app: shoppingcart
东部命名空间
将同一 YAML 文件的另一个副本保存为 app_east.yaml。 这次使用与第二个缓存对应的值。
- 删除端口后缀 10000 后,使用
REDIS_HOST
更新变量 - 使用
REDIS_PASSWORD
缓存的访问密钥进行更新。 - 更新
APP_LOCATION
以显示运行此应用程序实例的区域。 对于此缓存,将APP_LOCATION
配置为“纽约”以指示此应用程序实例正在纽约运行。 - 验证文件中变量
namespace
的值是否在两个位置都为east
。
它应如以下代码所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: shoppingcart-app
namespace: east
spec:
replicas: 1
selector:
matchLabels:
app: shoppingcart
template:
metadata:
labels:
app: shoppingcart
spec:
containers:
- name: demoapp
image: mcr.microsoft.com/azure-redis-cache/redisactivereplicationdemo:latest
resources:
limits:
cpu: "0.5"
memory: "250Mi"
requests:
cpu: "0.5"
memory: "128Mi"
env:
- name: REDIS_HOST
value: "DemoEast.chinanorth.redisenterprise.cache.chinacloudapi.cn"
- name: REDIS_PASSWORD
value: "myaccesskey"
- name: REDIS_PORT
value: "10000" # redis enterprise port
- name: HTTP_PORT
value: "8080"
- name: APP_LOCATION
value: "New York, NY"
---
apiVersion: v1
kind: Service
metadata:
name: shoppingcart-svc
namespace: east
spec:
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 8080
selector:
app: shoppingcart
安装 Kubernetes CLI 并连接到 AKS 群集
在本部分中,首先安装 Kubernetes CLI,然后连接到 AKS 群集。
注释
本教程需要 Azure Kubernetes 服务群集。 将两个应用程序实例部署在同一 AKS 群集上。
安装 Kubernetes CLI
使用 Kubernetes CLI _kubectl 从本地计算机连接到 Kubernetes 群集。 如果在本地运行,则可以使用以下命令安装 kubectl。
az aks install-cli
连接到两个区域中的 AKS 群集
使用门户复制中国北部 2 区域中 AKS 群集的资源组和群集名称。 若要配置 kubectl 以连接到 AKS 群集,请将以下命令用于资源组和群集名称:
az aks get-credentials --resource-group myResourceGroup --name myClusterName
运行以下命令,验证是否能够连接到群集:
kubectl get nodes
应会看到类似的输出,其中显示了群集节点的列表。
NAME STATUS ROLES AGE VERSION
aks-agentpool-21274953-vmss000001 Ready agent 1d v1.24.15
aks-agentpool-21274953-vmss000003 Ready agent 1d v1.24.15
aks-agentpool-21274953-vmss000006 Ready agent 1d v1.24.15
部署和测试应用程序
你需要两个命名空间,才能让应用程序在 AKS 群集上运行。 创建一个西部命名空间,然后部署应用程序。
运行以下命令,将应用程序实例部署到西部命名空间中的 AKS 群集:
kubectl create namespace west
kubectl apply -f app_west.yaml
你会收到一个响应,指示已创建部署和服务:
deployment.apps/shoppingcart-app created
service/shoppingcart-svc created
若要测试应用程序,请运行以下命令以检查 pod 是否正在运行:
kubectl get pods -n west
你会看到 Pod 成功运行,如下所示:
NAME READY STATUS RESTARTS AGE
shoppingcart-app-5fffdcb5cd-48bl5 1/1 Running 0 68s
运行以下命令以获取应用程序的终结点:
kubectl get service -n west
你可能会在几分钟内看到 EXTERNAL-IP 的状态 <pending>
。 继续重试,直到该地址由 IP 地址替换。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
shoppingcart-svc LoadBalancer 10.0.166.147 20.69.136.105 80:30390/TCP 90s
外部 IP 可用后,打开 Web 浏览器,转到服务的外部 IP 地址,你会看到应用程序。
运行相同的部署步骤,并部署演示应用程序的实例,以在中国北部区域运行。
kubectl create namespace east
kubectl apply -f app_east.yml
kubectl get pods -n east
kubectl get service -n east
在浏览器中打开这两个服务后,你会看到一个区域中的库存更改几乎会立即反映在另一个区域中。 库存数据存储在跨区域复制数据的 Redis Enterprise 实例中。
你成功了! 单击按钮并浏览演示。
要重置计数,请在 URL 后面添加 /reset
:
<IP address>/reset
清理部署
若要清理群集,请运行以下命令:
kubectl delete deployment shoppingcart-app -n west
kubectl delete service shoppingcart-svc -n west
kubectl delete deployment shoppingcart-app -n east
kubectl delete service shoppingcart-svc -n east
清理资源
要继续使用在本文中创建的资源,请保留资源组。
否则,如果您已不再需要使用这些资源,可以删除您创建的 Azure 资源组以避免产生费用。
重要
删除资源组的操作不可逆。 删除资源组时,包含在其中的所有资源会被永久删除。 请确保不会意外删除错误的资源组或资源。 如果在现有资源组(其中包含要保留的资源)内创建了此资源,可以逐个删除这些资源,而不是删除资源组。
删除资源组的步骤
登录到 Azure 门户,然后选择“资源组”。
选择要删除的资源组。
如果有多个资源组,请使用“筛选任何字段...”框,键入为本文创建的资源组的名称。 在结果列表中选择资源组。
选择“删除资源组”。
系统会要求确认是否删除资源组。 键入资源组的名称进行确认,然后选择“删除”。
片刻之后,将会删除该资源组及其所有资源。