비고
NAP(노드 자동 프로비저닝)를 사용하는 경우 NAP로 LocalDNS 를 구성하는 방법에 대한 지침은 LocalDNS 구성을 참조하세요.
LocalDNS는 JSON 기반 구성 파일 localdnsconfig.json 사용하여 각 노드 풀에 대한 DNS 확인 동작을 정의합니다. 이 파일을 사용하면 작동 모드, 다른 DNS 도메인에 대한 서버 블록 및 캐싱, 전달 및 로깅과 같은 플러그 인 설정을 지정할 수 있습니다.
기본 LocalDNS 구성
기본 LocalDNS 구성은 대부분의 AKS 워크로드에 대한 내부 및 외부 DNS 확인을 모두 최적화하는 균형 잡힌 설정을 제공합니다. 이 구성을 시작점으로 사용하고 클러스터의 특정 DNS 요구 사항에 더 잘 맞게 사용자 지정할 수 있습니다.
LocalDNS를 사용자 지정할 때 템플릿으로 다음 구성 형식을 사용합니다. 필요에 따라 추가 서버 블록을 정의할 수 있지만 지원되지 않거나 비표준 최상위 속성을 구성에 추가하면 유효성 검사 실패가 발생합니다.
{
"mode": "Required",
"vnetDNSOverrides": {
".": {
"queryLogging": "Error",
"protocol": "PreferUDP",
"forwardDestination": "VnetDNS",
"forwardPolicy": "Sequential",
"maxConcurrent": 1000,
"cacheDurationInSeconds": 3600,
"serveStaleDurationInSeconds": 3600,
"serveStale": "Immediate"
},
"cluster.local": {
"queryLogging": "Error",
"protocol": "ForceTCP",
"forwardDestination": "ClusterCoreDNS",
"forwardPolicy": "Sequential",
"maxConcurrent": 1000,
"cacheDurationInSeconds": 3600,
"serveStaleDurationInSeconds": 3600,
"serveStale": "Immediate"
}
},
"kubeDNSOverrides": {
".": {
"queryLogging": "Error",
"protocol": "PreferUDP",
"forwardDestination": "ClusterCoreDNS",
"forwardPolicy": "Sequential",
"maxConcurrent": 1000,
"cacheDurationInSeconds": 3600,
"serveStaleDurationInSeconds": 3600,
"serveStale": "Immediate"
},
"cluster.local": {
"queryLogging": "Error",
"protocol": "ForceTCP",
"forwardDestination": "ClusterCoreDNS",
"forwardPolicy": "Sequential",
"maxConcurrent": 1000,
"cacheDurationInSeconds": 3600,
"serveStaleDurationInSeconds": 3600,
"serveStale": "Immediate"
}
}
}
LocalDNS는 워크로드에 대한 LocalDNS 적용 범위를 정의하는 세 가지 가능한 모드로 사용하도록 설정할 수 있습니다.
Required: 이 모드에서는 모든 필수 구성 요소가 충족되는 경우 LocalDNS가 노드 풀에 적용됩니다. 요구 사항이 충족되지 않으면 배포가 실패합니다.
Disabled: 로컬 DNS 기능을 사용하지 않도록 설정합니다. 즉, DNS 쿼리가 노드에서 로컬로 확인되지 않습니다.
Preferred: 이 모드에서 AKS는 LocalDNS 구성이 구문적으로 올바르지만 노드에서 LocalDNS를 사용하도록 설정하지 않는지 확인합니다.
그러나 이 모드를 적용하면 노드 이미지 작업이 계속 트리거되므로 클러스터의 DNS 확인에 영향을 주지 않고도 오류에 대한 구성을 테스트할 수 있습니다.
다음 표에는 각 모드 및 Kubernetes 버전에 대한 LocalDNS 동작이 요약되어 있습니다.
| Kubernetes 버전 |
선호 |
필수 |
사용 안 함 |
| 1.31 미만 |
지원되지 않음 |
지원되지 않음 |
지원되지 않음 |
| 1.31보다 큼 |
구성 유효성 검사됨, 설치되지 않음 |
설치 및 적용 |
구성 유효성 검사됨, 설치되지 않음 |
비고
이 모드는 Preferred 현재 유효성 검사 전용 모드로 사용됩니다. 이후 Kubernetes 버전에서 이 모드는 LocalDNS를 자동으로 사용하도록 설정으로 전환됩니다. 현재 프로덕션 배포에서는 Required 모드를 사용하여 LocalDNS를 활성화합니다.
LocalDNS에 대한 서버 블록 및 지원되는 플러그 인
기본 구성은 Pod가 dnsPolicy:default 아래에서 vnetDNSOverrides를 사용하고 dnsPolicy:ClusterFirst 아래에서 kubeDNSOverrides를 사용하는 경우의 쿼리에 적용됩니다. 각 블록 내에는 . 및 cluster.local의 두 개의 기본 서버 블록이 정의되어 있습니다.
. 는 공용 또는 비클러스터 도메인(예 microsoft.com: )을 확인하려는 Pod의 모든 외부 DNS 쿼리를 나타냅니다.
cluster.local 는 kubernetes 서비스 이름 또는 내부 클러스터 리소스를 확인하려는 Pod의 모든 내부 Kubernetes 서비스 검색 쿼리를 나타냅니다. 이러한 쿼리는 클러스터 내에서 확인을 위해 CoreDNS를 통해 라우팅됩니다.
지원되는 플러그 인
| 플러그 인 |
설명 |
기본값 |
허용되는 입력 |
queryLogging |
DNS 쿼리에 대한 로깅 수준을 정의합니다. |
Error |
Error
Log
|
protocol |
DNS 쿼리에 사용되는 프로토콜을 설정합니다(UDP/TCP 기본 설정). |
cluster.local의 경우 ForceTCP, 그렇지 않은 경우 PreferUDP |
PreferUDP
ForceTCP
|
forwardDestination |
쿼리를 전달할 DNS 서버를 지정합니다. |
ClusterCoreDNS cluster.local 및 kubeDNS 트래픽의 경우, 그렇지 않으면 VnetDNS |
VnetDNS
ClusterCoreDNS
|
forwardPolicy |
업스트림 DNS 서버를 선택할 때 사용할 정책을 결정합니다. |
Sequential |
Random
RoundRobin
Sequential
|
maxConcurrent |
LocalDNS에서 처리하는 최대 동시 DNS 쿼리 수입니다. |
1000 |
정수 |
cacheDurationInSeconds |
DNS 응답이 캐시되는 최대 TTL(Time To Live)(초)입니다. |
3600 |
정수 |
serveStaleDurationInSeconds |
업스트림을 사용할 수 없는 경우 부실 DNS 응답을 제공하는 기간(초)입니다. |
3600 |
정수 |
serveStale |
업스트림 실패 시 부실 DNS 응답을 제공하는 정책입니다. |
Immediate |
Verify
Immediate
Disabled
|
구성 유효성 검사 규칙
LocalDNS 구성을 만들 때 배포 오류를 방지하려면 다음 유효성 검사 규칙을 알고 있어야 합니다.
루트 영역(.) 제한 사항: vnetDNSOverrides 아래에서는 루트 영역에 대한 forwardDestination를 ClusterCoreDNS할 수 없습니다.
Cluster.local 영역 제한: vnetDNSOverrides 및 kubeDNSOverrides에서는, forwardDestination의 cluster.local를 VnetDNS할 수 없습니다.
프로토콜 및 serveStale 호환성: protocol가 ForceTCP로 설정되면, serveStale를 Verify로 설정할 수 없습니다.
Immediate를 대신 사용하세요.
비고
이러한 유효성 검사 규칙은 구성 배포 중에 적용됩니다. 이를 위반하면 LocalDNS 구성이 유효성 검사에 실패합니다.
LocalDNS에서 사용자 지정 서버 블록 만들기
CoreDNS는 쿼리되는 도메인에 대한 정확한 일치를 기반으로 특정 서버 블록에 대한 쿼리를 일치시키고 부분 일치는 일치하지 않습니다. 사용자 지정 서버 블록이 필요한 경우 추가된 구성을 사용하여 localdnsconfig.json 파일을 만들어 LocalDNS 구성에 추가할 수 있습니다.
예를 들어 microsoft.com 액세스할 때 특정 DNS가 필요한 경우 다음 서버 블록을 사용할 수 있습니다.
"microsoft.com": {
"queryLogging": "Error",
"protocol": "ForceTCP",
"forwardDestination": "ClusterCoreDNS",
"forwardPolicy": "Sequential",
"maxConcurrent": 1000,
"cacheDurationInSeconds": 3600,
"serveStaleDurationInSeconds": 3600,
"serveStale": "Immediate"
}
LocalDNS 모니터링
LocalDNS는 모니터링 및 경고에 사용할 수 있는 Prometheus 메트릭을 노출합니다. 이러한 메트릭은 노드 IP의 포트 9253 에 노출되며 여기에서 스크래핑할 수 있습니다.
다음 YAML 예제는 애드온으로서 Azure Managed Prometheus를 DaemonSet으로 사용할 수 있는 스크랩 구성을 보여줍니다.
kind: ConfigMap
apiVersion: v1
metadata:
name: ama-metrics-prometheus-config-node
namespace: kube-system
data:
prometheus-config: |-
global:
scrape_interval: 1m
scrape_configs:
- job_name: localdns-metrics
scrape_interval: 1m
scheme: http
metrics_path: /metrics
relabel_configs:
- source_labels: [__metrics_path__]
regex: (.*)
target_label: metrics_path
- source_labels: [__address__]
replacement: '$NODE_NAME'
target_label: instance
static_configs:
- targets: ['$NODE_IP:9253']
LocalDNS 문제 해결
특정 도메인에 대한 DNS 쿼리가 실패합니다.
LocalDNS를 사용하도록 설정한 후 특정 도메인에 대한 DNS 쿼리가 실패하는 경우:
-
localdnsconfig.json에 잘못 구성되었을 수 있는 도메인별 재정의가 있는지 확인합니다.
- 도메인별 재정의를 제거하고 기본
. 구성만 사용하여 일시적으로 시도합니다.
- 설정을 조정
protocol 하여 UDP(사용자 데이터그램 프로토콜) 및 TCP(Transmission Control Protocol) 모두에서 문제가 발생하는지 확인합니다.
LocalDNS용 Vnet DNS 서버 업데이트
Azure 포털 또는 CLI를 사용하여 Vnet 구성에서 직접 사용자 지정 DNS 서버를 업데이트하는 경우 이러한 변경 내용은 AKS 클러스터 노드에 자동으로 적용되지 않습니다. Vnet 수준에서 DNS 설정을 업데이트하면 NRP(네트워크 리소스 공급자)만 알릴 수 있지만 AKS 리소스 공급자에 알리지 않습니다. 따라서 AKS 노드는 추가 작업이 수행될 때까지 이전 DNS 서버 설정을 계속 사용합니다.
AKS 노드가 새 Vnet DNS 서버 설정을 선택하도록 하려면 다음을 수행합니다.
필요에 따라 Azure 포털 또는 API를 사용하여 Vnet DNS 구성을 업데이트합니다.
AKS 리소스 공급자를 사용하여 노드 풀을 이미지로 다시 설치하여 업데이트된 DNS 설정이 적용되고 유지되도록 합니다.
az aks nodepool upgrade --resource-group myResourceGroup --cluster-name myAKSCluster --name mynodepool --node-image-only
이 프로세스를 통해 AKS 리소스 공급자는 DNS 변경 내용을 인식하고 노드 풀의 모든 노드에 적용합니다.
LocalDNS를 사용하여 DNS 확인을 허용하도록 Cilium 네트워크 정책 업데이트
클러스터에 Cilium 네트워크 정책을 배포하는 경우 LocalDNS IP 주소에 대한 Pod 송신을 명시적으로 허용해야 합니다.
네트워크 정책은 지정되지 않은 대상에 대해 기본 거부 모델을 적용하므로 명시적으로 허용되지 않는 한 LocalDNS에 대한 DNS 트래픽이 차단됩니다.
- Cilium <=v1.16에서 k8s <=1.31로 구동되는 Azure CNI에서 CIDR 기반 정책을 통해 수행할 수 있습니다.
- Cilium >=v1.17 및 K8s >=1.32가 적용된 Azure CNI에서 호스트 엔터티로의 아웃바운드 트래픽이 허용되는 Cilium 네트워크 정책을 사용할 수 있습니다.
다음 Cilium 네트워크 정책을 사용하여 모든 버전에서 트래픽을 허용할 수 있습니다.
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "allow-azure-dns-egress"
namespace: default
spec:
endpointSelector:
matchLabels: {} # This selects ALL pods in the namespace
egress:
- toCIDR:
- 169.254.10.0/24
toPorts:
- ports:
- port: "53"
protocol: UDP
- port: "53"
protocol: TCP
- toEntities:
- host
toPorts:
- ports:
- port: "53"
protocol: UDP
- port: "53"
protocol: TCP
다음 단계
AKS의 LocalDNS에 대한 자세한 내용은 Azure Kubernetes Service(개념)에서의 LocalDNS를 참조하세요.
LocalDNS를 사용할 때 DNS 문제에 대한 포괄적인 문제 해결 지침은 AKS의 LocalDNS 문제 해결을 참조하세요.
AKS에서 CoreDNS를 사용자 지정하는 방법에 대한 자세한 내용은 CoreDNS 사용자 지정 가이드를 참조하세요.
CoreDNS 프로젝트에 대한 자세한 내용은 CoreDNS 업스트림 프로젝트 페이지를 참조하세요.
핵심 네트워크 개념에 대해 자세히 알아보려면 AKS의 애플리케이션에 대한 네트워크 개념을 참조하세요.