在 AKS 中部署 Azure SQL 并使用 Private Endpoint 测试连通性
Source: Dev.to
本教程演示如何:
- 为 AKS 创建网络
- 使用 Azure CNI Overlay 部署 AKS 集群
- 部署 Azure SQL 数据库
- 使用 私有端点 进行安全防护
- 使用 私有 DNS 区域 修复 DNS 解析
- 使用调试 Pod 验证来自 Kubernetes 的连通性
目标: 让 AKS Pod 仅通过私有网络安全地连接到 Azure SQL。
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。
