FQDN 네트워크 정책을 사용하여 포드 이그레스 트래픽 제어


이 페이지에서는 정규화된 도메인 이름(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를 실행하여 최신 버전을 가져옵니다.

요구사항 및 제한사항

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 대신 Kubernetes NetworkPolicyIPBlock 필드를 사용합니다.
  • resolv.conf의 대체 네임서버와 같은 클러스터가 아닌 DNS 네임서버에서 반환하는 결과는 GKE 데이터 영역의 허용 목록에 프로그래밍된 것으로 간주되지 않습니다.
  • FQDNNetworkPolicy가 변환할 수 있는 IPv4 및 IPv6 IP 주소의 최대 개수는 50개입니다.
  • GKE는 네트워크 정책 규칙을 평가하기 전에 서비스 가상 IP 주소(VIP)를 백엔드 포드 IP 주소로 변환하므로 ClusterIP 또는 Headless Service에 대한 트래픽을 FQDNNetworkPolicy의 이그레스 대상으로 사용할 수 없습니다. 대신 Kubernetes 라벨 기반 NetworkPolicy를 사용합니다.
  • 호스트 이름당 최대 IP 주소 할당량은 100개입니다.
  • 노드 간 투명한 암호화는 FQDN 네트워크 정책에서 지원되지 않습니다.

FQDN 네트워크 정책 사용 설정

새 클러스터 또는 기존 클러스터에서 FQDN 네트워크 정책을 사용 설정할 수 있습니다.

새 클러스터에서 FQDN 네트워크 정책 사용 설정

--enable-fqdn-network-policy 플래그를 사용하여 클러스터를 만듭니다.

gcloud container clusters create CLUSTER_NAME  \
    --enable-fqdn-network-policy

CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

기존 클러스터에서 FQDN 네트워크 정책 사용 설정

  1. Autopilot 및 Standard 클러스터 모두 --enable-fqdn-network-policy 플래그를 사용하여 클러스터를 업데이트합니다.

    gcloud container clusters update CLUSTER_NAME  \
        --enable-fqdn-network-policy
    

    CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

  2. 표준 클러스터의 경우에 GKE Dataplane V2 anetd DaemonSet를 다시 시작합니다.

    kubectl rollout restart ds -n kube-system anetd
    

FQDNNetworkPolicy 만들기

  1. 다음 매니페스트를 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 주소에 연결을 설정하려고 하면 이름 변환이 작동하지만 데이터 영역이 아웃바운드 연결을 차단합니다. 이 필드는 선택사항입니다.
  2. 네트워크 정책이 워크로드를 선택하는지 확인합니다.

    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_NAMEFQDNNetworkPolicy의 이름으로 바꿉니다.

GKE는 정책 시행에서 규칙을 삭제하지만 기존 연결은 conntrack 표준 프로토콜 가이드라인에 따라 종료될 때까지 활성 상태로 유지됩니다.

FQDN 네트워크 정책 작동 방법

FQDNNetworkPolicies는 선택한 포드가 트래픽을 전송할 수 있는 엔드포인트를 제어하는 이그레스 전용 정책입니다. Kubernetes NetworkPolicy와 비슷하게 워크로드를 선택하는 FQDNNetworkPolicy는 허용된 이그레스 대상으로 지정되지 않은 엔드포인트에 대해 암시적 거부 규칙을 만듭니다. FQDNNetworkPoliciesFQDNNetworkPolicy 및 NetworkPolicy에 설명된 대로 Kubernetes NetworkPolicies에 사용할 수 있습니다.

FQDNNetworkPolicies는 IP 주소 및 포트 수준에서 적용됩니다. 레이어 7 프로토콜 정보(예: HTTP 요청의 Request-URI)를 사용해서는 적용되지 않습니다. 지정된 도메인 이름은 GKE 클러스터의 DNS 제공업체에서 제공된 DNS 정보를 사용하여 IP 주소로 변환됩니다.

DNS 요청

워크로드를 선택하는 활성 FQDNNetworkPolicy는 DNS 요청을 수행하는 워크로드 기능에 영향을 주지 않습니다. nslookup 또는 dig과 같은 명령어는 정책의 영향을 받지 않고 모든 도메인에서 작동합니다. 그러나 허용 목록에 없는 IP 주소 지원 도메인에 대한 후속 요청은 삭제됩니다.

예를 들어 FQDNNetworkPolicywww.github.com으로의 이그레스를 허용하는 경우 모든 도메인에 대한 DNS 요청이 허용되지만 twitter.com을 지원하는 IP 주소로 전송되는 트래픽은 삭제됩니다.

TTL 만료

FQDNNetworkPolicy는 DNS 레코드에서 제공한 TTL을 준수합니다. DNS 레코드의 TTL이 경과한 후 포드가 만료된 IP 주소에 연결을 시도하면 새 연결이 거부됩니다. DNS 레코드의 TTL을 초과하는 장기 지속 연결에서는 conntrack에서 연결이 활성 상태라고 간주하는 동안 트래픽 중단이 발생하지 않습니다.

FQDNNetworkPolicy와 NetworkPolicy

FQDNNetworkPolicyNetworkPolicy가 모두 동일한 포드에 적용되는 경우, 즉 포드의 라벨이 정책에 구성된 것과 일치하는 경우 이그레스 트래픽이 정책 중 하나와 일치하는 한 허용됩니다. IP 주소 또는 라벨 선택기를 지정하는 이그레스 NetworkPoliciesFQDNNetworkPolicies 사이에는 계층 구조가 없습니다.

공유 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로 올바르게 로깅됩니다.

다음 단계