Azure SQL을 Private Endpoint와 함께 배포하고 AKS에서 연결 테스트
Source: Dev.to
이 튜토리얼은 다음을 시연합니다:
- AKS용 네트워킹 생성
- Azure CNI Overlay를 사용한 AKS 클러스터 배포
- Azure SQL Database 배포
- Private Endpoint를 사용한 보안 설정
- Private DNS Zone을 사용한 DNS 해석 수정
- 디버깅 파드를 이용한 Kubernetes에서 연결 확인
목표: AKS 파드가 프라이빗 네트워킹만을 통해 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 영역을 VNet에 연결합니다:
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에서 연결 테스트
디버깅 파드를 배포합니다:
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
파드에 들어갑니다:
kubectl exec -it sql-test -- /bin/bash
파드 내부에서 연결을 테스트합니다:
# 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
축하합니다! 프라이빗 엔드포인트와 Azure CNI Overlay 네트워킹을 사용하여 Azure SQL Database에 안전하게 연결되는 AKS 클러스터를 성공적으로 설정했습니다.
개인 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 클라이언트 포드 테스트
SQL 클라이언트 컨테이너를 실행합니다:
kubectl run sql-client \
--image=mcr.microsoft.com/mssql-tools \
-it --rm -- bash
14. Create Private DNS Zone
Azure SQL private endpoints require DNS mapping.
프라이빗 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 확인
다른 디버그 포드를 실행합니다:
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
최종 아키텍처
AKS Pod
│
│ DNS Query
▼
Private DNS Zone
(privatelink.database.windows.net)
│
▼
Private Endpoint (10.0.4.4)
│
▼
Azure SQL Database
✅ 이제 AKS 포드에서 Azure SQL에 프라이빗하게 액세스할 수 있습니다.
