이 페이지에서는 정규화된 도메인 이름(FQDN)을 사용하여 포드와 Google Kubernetes Engine(GKE) 클러스터 외부의 리소스 간 이그레스 통신을 제어하는 방법을 설명합니다. FQDN을 구성하는 데 사용하는 커스텀 리소스는 FQDNNetworkPolicy
리소스입니다.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우
gcloud components update
를 실행하여 최신 버전을 가져옵니다.
- 안내에 따라 GKE Enterprise를 사용 설정합니다.
요구사항 및 제한사항
FQDNNetworkPolicy
리소스에 대한 요구사항 및 제한사항은 다음과 같습니다.
- 다음 버전 중 하나를 실행하는 GKE 클러스터가 있어야 합니다.
- 1.26.4-gke.500 이상
- 1.27.1-gke.400 이상
- 클러스터가 GKE Dataplane V2를 사용해야 합니다.
- GKE 클러스터에서 kube-dns 또는 Cloud DNS 중 하나의 DNS 제공업체를 사용해야 합니다. 커스텀 kube-dns 또는 코어 DNS 배포는 지원되지 않습니다.
- Google Cloud CLI 버전 462.0.0 이상
- Windows 노드 풀은 지원되지 않습니다.
- Cloud Service Mesh는 지원되지 않습니다.
- 애플리케이션에 하드 코딩된 IP 주소가 있으면
FQDNNetworkPolicy
대신 KubernetesNetworkPolicy
의IPBlock
필드를 사용합니다. resolv.conf
의 대체 네임서버와 같은 클러스터가 아닌 DNS 네임서버에서 반환하는 결과는 GKE 데이터 영역의 허용 목록에 프로그래밍된 것으로 간주되지 않습니다.FQDNNetworkPolicy
가 변환할 수 있는 IPv4 및 IPv6 IP 주소의 최대 개수는 50개입니다.- GKE는 네트워크 정책 규칙을 평가하기 전에 서비스 가상 IP 주소(VIP)를 백엔드 포드 IP 주소로 변환하므로 ClusterIP 또는 Headless Service에 대한 트래픽을
FQDNNetworkPolicy
의 이그레스 대상으로 사용할 수 없습니다. 대신 Kubernetes 라벨 기반NetworkPolicy
를 사용합니다. - 호스트 이름당 최대 IP 주소 할당량은 100개입니다.
- 노드 간 투명한 암호화는 FQDN 네트워크 정책에서 지원되지 않습니다.
- 패턴 일치를 사용하는 FQDN 네트워크 정책은 와일드 카드와 동일한 수준의 하위 도메인과만 일치합니다. 예를 들어
pattern: *.company.com
는api.company.com
또는store.company.com
과 일치하지만eu.api.company.com
또는company.com
과는 일치하지 않습니다.
FQDN 네트워크 정책 사용 설정
새 클러스터 또는 기존 클러스터에서 FQDN 네트워크 정책을 사용 설정할 수 있습니다.
새 클러스터에서 FQDN 네트워크 정책 사용 설정
--enable-fqdn-network-policy
플래그를 사용하여 클러스터를 만듭니다.
gcloud container clusters create CLUSTER_NAME \
--enable-fqdn-network-policy
CLUSTER_NAME
을 클러스터 이름으로 바꿉니다.
기존 클러스터에서 FQDN 네트워크 정책 사용 설정
Autopilot 및 Standard 클러스터 모두
--enable-fqdn-network-policy
플래그를 사용하여 클러스터를 업데이트합니다.gcloud container clusters update CLUSTER_NAME \ --enable-fqdn-network-policy
CLUSTER_NAME
을 클러스터 이름으로 바꿉니다.표준 클러스터의 경우에만 GKE Dataplane V2
anetd
DaemonSet를 다시 시작합니다.kubectl rollout restart ds -n kube-system anetd
FQDNNetworkPolicy
만들기
다음 매니페스트를
fqdn-network-policy.yaml
로 저장합니다.apiVersion: networking.gke.io/v1alpha1 kind: FQDNNetworkPolicy metadata: name: allow-out-fqdnnp spec: podSelector: matchLabels: app: curl-client egress: - matches: - pattern: "*.yourdomain.com" - name: "www.google.com" ports: - protocol: "TCP" port: 443
이 매니페스트에는 다음과 같은 속성이 있습니다.
name: www.google.com
: 정규화된 도메인 이름입니다. www.google.com에 연결된 네임서버에서 제공하는 IP 주소가 허용됩니다.name
,pattern
또는 둘 다를 지정해야 합니다.pattern: "*.yourdomain.com"
: 이 패턴과 일치하는 네임서버에서 제공하는 IP 주소가 허용됩니다. 패턴 키에 다음 정규 표현식을 사용할 수 있습니다.^([a-zA-Z0-9*]([-a-zA-Z0-9_*]*[a-zA-Z0-9*])*\.?)*$
. 일치 기준은 추가됩니다.pattern
필드 여러 개를 사용할 수 있습니다.name
,pattern
또는 둘 다를 지정해야 합니다.protocol: "TCP"
및port: 443
: 프로토콜 및 포트를 지정합니다. 포드가 이 프로토콜과 포트 조합을 사용하여 IP 주소에 연결을 설정하려고 하면 이름 변환이 작동하지만 데이터 영역이 아웃바운드 연결을 차단합니다. 이 필드는 선택사항입니다.
네트워크 정책이 워크로드를 선택하는지 확인합니다.
kubectl describe fqdnnp
출력은 다음과 비슷합니다.
Name: allow-out-fqdnnp Labels: <none> Annotations: <none> API Version: networking.gke.io/v1alpha1 Kind: FQDNNetworkPolicy Metadata: ... Spec: Egress: Matches: Pattern: *.yourdomain.com Name: www.google.com Ports: Port: 443 Protocol: TCP Pod Selector: Match Labels: App: curl-client Events: <none>
FQDNNetworkPolicy
삭제
kubectl delete fqdnnp
명령어를 사용하여 FQDNNetworkPolicy
를 삭제할 수 있습니다.
kubectl delete fqdnnp FQDN_POLICY_NAME
FQDN_POLICY_NAME
을 FQDNNetworkPolicy
의 이름으로 바꿉니다.
GKE는 정책 시행에서 규칙을 삭제하지만 기존 연결은 conntrack 표준 프로토콜 가이드라인에 따라 종료될 때까지 활성 상태로 유지됩니다.
FQDN 네트워크 정책 작동 방법
FQDNNetworkPolicies
는 선택한 포드가 트래픽을 전송할 수 있는 엔드포인트를 제어하는 이그레스 전용 정책입니다. Kubernetes NetworkPolicy
와 비슷하게 워크로드를 선택하는 FQDNNetworkPolicy
는 허용된 이그레스 대상으로 지정되지 않은 엔드포인트에 대해 암시적 거부 규칙을 만듭니다. FQDNNetworkPolicies
는 FQDNNetworkPolicy 및 NetworkPolicy에 설명된 대로 Kubernetes NetworkPolicies
에 사용할 수 있습니다.
FQDNNetworkPolicies
는 IP 주소 및 포트 수준에서 적용됩니다. 레이어 7 프로토콜 정보(예: HTTP 요청의 Request-URI
)를 사용해서는 적용되지 않습니다. 지정된 도메인 이름은 GKE 클러스터의 DNS 제공업체에서 제공된 DNS 정보를 사용하여 IP 주소로 변환됩니다.
DNS 요청
워크로드를 선택하는 활성 FQDNNetworkPolicy
는 DNS 요청을 수행하는 워크로드 기능에 영향을 주지 않습니다. nslookup
또는 dig
과 같은 명령어는 정책의 영향을 받지 않고 모든 도메인에서 작동합니다. 그러나 허용 목록에 없는 IP 주소 지원 도메인에 대한 후속 요청은 삭제됩니다.
예를 들어 FQDNNetworkPolicy
가 www.github.com
으로의 이그레스를 허용하는 경우 모든 도메인에 대한 DNS 요청이 허용되지만 twitter.com
을 지원하는 IP 주소로 전송되는 트래픽은 삭제됩니다.
TTL 만료
FQDNNetworkPolicy
는 DNS 레코드에서 제공한 TTL을 준수합니다. DNS 레코드의 TTL이 경과한 후 포드가 만료된 IP 주소에 연결을 시도하면 새 연결이 거부됩니다. DNS 레코드의 TTL을 초과하는 장기 지속 연결에서는 conntrack에서 연결이 활성 상태라고 간주하는 동안 트래픽 중단이 발생하지 않습니다.
FQDNNetworkPolicy와 NetworkPolicy
FQDNNetworkPolicy
및 NetworkPolicy
가 모두 동일한 포드에 적용되는 경우, 즉 포드의 라벨이 정책에 구성된 것과 일치하는 경우 이그레스 트래픽이 정책 중 하나와 일치하는 한 허용됩니다. IP 주소 또는 라벨 선택기를 지정하는 이그레스 NetworkPolicies
와 FQDNNetworkPolicies
사이에는 계층 구조가 없습니다.
공유 IP 주소 엔드포인트(부하 분산기, CDN, VPN 게이트웨이 등)
많은 도메인에는 이를 지원하는 전용 IP 주소가 없으며 대신 공유 IP 주소를 사용하여 노출됩니다. 이는 특히 애플리케이션이 부하 분산기 또는 CDN으로 제공될 때 일반적입니다. 예를 들어 Google Cloud API(compute.googleapis.com
, container.googleapis.com
등)에는 각 API에 대한 고유 IP 주소가 없습니다.
대신 모든 API는 공유 범위를 사용하여 노출됩니다.
FQDNNetworkPolicies
를 구성할 때는 허용된 도메인에 전용 IP 주소 또는 공유 IP 주소가 사용되는지 여부를 고려하는 것이 중요합니다. FQDNNetworkPolicies
는 IP 주소 및 포트 수준에서 적용되기 때문에 동일한 IP 주소로 제공되는 여러 도메인을 구분할 수 없습니다. 공유 IP 주소로 지원되는 도메인에 대한 액세스를 허용하면 포드가 해당 IP 주소로 제공되는 다른 모든 도메인과 통신할 수 있습니다. 예를 들어 compute.googleapis.com
에 대한 트래픽을 허용하면 포드가 다른 Google Cloud API와 통신할 수도 있습니다.
CNAME 추적
FQDNNetworkPolicy
의 FQDN 객체에 DNS 레코드에 CNAME가 있는 도메인이 포함된 경우 모든 잠재적인 별칭을 포함하여 포드에서 직접 쿼리할 수 있는 모든 도메인 이름으로 FQDNNetworkPolicy
을(를) 구성해야만 안정적인 FQDNNetworkPolicy
동작을 보장할 수 있습니다.
포드가 example.com
을 쿼리하면 example.com
을 규칙에 작성해야 합니다. 업스트림 DNS 서버에서 별칭 체인을 다시 가져오더라도(예: example.com
에서 example.cdn.com
, 1.2.3.4
로) FQDN 네트워크 정책은 트래픽을 계속 허용합니다.
알려진 문제
이 섹션에서는 정규화된 도메인 이름(FQDN)의 모든 알려진 문제를 보여줍니다.
protocol: ALL
을 지정해 정책 무시됨
이 알려진 문제는 GKE 버전 1.27.10-gke.1055000 이상 및 1.28.3-gke.1055000 이상에서 해결되었습니다.
ports
섹션에 protocol: ALL
을 지정하는 FQDNNetworkPolicy
를 만들면 GKE가 정책을 시행하지 않습니다. 이 문제는 정책 파싱 문제로 인해 발생합니다. TCP
또는 UDP
를 지정해도 이 문제가 발생하지 않습니다.
이에 대한 해결 방법으로 ports
항목에 protocol
을 지정하지 않으면 규칙이 기본적으로 모든 프로토콜을 찾습니다. protocol: ALL
을 삭제하면 파싱 문제가 우회되고 GKE가 FQDNNetworkPolicy
를 적용합니다.
GKE 버전 1.27.10-gke.1055000 이상 및 1.28.3-gke.1055000 이상에서는 protocol: ALL
이 포함된 정책이 올바르게 파싱되고 적용됩니다.
NetworkPolicy Logging으로 인해 잘못되었거나 누락된 로그
이 알려진 문제는 GKE 버전 1.27.10-gke.1055000 이상 및 1.28.2-gke.1157000 이상에서 해결되었습니다.
클러스터에서 네트워크 정책 로깅과 FQDN 네트워크 정책을 사용하는 경우 로그 항목이 누락되거나 잘못될 수 있는 버그가 있습니다.
위임 없이 네트워크 정책 로깅을 사용하면 워크로드에서 나가는 DNS 연결의 정책 로그에 트래픽이 삭제되었다고 잘못 보고됩니다.
트래픽 자체는 허용되었지만(FQDNNetworkPolicy
에 따라) 로그가 잘못되었습니다.
위임으로 네트워크 정책 로깅을 사용하면 정책 로그가 누락됩니다. 트래픽 자체는 영향을 받지 않습니다.
GKE 버전 1.27.10-gke.105500 이상 및 1.28.2-gke.1157000 이상에서 이 버그가 해결되었습니다. 이제 NetworkPolicy
또는 FQDNNetworkPolicy
에서 트래픽이 선택될 때 DNS 연결이 ALLOWED로 올바르게 로깅됩니다.