Engineering/Azure

[AKS] 개인 DNS 서버와 연결된 Private AKS 클러스터 만들기

5=0 2021. 8. 4. 22:31

 

1. Private AKS 클러스터란?

기본적인 AKS 클러스터는 K8S의 API 서버와 Public 통신을 하게 됩니다. 

그러나 기업 환경에서는 대부분 보안상의 이유로 K8S API 서버와의 통신을 private 통신을 따라야할 필요가 있습니다. 

 

Azure에서는 API 서버가 private IP를 갖고 통신할 수 있는 AKS 클러스터를 지원하며, 이를 Private 클러스터 라고 합니다. 

API 서버가 private IP를 갖기 때문에 노드와 API 서버간 통신 또한 private 망 내에서 이루어집니다. 

private cluster에 대한 자세한 설명은 아래 Microsoft 문서를 참고하시기 바랍니다.

https://docs.microsoft.com/en-us/azure/aks/private-clusters

 

Create a private Azure Kubernetes Service cluster - Azure Kubernetes Service

Learn how to create a private Azure Kubernetes Service (AKS) cluster

docs.microsoft.com

 

 

 

2. Private Cluster 구조

기본적인 Private Cluster는 아래와 유사한 구조로 생성 됩니다. 

Image source from https://docs.microsoft.com/en-us/azure/aks/private-clusters#hub-and-spoke-with-custom-dns

 

 

지금은 1~3번 동그라미만 보면 됩니다. 

1-1. Private Endpoint 

기본적으로는 AKS 클러스터가 존재하는 subnet 쪽에 subnet 내 private IP를 갖는 Private Endpoint가 생깁니다.

이는 API 서버의 endpoint로 사용 됩니다. 

API 서버가 private IP를 갖게 해주는 구조가 바로 여기서 옵니다. 

 

1-2. Private DNS Zone 

1에서 생성된 API 서버의 Private endpoint로 DNS resolve를 위해 Private DNS zone이 생성 됩니다. 

실제로 최종 생성되는 API 서버의 도메인을 보면 privatelink.{regionname}.azmk8s.io 도메인을 갖게 됩니다. 

이러한 privatelink.{regionname}.azmk8s.io 도메인의 resolve를 위한 DNS 영역이라고 이해하면 됩니다. 

 

1-3. Linked VNet

일반적으로 Azure VNET을 생성하면 168.63.129.16 IP를 갖는 Azure Internal DNS를 사용합니다. 

그리고 Private Cluster는 이 Azure Internal DNS와 Private DNS Zone을 자동으로 연결해 줍니다. 

따라서 Private Cluster 에서 개인 DNS를 사용하지 않고 Azure Internal DNS를 사용하는 경우, 

Private endpoint를 갖는 API 서버의 DNS resolve를 자동으로 해주죠.

 

 

 

그럼 만약 개인 DNS 서버 (Microsoft 문서상 custom DNS) 를 써야 하는 경우엔 어떻게 해야할까요? 

이에 대한 방법을 알려 드리는게 이 글의 목적입니다!!!

자. 그럼 본 내용을 3장에서부터 시작하겠습니다. 

 

 

 

3. Private Cluster에서 개인 DNS 서버 사용하기

Private clstuer에서 개인 DNS 서버를 사용하기 위해 최종 구현해야할 형상은 아래와 같습니다. 

참고로 개인 DNS 서버는 on-prem에 있을 수도 또는 Azure 상 다른 VNET에 있을 수도 있습니다. 

본 글의 경우 편의를 위해 Azure 상 다른 VNET에 DNS 서버를 구축하여 테스트 예정입니다. 

image source from https://levelup.gitconnected.com/custom-dns-configuration-aks-kubernetes-360e481afc1

 

 

해야할일들은 크게 아래와 같습니다. 

(1) AKS VNET 준비 및 설정
(2) 개인 DNS 서버 VNET과 AKS VNET 피어링

(3) 개인 DNS 서버에 Azure Internal DNS 를 upstream forwarder로 추가

(4) Private DNS zone 생성 

(5) Managed ID 생성 및 권한 추가

(6) AKS private cluster 생성

 

그럼 각 단계별로 같이 따라 오시죠.

 

1-1. AKS VNET 준비 및 설정

AKS를 생성할 VNET 및 subnet을 생성합니다. (자원 생성은 간단하니... 설명은 생략합니다.)

이때 저희는 개인 DNS 서버를 사용해야 하므로 VENT의 DNS 설정을 아래처럼 바꿔 줍니다. 

DNS IP주소에 개인 DNS 서버 주소를 입력하면 됩니다. 

 

1-2. 개인 DNS 서버 VNET과 AKS VNET 피어링

저의 경우 개인 DNS 서버를 AKS VNET(privAKSvNET2)과 다른 Azure VNET(privAKSvNET) 상에 구성해 두었습니다. 

따라서 DNS 서버가 있는 VNET과 AKS VNET 간 피어링을 구성해 주었습니다. 

**on-prem 환경에 DNS 서버가 있으신 경우에는 Hub-spoke 네트워크 구성을 하여 사용하셔야 합니다. 
on-prem 과 Azure 환경 사이에 중간 다리 역할을 하는 Hub Vnet을 생성하는 구조 입니다. 

 

아래와 같이 AKS VNET (privAKSvNET2)와 Azure VNET(privAKSvNET)간 피어링이 된 것을 확인할 수 있습니다.

 

1-3. 개인 DNS 서버에 Azure Internal DNS 를 upstream forwarder로 추가

Private 클러스터에서 개인 DNS 를 사용하려면 DNS 서버가 Azure Internal DNS 서버를 upstream resolver로 갖고 있어야 합니다. 

그래야 개인 DNS -> Azure Internal DNS -> Private DNS Zone -> Private Endpoint 로 DNS resolve가 가능하겠죠? 

 

Microsoft 문서에 prerequisite으로도 나와 있으나, 쉽게 지나치기 쉬워 많이들 놓치시는 부분입니다. 

https://docs.microsoft.com/en-us/azure/aks/private-clusters#prerequisites

 

Create a private Azure Kubernetes Service cluster - Azure Kubernetes Service

Learn how to create a private Azure Kubernetes Service (AKS) cluster

docs.microsoft.com

 

저는 Windows Server로 DNS 서버를 구성하였으며, 여기에 Conditional Forwarder 설정을 아래와 같이 추가 하였습니다. 

DNS 도메인에는 privatelink.{region name}.azmk8s.io를 입력하셔야 합니다. 

 

 

1-4. Private DNS Zone 생성

이제 Private DNS Zone 을 만들어 줍시다. 

주의할점은 Private DNS Zone 이름은 privatelink.{region name}.azmk8s.io 형식이어야 합니다. 

 

그리고 가상 네트워크 링크로 개인 DNS 서버의 VNET을 연결해 줍니다. 

 

 

1-5. Managed ID 생성 및 권한 추가

위에서 보신 바와 같이 AKS 클러스터는 Azure을 다른 서비스들 (Azure VNET, Private DNS Zone ...)과 연동 포인트가 많습니다. 

AKS 클러스터 생성 시 AKS와 연동되는 서비스 자원들에 대한 Authorization을 위해 Managed ID를 사용하게 됩니다. 

 

따라서 Managed ID를 만들고 필요한 권한을 추가합시다. 

필요한 권한은 아래와 같습니다. 

- AKS subent 자원에 대한 Network contributor(네트워크 참가자) 역할 

- Private DNS Zone 자원에 대한 Private DNS Zone contributor (프라이빗 DNS 영역 참가자) 역할

 

Managed ID (관리 ID) > Azure 역할 할당 에서 역할이 잘 추가되었는지 확인합니다. 

 

1-6. AKS Private Cluster 생성

이제 모든 준비가 끝났습니다.  Private Cluster를 생성 합시다. 

 

로컬 환경에 Azure cli가 있으시면 바로 사용하시면 되고, 없다면 Azure포탈의 Cloud Shell 기능을 활용하시기 바랍니다. 

--vnet-subnet-id, --assign-identity, --private-dns-zone 값에는 각각 본인의 AKS subnet 정보, Managed ID (관리 ID) 정보, Private DNS Zone 정보를 입력하시기 바랍니다. 

# az aks create --resource-group privateAKScluster2 \
--name customDNSAKS \
--network-plugin azure \
--vnet-subnet-id "/subscriptions/{YOUR SUBSCRIPTION ID}/resourceGroups/privateAKScluster2/providers/Microsoft.Network/virtualNetworks/privAKSvNet2/subnets/default" \
--docker-bridge-address 172.17.0.1/16 \
--dns-service-ip 10.3.0.10 \
--service-cidr 10.3.0.0/24 \
--enable-managed-identity \
--assign-identity "/subscriptions/{YOUR SUBSCRIPTION ID}/resourcegroups/privateAKScluster2/providers/Microsoft.ManagedIdentity/userAssignedIdentities/eyohmgId" \
--enable-private-cluster \
--load-balancer-sku standard \
--private-dns-zone "/subscriptions/{YOUR SUBSCRIPTION ID}/resourceGroups/privateakscluster2/providers/Microsoft.Network/privateDnsZones/privatelink.koreacentral.azmk8s.io"

 

 

위 명령이 정상적으로 실행되면 AKS 클러스터가 생성 됩니다!! 

 

 

 

 

A. Appendix

 

Create a private Azure Kubernetes Service cluster - Azure Kubernetes Service

Learn how to create a private Azure Kubernetes Service (AKS) cluster

docs.microsoft.com

 

Custom DNS Configuration: AKS/Kubernetes

Using on-premise DNS Servers for name resolution on AKS Pods

levelup.gitconnected.com

 

DNS Options for Private Azure Kubernetes Service

When you deploy Azure Kubernetes Service (AKS), by default the API server is publicly made available. That means it has a public IP address and an Azure-assigned name that’s resolvable by pub…

blog.baeke.info

 

Hub-spoke network topology in Azure - Azure Reference Architectures

Learn how to implement a hub-spoke topology in Azure, where the hub is a virtual network and the spokes are virtual networks that peer with the hub.

docs.microsoft.com