在 AKS 中部署 Azure SQL 并使用 Private Endpoint 测试连通性

发布: (2026年3月8日 GMT+8 15:14)
7 分钟阅读
原文: Dev.to

Source: Dev.to

本教程演示如何:

  • 为 AKS 创建网络
  • 使用 Azure CNI Overlay 部署 AKS 集群
  • 部署 Azure SQL 数据库
  • 使用 私有端点 进行安全防护
  • 使用 私有 DNS 区域 修复 DNS 解析
  • 使用调试 Pod 验证来自 Kubernetes 的连通性

目标: 让 AKS Pod 仅通过私有网络安全地连接到 Azure SQL。

Diagram

1. 定义环境变量

LOCATION=southeastasia

RG_NETWORK=rg-aks-network
RG_OVERLAY=rg-aks-overlay
RG_UNDERLAY=rg-aks-underlay

VNET_NAME=vnet-aks-lab

SUBNET_OVERLAY=subnet-overlay
SUBNET_UNDERLAY=subnet-underlay

AKS_OVERLAY=aks-overlay
AKS_UNDERLAY=aks-underlay

2. 创建资源组

az group create --name $RG_NETWORK   --location $LOCATION
az group create --name $RG_OVERLAY   --location $LOCATION
az group create --name $RG_UNDERLAY  --location $LOCATION

3. 创建虚拟网络

az network vnet create \
  --resource-group $RG_NETWORK \
  --name $VNET_NAME \
  --address-prefix 10.0.0.0/16

4. 创建子网

覆盖子网(AKS 节点)

az network vnet subnet create \
  --resource-group $RG_NETWORK \
  --vnet-name $VNET_NAME \
  --name $SUBNET_OVERLAY \
  --address-prefix 10.0.1.0/24

底层子网

az network vnet subnet create \
  --resource-group $RG_NETWORK \
  --vnet-name $VNET_NAME \
  --name $SUBNET_UNDERLAY \
  --address-prefix 10.0.2.0/24

获取子网 ID

OVERLAY_SUBNET_ID=$(az network vnet subnet show \
  --resource-group $RG_NETWORK \
  --vnet-name $VNET_NAME \
  --name $SUBNET_OVERLAY \
  --query id -o tsv)

UNDERLAY_SUBNET_ID=$(az network vnet subnet show \
  --resource-group $RG_NETWORK \
  --vnet-name $VNET_NAME \
  --name $SUBNET_UNDERLAY \
  --query id -o tsv)

echo $OVERLAY_SUBNET_ID
echo $UNDERLAY_SUBNET_ID

5. 部署 AKS 集群(Azure CNI Overlay)

az aks create \
  --resource-group $RG_OVERLAY \
  --name $AKS_OVERLAY \
  --location $LOCATION \
  --node-count 2 \
  --network-plugin azure \
  --network-plugin-mode overlay \
  --pod-cidr 192.168.0.0/16 \
  --service-cidr 172.16.0.0/16 \
  --dns-service-ip 172.16.0.10 \
  --vnet-subnet-id $OVERLAY_SUBNET_ID \
  --generate-ssh-keys

6. 将 kubectl 连接到集群

az aks get-credentials \
  --resource-group $RG_OVERLAY \
  --name $AKS_OVERLAY

验证集群状态:

kubectl get nodes -o wide
kubectl get pods -o wide

7. 为服务创建子网

服务子网

az network vnet subnet create \
  --resource-group $RG_NETWORK \
  --vnet-name $VNET_NAME \
  --name subnet-service \
  --address-prefix 10.0.3.0/24

私有端点子网

az network vnet subnet create \
  --resource-group $RG_NETWORK \
  --vnet-name $VNET_NAME \
  --name subnet-private-endpoint \
  --address-prefix 10.0.4.0/24

8. 创建 Azure SQL 服务器

生成唯一的服务器名称:

SQL_SERVER=aks-lab-sql-$RANDOM

创建服务器:

az sql server create \
  --name $SQL_SERVER \
  --resource-group $RG_NETWORK \
  --location $LOCATION \
  --admin-user sqladmin \
  --admin-password 'StrongPass123!'

确保已注册提供程序:

az provider register --namespace Microsoft.Sql
az provider show --namespace Microsoft.Sql --query "registrationState"

9. 创建 SQL 数据库

az sql db create \
  --resource-group $RG_NETWORK \
  --server $SQL_SERVER \
  --name demo-db \
  --service-objective Basic

获取 SQL 服务器资源 ID:

SQL_ID=$(az sql server show \
  --name $SQL_SERVER \
  --resource-group $RG_NETWORK \
  --query id -o tsv)

echo $SQL_ID

10. 为 Azure SQL 创建私有端点

az network private-endpoint create \
  --name sql-private-endpoint \
  --resource-group $RG_NETWORK \
  --vnet-name $VNET_NAME \
  --subnet subnet-private-endpoint \
  --private-connection-resource-id $SQL_ID \
  --group-id sqlServer \
  --connection-name sqlConnection

11. 验证私有端点 IP

NIC_ID=$(az network private-endpoint show \
  --name sql-private-endpoint \
  --resource-group $RG_NETWORK \
  --query "networkInterfaces[0].id" \
  -o tsv)

echo $NIC_ID

获取私有 IP 地址:

az network nic show \
  --ids $NIC_ID \
  --query "ipConfigurations[0].privateIpAddress" \
  -o tsv

12. 创建私有 DNS 区域(可选但推荐)

az network private-dns zone create \
  --resource-group $RG_NETWORK \
  --name "privatelink.database.windows.net"

将 DNS 区域链接到虚拟网络:

az network private-dns link vnet create \
  --resource-group $RG_NETWORK \
  --zone-name "privatelink.database.windows.net" \
  --name sql-dns-link \
  --virtual-network $VNET_NAME \
  --registration-enabled false

创建指向私有端点 IP 的 A 记录:

PRIVATE_IP=$(az network private-endpoint show \
  --name sql-private-endpoint \
  --resource-group $RG_NETWORK \
  --query "customDnsConfigs[0].ipAddresses[0]" \
  -o tsv)

az network private-dns record-set a add-record \
  --resource-group $RG_NETWORK \
  --zone-name "privatelink.database.windows.net" \
  --record-set-name $SQL_SERVER \
  --ipv4-address $PRIVATE_IP

13. 从 AKS 测试连通性

部署一个调试 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: sql-test
spec:
  containers:
  - name: curl
    image: mcr.microsoft.com/azure-cli
    command: ["sleep"]
    args: ["infinity"]

应用清单:

kubectl apply -f sql-test.yaml

进入 Pod:

kubectl exec -it sql-test -- /bin/bash

在 Pod 内部,测试连接:

# 安装 sqlcmd(可选)
apt-get update && apt-get install -y mssql-tools unixodbc-dev

# 使用私有 DNS 名称进行连接
/opt/mssql-tools/bin/sqlcmd -S $SQL_SERVER.privatelink.database.windows.net,1433 \
  -U sqladmin -P 'StrongPass123!' -Q "SELECT TOP (1) name FROM sys.databases;"

如果查询返回结果,则私有网络已正常工作。

14. Clean‑up (Optional)

az group delete --name $RG_NETWORK   --yes --no-wait
az group delete --name $RG_OVERLAY   --yes --no-wait
az group delete --name $RG_UNDERLAY  --yes --no-wait

恭喜! 您已成功设置一个 AKS 集群,通过私有端点和 Azure CNI Overlay 网络安全地连接到 Azure SQL 数据库。

检索私有 IP

az network nic show \
  --ids $NIC_ID \
  --query "ipConfigurations[0].privateIPAddress" \
  -o tsv

示例输出

10.0.4.4

12. 从 AKS Pod 测试网络

使用 nicolaka/netshoot 镜像启动一个调试 pod:

kubectl run net-test \
  --image=nicolaka/netshoot \
  -it --rm -- bash

在 pod 内部可以测试 DNS 和网络。

13. 测试 SQL 客户端 Pod

运行一个 SQL 客户端容器:

kubectl run sql-client \
  --image=mcr.microsoft.com/mssql-tools \
  -it --rm -- bash

14. 创建私有 DNS 区域

Azure SQL 私有终结点需要 DNS 映射。

创建私有 DNS 区域:

az network private-dns zone create \
  --resource-group $RG_NETWORK \
  --name privatelink.database.windows.net

将 DNS 区域链接到虚拟网络:

az network private-dns link vnet create \
  --resource-group $RG_NETWORK \
  --zone-name privatelink.database.windows.net \
  --name sql-dns-link \
  --virtual-network $VNET_NAME \
  --registration-enabled false

将私有终结点附加到 DNS 区域:

az network private-endpoint dns-zone-group create \
  --resource-group $RG_NETWORK \
  --endpoint-name sql-private-endpoint \
  --name sql-zone-group \
  --private-dns-zone privatelink.database.windows.net \
  --zone-name sql

15. 验证 AKS 的 DNS 解析

运行另一个调试 pod:

kubectl run net-test \
  --image=nicolaka/netshoot \
  -it --rm -- bash

测试 DNS 解析:

nslookup .database.windows.net

预期结果

10.0.4.4

16. 连接到 Azure SQL

运行 SQL 客户端 pod:

kubectl run sql-client \
  --image=mcr.microsoft.com/mssql-tools \
  -it --rm -- bash

使用 sqlcmd 进行连接:

sqlcmd \
  -S aks-lab-sql-31445.database.windows.net \
  -U sqladmin \
  -P 'StrongPass123!' \
  -d demo-db

如果成功,你会看到:

1>

你现在已经连接到 SQL 服务器。

示例查询

SELECT @@VERSION;
GO

Final Architecture

AKS Pod

   │ DNS Query

Private DNS Zone
(privatelink.database.windows.net)


Private Endpoint (10.0.4.4)


Azure SQL Database

✅ 您现在已经实现 从 AKS Pod 私有访问 Azure SQL

0 浏览
Back to Blog

相关文章

阅读更多 »