Azure SQL을 Private Endpoint와 함께 배포하고 AKS에서 연결 테스트

발행: (2026년 3월 8일 PM 04:14 GMT+9)
8 분 소요
원문: Dev.to

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에 프라이빗하게 액세스할 수 있습니다.

0 조회
Back to Blog

관련 글

더 보기 »