안녕하세요. 오늘은 Azure에서 제공하는 서비스 중 하나인, DNS private resolver란 무엇인지, 그리고 또 어떻게 사용하는지에 대해서 설명해보려고 합니다.

 

* 본 내용은 Azure의 기본적인 리소스 구성을 알고 있음을 가정하여 작성하였습니다.

 

1. What is DNS?

신규 서비스인 DNS private Resolver를 설명하기에 앞서 DNS란 무엇일까요?

 

도메인 네임 시스템(Domain Name System, DNS)은 호스트의 도메인 이름을 호스트의 네트워크 주소로 바꾸거나 그 반대의 변환을 수행할 수 있도록 하기 위해 개발되었다고 하네요.

 

결국 서비스를 위한 호스트의 네트워크 주소를 우리가 흔히 URL에서 볼 수 있는, 도메인 주소로 바꾸어 주는 역할을 합니다. 예시로 네이버 홈페이지의 URL 주소를 통해 IP를 확인해 볼 수 있어요.

nslookup을 진행하여 확인한 www.naver.com의 서비스 IP

 

이러한 DNS는 외부적으로도 사용하지만, 내부적으로 사용하는 DNS들도 있어요.

아무래도 IP로만 통신을 하다보면, 해당 IP로는 직접적인 서버의 용도라던지, 서비스 이름을 예측하기 힘든 경우가 많아요.. 그래서 private DNS를 구성하는 경우가 많죠! 기업마다 DNS Server는 대부분 구성이 되어 있습니다. 

 

기업의 규모가 큰 회사는 CLOUD를 사용하게 되면, 대부분 Hybrid Cloud(Onpremise와 Cloud 서비스를 모두 사용하며 연동하여 사용하는 클라우드 개념)를 구성하게 되는 경우가 많아요.

Hybrid Cloud를 구성하기 위해 VPN Gateway로 network 연동을 한 예시

 



Cloud서비스와 Onpremise 서비스간 연동은 데이터를 주고 받을 수 있는 네트워크의 연동이 핵심이죠. Express Route나 VPN과 같은 서비스를 생성하여 연동하게 됩니다. 이 때 Azure에서 특정 Paas 서비스를 사용하게 되고 외부의 노출을 막고 내부 통신만 가능하도록 Private Link를 PaaS서비스에 연동하여 서비스만의 고유의 Private IP와 Pirvate DNS를 할당받게됩니다.

 

물론 "IP"로의 통신이 가능해요. 하지만, 대부분의 기업에서는 DNS를 활용하여 쿼리문을 작성하는 것이 익숙하겠죠?

 

여기서 Azure와 On Premise간 이름 풀이를 위한 DNS Forwarder가 있습니다.

 

DNS 질의 워크플로우

 

해당 그림은 On Premise에서 Azure에 있는 SQL Database에 DNS 질의를 날렸을 때, 발생하는 워크플로우입니다.

 

On Premise의 Client VM에서 DNS 질의를 할 때 바라보는 대상은 Interal DNS 서버에요.

 

해당 Internal DNS는 조건부 전달에 등록되어 있는 database.windows.net을 Azure VM에 구성한 DNS Forwarder로 전달하죠. 해당 전달을 받은 Azure VM은 Azure DNS Nameserver로 이름 풀이를 하게 되고, 그 값을 받아 다시 Internal DNS 서버로 전달, Client VM이 SQL DB와 통신할 수 있게 되죠. 자세한 설명은 다음 링크를 참고하시면 됩니다. 

https://learn.microsoft.com/en-us/azure/architecture/example-scenario/networking/azure-dns-private-resolver

해당 설정을 위해서는 Virtual Machine을 생성하고, DNS Forwarder 구성을 직접 해주어야 했어요. 바로 IaaS의 영역인 거죠. 특정 기능을 구현하기 위해서는 서버 담당자, DNS 담당자의 역할이 필요했어요. 

 

결국 Azure에서는 DNS Forwarder를 대체 시킬 수 있는 PaaS 서비스를 제공하기 시작했습니다.

본론으로 들어가 볼까요?

2. What is DNS private Resolver Service?

DNS private resolver란, VM 기반 DNS 서버(앞서 설명한 DNS Forwarder)를 배포하지 않고 온-프레미스 환경에서 Azure DNS 프라이빗 영역을 쿼리하거나 그 반대로 쿼리할 수 있는 새로운 서비스입니다.

Hybrid Cloud를 위해 거의 필수적으로 필요한 서비스로, 직접 구성을 하다보니, Azure에서는 그 니즈를 캐치해서 PaaS서비스로 만들어 제공하고 있다고 보이네요.

 

GA는 2022년 10월 경 되었구요!

https://azure.microsoft.com/en-us/blog/announcing-azure-dns-private-resolver-general-availability/

 

Announcing Azure DNS Private Resolver general availability

We are excited to share that Azure DNS Private Resolver is now in general availability. We offer two types of Azure DNS Zones—private and public—for hosting your private DNS and public DNS records.

azure.microsoft.com

다음 아키텍처를 통해 새로운 PaaS인 DNS Private Resolver의 역할을 볼까요? 

DNS Private Resolver를 구성시 생성되는 Inbound Endpoint VIP가 DNS Forwarder VM에서의 VM의 IP의 역할을 해요. On-Premise에서는 특정 DNS들을 검색시, 해당 VIP로 DNS forward를 진행하게 되고 해당 VM에서는 Azure의 DNS Zone으로 Lookup하여 얻은 값을 전달해주게 되죠.

 




3. DNS private resolver POC 

해당 서비스를 테스트 해보기 위해 azure용 vnet, on premise용 vnet을 구성, 서로 peering을 맺었어요.

(On Premise처럼 동일한 구성을 위해 ER 구축을 하고싶으나,,, 현실적으로 불가능 하므로 peering = er 통신으로 가정하고 테스트 했어요 ㅎㅎ)

 

테스트는 private endpoint가 달린 storage account에 대해서, private dns로 nslookup이 가능한지, 테스트 해보았어요. 해당 테스트는 DNS Private Resolver의 Inbound Endpoint를 사용하는 테스트입니다.

 

전제 조건 : Spoke 내에 존재하는 VM NIC의 DNS Server를 1,2번은 DNS Forwarder로, 3번은 DNS Private Resolver의 Inbound Endpoint VIP로 각각 테스트 진행해 보았어요.

 

1. DNS Forwarder로 구성한 VM을 DNS Server로 지정, DNS Server 서비스를 START 한 뒤  테스트(성공)

 

DNS Forwarder로 구성한 VM은 DNS 질의가 오는 것에 대해 Azure Provided DNS인 168.63.129.16으로 전달하게 되고, 다음과 같이 Blob의 Private DNS를 얻을 수 있음을 확인할 수 있어요.

2. DNS Server를 기본 설정 그대로 두고 테스트(실패)

이번에는 DNS Server 설정을 VNET의 default 그대로 두고 테스트를 해 보았어요. vnet 두개가 peering이 되어 있지만 blob의 private dns zone에 nslookup 명령을 하는 VM이 존재하는 Vnet은 LINK가 되어 있지 않아요. 따라서 Private DNS를 lookup하지 못하고 Storage Account의 public 주소로 검색이 되게 되죠.

 

3. DNS Private Resolver로 DNS Server를 지정하여 테스트(성공)

1번과 똑같은 상황에서, DNS Server를 DNS Private Resolver의 Inbound Endpoint VIP로 넣었어요. DNS Private Resolver는 Azure Provided DNS에 질의하여 Private Blob을 조회가능하게 한 것이죠.

 

4. How much DNS private resolver Price? 

비용은 어느정도 나올지 측정해 보았습니다. DNS Forwarder 역할을 수행하는 Inbound Endpoint는 20만원의 가격이 소요됨을 확인할 수 있어요.

5. Conclusion

On-Premise와 통신하는 Cloud 환경을 만들면서, DNS Forwarder 구성은 DNS 검색을 위해서는 필수 불가결한 사항이였어요. 그러한 상황을 Azure는 인지하고, DNS Private Resolver 서비스를 출시함으로서 고객들의 니즈를 잘 파악하고 해당 서비스를 출시한 것으로 보여지네요. 

신규 서비스 DNS Private Resolver 소개는 여기까지 입니다. 다음 서비스 소개에서 만나요~!





Powershell 기반으로, 키고 끔을 통해 비용을 절감시킬 수 있다.

 

1. Application Gateway

$AppGw = Get-AzApplicationGateway -Name Test -ResourceGroupName Appgwtest
Stop-AzApplicationGateway -ApplicationGateway $AppGw

2. Azure Firewall

STOP

# Stop an existing firewall

$azfw = Get-AzFirewall -Name "FW Name" -ResourceGroupName "RG Name"
$azfw.Deallocate()
Set-AzFirewall -AzureFirewall $azfw

START

 

- forced tunneling 설정이 안되어 있을때

# Start the firewall

$azfw = Get-AzFirewall -Name "FW Name" -ResourceGroupName "RG Name"
$vnet = Get-AzVirtualNetwork -ResourceGroupName "RG Name" -Name "VNet Name"
$publicip1 = Get-AzPublicIpAddress -Name "Public IP1 Name" -ResourceGroupName "RG Name"
$publicip2 = Get-AzPublicIpAddress -Name "Public IP2 Name" -ResourceGroupName "RG Name"
$azfw.Allocate($vnet,@($publicip1,$publicip2))

Set-AzFirewall -AzureFirewall $azfw

- forced tunneling 설정이 되어있을 때

# Start the firewall

$azfw = Get-AzFirewall -Name "FW Name" -ResourceGroupName "RG Name"
$vnet = Get-AzVirtualNetwork -ResourceGroupName "RG Name" -Name "VNet Name"
$pip= Get-AzPublicIpAddress -ResourceGroupName "RG Name" -Name "azfwpublicip"
$mgmtPip2 = Get-AzPublicIpAddress -ResourceGroupName "RG Name" -Name "mgmtpip"
$azfw.Allocate($vnet, $pip, $mgmtPip2)
$azfw | Set-AzFirewall

 

- secured virtual hub architecture 일 때

# Start the firewall

$virtualhub = get-azvirtualhub -ResourceGroupName "RG name of vHUB" -name "vHUB name"
$azfw = Get-AzFirewall -Name "FW Name" -ResourceGroupName "Azfw RG Name"
$azfw.Allocate($virtualhub.Id)
$azfw | Set-AzFirewall

'Azure > Azure CLI' 카테고리의 다른 글

[Azure CLI] 1. az vm 대량 생성하는 법  (0) 2022.12.02

bash + Azure CLI 조합

 

csv와 bash의 while문을 활용하여, 여러대의 vm을 배포하는 스크립트이다.

 

 

 

* Azure Compute Gallery의 이미지를 사용한다고 가정

* Vnet은 배포되어있다고 가정

 

vm_ResourceGroup vm_type vm_name vm_subnet vm_sku
test-rg VirtualMachine test-01 test-subnet Standard_B1S
test-rg VirtualMachine test-02 test-subnet Standard_B1S
test-rg VirtualMachine test-03 test-subnet Standard_B1S
test-rg VirtualMachine test-04 test-subnet Standard_B1S
test-rg VirtualMachine test-05 test-subnet Standard_B1S
test-rg VirtualMachine test-06 test-subnet Standard_B1S
test-rg VirtualMachine test-07 test-subnet Standard_B1S
test-rg VirtualMachine test-08 test-subnet Standard_B1S
test-rg VirtualMachine test-09 test-subnet Standard_B1S
#!/bin/bash

subscription = 'koo-prod'
subnet_prefix = '/subscriptions/54e0cba4-d24d-4eb3-86d9-ea8cf67e4693/resourceGroups/prd-seas-gasp-common-rg/providers/Microsoft.Network/virtualNetworks/prd-seas-gasp-vnet/subnets/'

declare -i count
count=1
filename="vm.csv"
{ 
read
while IFS=, read -r vm_ResourceGroup vm_name vm_subnet vm_sku vm_image null;
do

    echo "I got:$vm_ResourceGroup | $vm_name | $vm_subnet | $vm_sku | $vm_image"

    az account set -s $subscription

    ###네트워크 인터페이스의 파라미터 값으로 해당 값을 넣어 nic 생성
    accnet=$(az vm list-skus --location koreacentral --all true --resource-type virtualMachines --size ${vm_sku} --query '[].{acceleratedNetworkingEnabled: capabilities[?name==`AcceleratedNetworkingEnabled`].value | [0]}' -o tsv)
    accnet="$(tr [A-Z] [a-z] <<< "$accnet")"


    #동적 IP 할당
    az network nic create --name ${vm_name}"-VMNic" \
                          --resource-group $vm_ResourceGroup \
                          --subnet ${subnet_prefix}"VM-subnet"
                          #--accelerated-networking ${accnet}
                          #--output none
    


    if [ "$accnet" == "true" ];
    then
    echo "${vm_sku}임으로, nic의 가속화된 네트워킹이 enabled 되었습니다"
    else
    echo "${vm_sku}이므로, nic의 가속화된 네트워킹이 disabled 입니다."
    fi

    privateip=`az network nic ip-config list --resource-group $vm_ResourceGroup --nic-name ${vm_name}"-VMNic" | grep "privateIpAddress" | grep -v Version | cut -d '"' -f 4`
    echo "$privateip 로 nic가 생성되었습니다."
    #필요한 IP만 뽑기위해 grep, cut	

    ###3번 static IP로 설정             
    #정적 IP 설정
    az network nic ip-config update \
                            --name ipconfig1 \
                            --resource-group $vm_ResourceGroup \
                            --nic-name ${vm_name}"-VMNic" \
                            --private-ip-address ${privateip}
	
    echo "$privateip 가 static으로 변경되었습니다."

    az vm create --name $vm_name \
                 --resource-group $vm_ResourceGroup \
                 --image /subscriptions/54e0cba4-d24d-4eb3-86d9-ea8cf67e4693/resourceGroups/test-rg/providers/Microsoft.Compute/galleries/gallerykoo/images/web-test/versions/0.1.3 \
                 --generate-ssh-keys \
                 --nics ${vm_name}"-VMNic" \
                 --os-disk-name ${vm_name}"-OSdisk" \
                 --size $vm_sku \
                 --zone 1 \
                 --no-wait

    echo " $count VMs created, this time $vm_name is deployed, ip is $privateip"
    count+=1
done
} < $filename

'Azure > Azure CLI' 카테고리의 다른 글

[Azure CLI] 2.사용하지 않는 리소스 중단  (1) 2022.12.02

안녕하세요 본아입니다.

오늘은 Cloud라는게 무엇인지, 무엇이 Cloud를 핫한 토픽으로 만들었는지 알아보도록 하겠습니다.

 

1.클라우드란?

클라우드란 다시 말해 클라우드 컴퓨팅을 말합니다. 인터넷에서 선불제 방식으로 제공되거나, 호스팅 되는 작업과 서비스를 일컫습니다.

 

과거에는 개인의 컴퓨터의 하드디스크에 데이터를 저장하여 관리하였습니다. 기업들도 마찬가지입니다. 우리가 현재 부르고 있는 온프레미스(on premise) 서버들을 각 기업들은 구축하고, 서버 관리자들을 두고 서버를 관리하였습니다. 계속 잘 사용해 나가다가, CSP, 우리가 흔히 말하는 Cloud Service Provider가 생겨나기 시작합니다. 그 시작은 어디일까요?

바로 아마존입니다.

2. 클라우드의 대 시작, 아마존 웹 서비스(AWS)

AWS는 2006년 스토리지 서비스(S3)를 세상에 출시하게 됩니다. 첫 번째 클라우드 제품이지요. 해당 서비스를 시작으로 서버 임대 및 호스팅 서비스인 EC2를 발표하게 됩니다.

 

3. 클라우드를 왜 사용할까?

 

클라우드를 도대체 왜 사용할까요?

대기업, 중견기업, 중소기업, 스타트업.. 소프트웨어 회사들은 빠르게 증가하고 있고, 그에 따라 다양한 서비스들도 빠르게 출시되고 있습니다. 우선 소규모 기업부터 생각해보겠습니다.

 

소프트웨어 회사들의 서비스는 서비스를 런칭하기 위해서는 돌아갈 서버가 필요합니다. 하지만, 서버 비용은 생각보다 많이 비싸 초기 투자 비용으로 생각하기엔 쉽지 않습니다. 클라우드는 이러한 스타트업, 작은 기업에게 서비스를 쉽게 런칭할 수 있는 기회를 제공해줍니다. 

 

대기업은 클라우드를 왜 사용할까요? 빠른 주기의 개발, 빠른 배포, 그리고 관리의 측면이 있게 됩니다. 우선, 클라우드의 IaaS, PaaS, SaaS 상품중 PaaS이상으로만 가도 관리 인력은 크게 줄어들게 됩니다. 클라우드 업체에서 해당 서버들을 관리해주기 때문이죠. 그에 상응하는 서버 사용비용, PaaS 제품 사용비용이 들어가긴 하지만, 해당 서버를 구매하는 비용, 서비스 존속 기간, 인력비용 등을 감안하였을때, 클라우드로 넘어가더라도 충분히 메리트가 있죠.

 

또한, 정부의 Digital Transformation에 투자하는 모습 또한, 대기업의 입장에서 클라우드 전환은 시도해볼 만한 가치가 있는 사업이라고 생각됩니다.

 

그 외에도 클라우드를 사용하게 되면 많은 이점이 있게되는데요, 관련된 wiki 링크를 첨부하도록 하겠습니다.

https://ko.wikipedia.org/wiki/%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C_%EC%BB%B4%ED%93%A8%ED%8C%85

 

클라우드 컴퓨팅 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 클라우드 컴퓨팅(영어: cloud computing)은 사용자의 직접적인 활발한 관리 없이 특히, 데이터 스토리지(클라우드 스토리지)와 컴퓨팅 파워와 같은 컴퓨터 시스템

ko.wikipedia.org

우리의 삶에 조금씩 가까이 다가오고있는 클라우드. 이제는 맥주 상표명만이 아닌, 클라우드의 세상에 살고 있는 여러분 입니다. Azure, AWS, GCP 글로벌 3대장 CSP뿐 아니라, 네이버, KT, NHN 클라우드가 대한민국의 공공산업에 뛰어 들고 있습니다.

 

앞으로는 Azure를 중심으로 포스팅을 하여 어떤 서비스들이 있는지 살펴보고, Azure Portal, 스크립트, 네트워크, 보안, 스토리지, IaaS, DB, Kubernetes.. 등 다양한 서비스들에 대해 소개하고, 배포도 해보고, 테스트도 해보는 블로그로 찾아뵙겠습니다.

안녕하세요 보나에요~ 전에꺼에 이어서 해볼께요!

 

(1)을 보시고 싶으면 https://bonahbruce.tistory.com/76

여기로 들어가보세요!

 

kubernetes에 jupyter container 띄우기 ( azure 활용)

안녕하세요 본아에요~ 오늘은 portal.azure.com의 vm 안에서 aks, acr등을 활용하여 jupyter notebook을 올리는 작업을 한번 진행해 보겠습니다.(부족한 점이 많아요) 1. portal azure 로그인 후, 리소스 그룹을..

bonahbruce.tistory.com

 

전에거에서는, persistent volume이 없어서, jupyter에서 데이터분석을 열심히~ 했어도 

기록이 남아있지 않아요.... 말짱 도루묵.... 인거죠

 

왜냐면 k8s는 기본적으로 stateless한 클러스터를 구축하기 때문에

자기가 사용할 volume을 미리 만들어서 붙여주거나, (static)

아니면, pod를 띄우면서 dynamic하게 생성하는 방법이 있어요! 

 

동적으로 하는거는 아직 제가 서툴러서... 우선 제가 구현해본 static 버전으로 설명을 드려볼게요!!

 

우선 저는 public cloud 중 azure를 사용하고 있어요~!

 

그래서! 사용할 storage(창고)를 위해 storage account를 개설할거에요!

 

요렇게 생겨먹은것을 생성한 뒤,

access keys 부분으로 들어가셔서, key1 또는 key2를 복사해주세요

 

그 후,

 

kubectl create secret generic fileshare-secret --from-literal=azurestorageaccountname=bonahstorage --from-literal=azurestorageaccountkey=<key1입력> -n jupyter

이런식으로 secret을 생성해주면 됩니다!

여기서 

fileshare-secret = secret의 이름

bonahstorage = Azure에 있는 storageaccount 이름

<key1입력> = key에 있는 엄청 긴 값(여기에서 <>는 제거하고 넣으셔야되요)

 

자,,

그렇게 생성을 하고 나면

이제 yaml 파일 두개를 생성해야되요!

 

1. pv

pv는 이제 persistent volume이라고 해서, 실제 존재하는 pv를 명시하는 부분이고

2. pvc

pvc는 이제 요청을 하는거에요. 나 요런 저장공간을 갖고있는 pv를 붙이려고해!!

그러면 pv에 있는 저장소중 pvc에서 요청한 것에 충족되는 pv를 불러와서 inbound하게 됩니다. (제가 이해한바론..)

 

pv.yaml파일은 다음과 같이 생겼어요

 

kind: PersistentVolume
apiVersion: v1
metadata:
  name: fileshare-pv
  labels:
    usage: fileshare-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  azureFile:
    secretName: fileshare-secret
    shareName: bonah
    readOnly: false

pvc.yaml파일은 다음과 같이 생겼어요

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: fileshare-pvc
  # Set this annotation to NOT let Kubernetes automatically create
  # a persistent volume for this volume claim.
  annotations:
    volume.beta.kubernetes.io/storage-class: ""
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  selector:
    matchLabels:
      usage: fileshare-pv

두 yaml 파일을 모두 apply 해주세요!

kubectl apply -f pv.yaml -n jupyter
kubectl apply -f pvc.yaml -n jupyter

그 후, 다시 jupyter.yaml을 deploy 하면 됩니다! 아 ! 그전에!

jupyter.yaml에서 deployment 부분을 살짝 추가를 해야 하는 부분이 있습니다.

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: base-notebook
  labels:
    app: base-notebook
spec:
  replicas: 1
  selector:
    matchLabels:
      app: base-notebook
  template:
    metadata:
      labels:
        app: base-notebook
    spec:
      volumes:
      - name: azure
        persistentVolumeClaim:
          claimName: fileshare-pvc
      containers:
      - name: base-notebook
        image: acrintern.azurecr.io/base-notebook:v1
        ports:
        - containerPort: 8888
        command: ["start-notebook.sh"]
        args: ["--NotebookApp.token=''"]
        volumeMounts:
        - name: azure
          mountPath: "/home/jovyan/work"

기존 yaml 형식에서 모두 같지만, persistentVolumeClaim이라는 부분이 새로 추가되었을거에요!

 

pv를 요청하는 pvc를 저희가 만든 pvc.yaml에서 fileshare-pvc라고 metadata name을 설정해놓았어요!(위에 보시면됩니다) 그래서 그 pvc를 불러오는거에요! 나 fileshare-pvc 레이블이 있는 pvc.yaml파일에서 생성한 그 claim을 쓸거야! 이런느낌입니다.

 

그리고 실행하면 pv가 붙은 jupyter notebook이 탄생하게 됩니다~~ 짝짝짝

 

다음에는, 저희가 loadbalancer를 사용해서 외부에서 접근가능하게 해준것을,

azure를 사용하면 제공해주는 domain name으로 변경해서 사용하는, 간편한 방법을 이용해볼게요!!

다음에 만나욥!

'IT > Kubernetes' 카테고리의 다른 글

helm을이용해 k8s에 kafka 설치하기!  (1) 2020.08.11
helm 설치  (0) 2020.08.11
kubernetes multiple cluster일때 cluster 옮기는 방법  (0) 2020.08.03
k8s 정리  (0) 2020.07.31
kubernetes에 jupyter notebook 띄우기 (1)  (0) 2020.07.15

+ Recent posts