독립형 DNS 프록시
독립형 DNS 프록시 (Standalone DNS Proxy, alpha)
Cilium 에이전트와 독립된 DaemonSet으로 실행되는 독립형 DNS 프록시 구성 요소를 설명하는 문서예요. 알파 기능이며, DNS 폴리시 시행 기능을 에이전트와 분리해 제공해요.
본문
참고: 이것은 알파 기능이에요. 문제가 발생하면 피드백을 주고 GitHub issue를 제출해 주세요.
독립형 DNS 프록시(Standalone DNS Proxy)는 클러스터에서 별도 DaemonSet으로 실행되는 독립 구성 요소로, Cilium 에이전트와 무관하게 DNS 프록시 기능을 제공해요. 에이전트 내부 프로xy(in-agent proxy)는 독립형 DNS 프록시와 나란히 실행돼요. DNS 요청의 부하는 두 프록시 사이에 공유돼요.
개요 (Overview)
독립형 DNS 프록시는 gRPC를 통해 Cilium 에이전트와 통신해 다음을 수행해요.
- 에이전트로부터 DNS 정책 규칙을 받아요
- 정책 시행을 위해 DNS 쿼리 결과를 에이전트에 보고해요
구성 (Configuration)
독립형 DNS 프록시를 활성화하려면 다음 Helm 값을 설정하세요.
# Enable L7 proxy and configure DNS proxy port
l7Proxy: true
dnsProxy:
proxyPort: 10094 # Must be non-zero when using standalone DNS proxy, choosing 10094 as example
# Enable standalone DNS proxy
standaloneDnsProxy:
enabled: true
serverPort: 10095 # Must be non-zero when using standalone DNS proxy, choosing 10095 as example
중요: 독립형 DNS 프록시는 일관성을 보장하기 위해 에이전트의 DNS 구성을 사용해요.
dnsProxy.proxyPort는 0이 아닌 값(예: 10094)으로 명시적으로 설정해야 해요dnsProxy.enableDnsCompression및 기타 DNS 설정은 에이전트와 동일한 기본값(기본값: true)을 자동으로 사용해요Helm 차트는
proxyPort가 올바르게 구성되지 않으면 검증에 실패해요.
독립형 DNS 프록시 테스트 (Testing the Standalone DNS Proxy)
이 섹션은 개발 환경에서 독립형 DNS 프록시를 테스트하는 단계를 제공해요. 독립형 DNS 프록시 기능을 테스트하려면 소스에서 컨테이너 이미지를 빌드해야 해요. 다음 지침은 kind(Kubernetes in Docker)를 사용해 로컬 개발 환경에서 독립형 DNS 프록시를 빌드하고 배포하는 방법을 안내해요.
빌드 및 배포 (Building and Deploying)
- 독립형 DNS 프록시 이미지 빌드: 소스에서 독립형 DNS 프록시 컨테이너 이미지를 빌드하세요.
$ make docker-standalone-dns-proxy-image이렇게 하면quay.io/cilium/standalone-dns-proxy:latest로컬 이미지가 생성돼요. - Cilium으로 kind 클러스터 설정: kind 클러스터를 만들고 소스에서 Cilium을 빌드·설치하세요.
$ make kind && make kind-image && make kind-install-cilium - 독립형 DNS 프록시 이미지를 kind에 로드: 빌드한 독립형 DNS 프록시 이미지를 kind 클러스터에 로드하세요.
$ kind load docker-image quay.io/cilium/standalone-dns-proxy:latest - 독립형 DNS 프록시를 활성화하도록 Cilium 업그레이드: 독립형 DNS 프록시를 활성화하고 Cilium 에이전트와 함께 작동하도록 구성하세요.
$ cilium upgrade \ --chart-directory = './install/kubernetes/cilium' \ --set = 'l7Proxy=true' \ --set = 'dnsProxy.proxyPort=10094' \ --helm-set = 'standaloneDnsProxy.enabled=true' \ --helm-set = 'standaloneDnsProxy.image.repository=quay.io/cilium/standalone-dns-proxy' \ --helm-set = 'standaloneDnsProxy.image.tag=latest' \ --helm-set = 'standaloneDnsProxy.image.useDigest=false' \ --helm-set = 'standaloneDnsProxy.image.pullPolicy=Never'이 예제의 구성 플래그는 다음 구성을 적용해 독립형 프록시가 운영되도록 보장해요.dnsProxy.proxyPort=10094는 에이전트와 독립형 DNS 프록시가 모두 사용하는 DNS 프록시 포트를 설정해요l7Proxy=true는 DNS 정책 시행에 필요한 L7 프록시 지원을 활성화해요- 독립형 DNS 프록시는 에이전트 구성에서 DNS 설정을 자동으로 상속해요
image.tag=latest와image.pullPolicy=Never는 로컬로 빌드한 이미지를 참조하는 데 사용돼요
- Cilium 에이전트 재시작: 구성 변경을 적용하기 위해 Cilium 에이전트를 재시작하세요.
$ kubectl rollout restart ds -n kube-system cilium - 배포 확인: 독립형 DNS 프록시 파드가 실행 중인지 확인하세요.
$ kubectl -n kube-system get pods -l k8s-app = standalone-dns-proxyNAME READY STATUS RESTARTS AGEstandalone-dns-proxy-xxxxx 1/1 Running 0 1m - DNS 정책 적용:
org: alliance라벨의 파드가 특정 도메인(cilium.io와 그 하위 도메인)을 조회하도록 허용하고 다른 모든 쿼리를 차단하는 정책을 적용하세요.apiVersion : cilium.io/v2kind : CiliumNetworkPolicymetadata : name : "tofqdn-dns-visibility"spec : endpointSelector : matchLabels : any:org : allianceegress : - toEndpoints : - matchLabels : "k8s:io.kubernetes.pod.namespace" : kube-system"k8s:k8s-app" : kube-dnstoPorts : - ports : - port : "53" protocol : ANYrules : dns : - matchName : "cilium.io"- matchPattern : "*.cilium.io"- matchPattern : "*.api.cilium.io"- toFQDNs : - matchName : "cilium.io"- matchName : "sub.cilium.io"- matchName : "service1.api.cilium.io"- matchPattern : "special*service.api.cilium.io"toPorts : - ports : - port : "80" protocol : TCP$ kubectl apply -f examples/policies/l7/dns/dns.yaml - 테스트 파드 배포: 일치하는 라벨로 테스트 파드를 생성하세요.
$ kubectl run test-pod --image = nicolaka/netshoot --labels = "org=alliance" -- sleep 3600 - DNS 정책 시행 확인: 허용된 도메인에 대한 DNS 쿼리가 가로채지고 해석되는지 테스트하세요.
$ kubectl exec test-pod -- nslookup cilium.io.cilium.io에 대한 쿼리는 성공해야 해요. 이제 허용되지 않은 도메인에 대한 쿼리가 거부되는지 테스트하세요.$ kubectl exec test-pod -- nslookup example.com.Server: 10.96.0.10Address: 10.96.0.10#53** server can't find example.com: REFUSEDexample.com에 대한 쿼리는 허용된 DNS 정책 규칙에 없기 때문에 거부돼요. - 독립형 프록시 탄력성 테스트: Cilium 에이전트가 다운된 상태에서도 독립형 DNS 프록시가 계속 동작하는지 확인하세요.
# Intentionally break the Cilium agent by using a non-existent image$ kubectl set image -n kube-system ds/cilium cilium-agent = quay.io/cilium/cilium:non-existent-image# Wait for agent pods to enter ImagePullBackOff state$ kubectl wait --for = condition = Ready = false pod -n kube-system -l k8s-app = cilium --timeout = 60s# DNS queries for allowed domains should still work via standalone DNS proxy$ kubectl exec test-pod -- nslookup cilium.io# Verify that policy enforcement still works - non-allowed domains are still refused$ kubectl exec test-pod -- nslookup example.comServer: 10.96.0.10Address: 10.96.0.10#53** server can't find example.com: REFUSED두 쿼리는 에이전트를 사용할 수 없을 때도 독립형 DNS 프록시가 DNS 정책을 독립적으로 계속 시행해 cilium.io를 허용하고 example.com을 거부한다는 것을 보여줘요. - Cilium 에이전트 복원: Cilium 에이전트를 정상 운영으로 복원하세요.
$ kubectl rollout undo ds/cilium -n kube-system
DNS 정책에 대한 자세한 내용은 DNS based를 참고하세요.
제한 사항 (Limitations)
독립형 DNS 프록시 알파 릴리스에는 다음과 같은 알려진 제한 사항이 있어요.
- 독립형 DNS 프록시는 에이전트의 DNS 구성을 사용해요. 독립형 DNS 프록시가 활성화되면
dnsProxy.proxyPort를 0이 아닌 값으로 명시적으로 설정해야 해요(자동으로 빈 포트를 선택하지 않아요). - DNS 관련 메트릭은 아직 지원되지 않아요. 메트릭은 현재 에이전트 내부(in-agent) DNS 프록시에서만 사용할 수 있어요.
- 독립형 DNS 프록시는 DNS 정책을 읽고, 시행하고, gRPC로 통신하기 위해 Cilium 에이전트에 의존해요. 프록시와 에이전트 사이에 연결 문제가 있으면 DNS 정책 시행이 영향을 받을 수 있어요.
- 에이전트가 다운될 때 독립형 DNS 프록시가 DNS 요청을 계속 프록시할 수는 있지만, 이전에 관찰되지 않은 도메인에 대해 새 식별자를 할당할 수는 없어요. 엔드포인트가 에이전트를 사용할 수 없는 동안 새 도메인(캐시되지 않은)을 조회하면, 보안 식별자를 할당할 수 없으므로 결과 트래픽이 버려져요. 에이전트 다운 중에는 이전에 관찰된 도메인(캐시된 식별자가 있는)에 대한 DNS 조회만 동작해요.
문제 해결 (Troubleshooting)
검증 오류 (Validation Errors)
Helm 차트가 dnsProxy.proxyPort에 대한 검증 오류로 실패하면:
Error: standaloneDnsProxy requires dnsProxy.proxyPort to be set to a non-zero value (e.g., 10094)
이는 값에서 DNS 프록시 포트를 명시적으로 구성해야 한다는 뜻이에요.
dnsProxy:
proxyPort: 10094 # Must be non-zero
포트 구성 확인 (Port Configuration Verification)
DNS 프록시 포트가 올바르게 구성됐는지 확인하려면:
$ kubectl -n kube-system get configmap cilium-config -o yaml | grep 'tofqdns-proxy-port'
$ kubectl -n kube-system get configmap standalone-dns-proxy-config -o yaml | grep 'tofqdns-proxy-port'
두 ConfigMap 모두 dnsProxy.proxyPort와 같은 값을 보여야 해요.
gRPC 통신 문제 (gRPC Communication Issues)
프록시와 에이전트 사이에 통신 문제가 있으면 연결 오류를 위해 에이전트 로그를 검토하세요.
$ kubectl -n kube-system logs -l k8s-app=cilium --tail=100 | grep -i "fqdn.sdp-grpc-server"
API 참조 (API Reference)
자세한 API 문서는 SDP gRPC API Reference를 참고하세요.
더 읽을거리 (Further Reading)
- DNS based
- DNS Proxy