네트워크 정책

프로젝트 네임스페이스 수준에서 가상 머신 (VM) 워크로드의 네트워크 정책을 설정하려면 Google Distributed Cloud 에어 갭 (GDC)용 멀티 클러스터 네트워크 정책인 ProjectNetworkPolicy 리소스를 사용하세요. 이를 통해 프로젝트 내, 프로젝트 간, 외부 IP 주소와의 통신을 허용하는 정책을 정의할 수 있습니다.

프로젝트 내 트래픽의 경우 GDC는 사전 정의된 프로젝트 네트워크 정책인 intra-project policy를 기본적으로 각 프로젝트에 적용합니다. 동일한 조직 내의 프로젝트 간 트래픽을 사용 설정하고 제어하려면 프로젝트 간 정책을 정의합니다. 정책이 여러 개 있는 경우 GDC는 각 프로젝트의 규칙을 가산 방식으로 결합합니다. 규칙 중 하나 이상이 일치하는 경우 GDC는 트래픽도 허용합니다.

권한 및 액세스 요청

이 페이지에 나열된 작업을 수행하려면 프로젝트 NetworkPolicy 관리자 역할이 있어야 합니다. 프로젝트 IAM 관리자에게 VM이 있는 프로젝트의 네임스페이스에 프로젝트 NetworkPolicy 관리자 (project-networkpolicy-admin) 역할을 부여해 달라고 요청합니다.

프로젝트 내 트래픽

기본적으로 프로젝트 네임스페이스의 VM 워크로드는 VM이 동일한 프로젝트 내의 서로 다른 클러스터에 속하더라도 외부 세계에 서비스를 노출하지 않고 서로 통신할 수 있습니다.

인그레스 프로젝트 내 트래픽 네트워크 정책

프로젝트를 만들면 프로젝트 내 통신을 허용하기 위해 Management API 서버에 기본 기본 ProjectNetworkPolicy가 생성됩니다. 이 정책은 동일한 프로젝트의 다른 워크로드에서 발생하는 인그레스 트래픽을 허용합니다. 삭제할 수 있지만, 이렇게 하면 프로젝트 내 통신과 컨테이너 워크로드 통신이 모두 거부되므로 주의해야 합니다.

이그레스 프로젝트 내 트래픽 네트워크 정책

기본적으로 출구에 관해 조치를 취할 필요가 없습니다. 이그레스 정책이 없으면 모든 트래픽이 허용되기 때문입니다. 하지만 단일 정책을 설정하면 정책에서 지정한 트래픽만 허용됩니다.

데이터 유출 방지를 사용 중지하고 외부 리소스에 대한 액세스를 방지하는 등 프로젝트에 이그레스 ProjectNetworkPolicy를 적용하는 경우 필수 정책을 사용하여 프로젝트 내 이그레스를 허용하세요.

kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
apiVersion: networking.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  namespace: PROJECT_1
  name: allow-intra-project-egress-traffic
spec:
  policyType: Egress

  ingress:
  - from:
    - projects:
        matchNames:
        - PROJECT_1
EOF

프로젝트 간 (조직 내) 트래픽

동일한 조직 내에 있지만 서로 다른 프로젝트 네임스페이스의 VM 워크로드는 교차 프로젝트 네트워크 정책을 적용하여 서로 통신할 수 있습니다.

인그레스 교차 프로젝트 트래픽 네트워크 정책

프로젝트 워크로드에서 다른 프로젝트의 다른 워크로드로부터의 연결을 허용하려면 다른 프로젝트 워크로드에서 데이터 전송을 허용하도록 인그레스 정책을 구성해야 합니다.

다음 정책을 사용하면 PROJECT_1 프로젝트의 워크로드가 PROJECT_2 프로젝트의 워크로드로부터의 연결과 동일한 흐름의 반환 트래픽을 허용할 수 있습니다. PROJECT_2 내의 소스에서 PROJECT_1의 VM에 액세스하려면 이 정책을 사용할 수도 있습니다. 다음 명령어를 실행하여 정책을 적용합니다.

kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
apiVersion: networking.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  namespace: PROJECT_1
  name: allow-ingress-traffic-from-PROJECT_2
spec:
  policyType: Ingress
  subject:
    subjectType: UserWorkload
  ingress:
  - from:
    - projects:
        matchNames:
        - PROJECT_2
EOF

위 명령어는 PROJECT_2PROJECT_1로 이동하는 것을 허용하지만 PROJECT_1에서 PROJECT_2로 시작된 연결은 허용하지 않습니다. 후자의 경우 PROJECT_2 프로젝트에 상호 정책이 필요합니다. 다음 명령어를 실행하여 상호 정책을 적용합니다.

kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
apiVersion: networking.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  namespace: PROJECT_2
  name: allow-ingress-traffic-from-PROJECT_1
spec:
  policyType: Ingress
  subject:
    subjectType: UserWorkload
  ingress:
  - from:
    - projects:
        matchNames:
        - PROJECT_1
EOF

이제 PROJECT_1PROJECT_2로 시작하거나 PROJECT_1PROJECT_2에서 시작하는 연결이 허용됩니다.

변수에 다음 정의를 사용합니다.

변수정의
MANAGEMENT_API_SERVER관리 API 서버 kubeconfig 경로입니다.
PROJECT_1예의 PROJECT_1에 해당하는 GDC 프로젝트의 이름입니다.
PROJECT_2예의 PROJECT_2에 해당하는 GDC 프로젝트의 이름입니다.

이그레스 교차 프로젝트 트래픽 네트워크 정책

한 프로젝트(PROJECT_1)의 워크로드가 다른 프로젝트(PROJECT_2)의 워크로드에서 연결을 허용하도록 인그레스 교차 프로젝트 트래픽 정책을 부여하면 동일한 흐름에 대한 반환 트래픽도 부여됩니다. 따라서 이그레스 교차 프로젝트 트래픽 네트워크 정책이 필요하지 않습니다.

조직 간 트래픽

VM 워크로드를 다른 조직에 있는 프로젝트 외부의 대상으로 연결하려면 명시적인 승인이 필요합니다. 이 승인은 GDC에서 기본적으로 사용 설정하고 프로젝트가 상주하는 조직 외부의 워크로드로 이그레스를 수행하지 못하도록 하는 데이터 유출 방지 때문입니다. 특정 이그레스 정책을 추가하고 데이터 유출을 사용 설정하는 방법은 이 섹션을 참고하세요.

인그레스 교차 조직 트래픽 네트워크 정책

여러 조직 간에 인그레스 트래픽을 허용하려면 조직 외부 클라이언트에서 프로젝트로의 트래픽을 허용하는 ProjectNetworkPolicy를 적용해야 합니다(예: SSH를 사용하여 VM에 연결).

답장 트래픽에는 상응하는 Egress 정책이 필요하지 않습니다. 반환 트래픽은 암시적으로 허용됩니다.

VM이 있는 조직 외부의 소스에서 PROJECT_1의 VM에 액세스하려면 다음 정책을 적용해야 합니다. 소스 IP 주소가 포함된 CIDR를 가져와서 사용해야 합니다. CIDRnetwork/len 표기법으로 되어 있어야 합니다. 예를 들어 192.0.2.0/21은 유효합니다.

  1. kubectl 예에 따라 인그레스 ProjectNetworkPolicy를 구성하고 적용합니다. PROJECT_1의 모든 사용자 워크로드에 정책을 적용합니다. 조직 외부에 있는 CIDR의 모든 호스트에 대한 인그레스 트래픽을 허용합니다.

  2. ProjectNetworkPolicy 구성을 적용합니다.

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT_1
      name: allow-external-traffic
    spec:
      policyType: Ingress
      subject:
        subjectType: UserWorkload
      ingress:
       - from:
         - ipBlock:
             cidr: CIDR
    EOF
    

이그레스 조직 간 트래픽 네트워크 정책

조직 외부 서비스로의 데이터 전송을 사용 설정하려면 프로젝트 네트워크 정책 ProjectNetworkPolicy를 맞춤설정하세요. 데이터 유출 방지가 기본적으로 사용 설정되어 있으므로 맞춤형 이그레스 ProjectNetworkPolicy의 상태 필드에 유효성 검사 오류가 표시되고 데이터 플레인에서 이를 무시합니다. 이 프로세스는 설계에 따라 진행됩니다.

보안 및 연결에 명시된 바와 같이, 특정 프로젝트의 데이터 유출을 허용하면 워크로드가 데이터를 전송할 수 있습니다. 데이터 아웃바운드 전송을 허용하는 트래픽은 프로젝트에 할당된 알려진 IP 주소를 사용하는 소스 네트워크 주소 변환 (NAT)입니다. 보안 및 연결에서는 프로젝트 네트워크 정책(ProjectNetworkPolicy) 시행에 관한 세부정보도 제공합니다.

답장 트래픽에는 해당 인그레스 정책이 필요하지 않습니다. 반환 트래픽은 암시적으로 허용됩니다.

맞춤 이그레스 정책을 사용 설정합니다.

  1. kubectl 예시에 따라 자체 맞춤 이그레스를 구성하고 적용합니다. ProjectNetworkPolicy PROJECT_1의 모든 사용자 워크로드에 정책을 적용합니다. 조직 외부에 있는 CIDR의 모든 호스트에 대한 이그레스 트래픽을 허용합니다. 첫 번째 시도에서는 의도된 필수 상태 오류가 발생합니다.

  2. ProjectNetworkPolicy 구성을 적용합니다.

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: networking.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT_1
      name: allow-egress-traffic-to-NAME
    spec:
      policyType: Egress
      subject:
        subjectType: UserWorkload
      egress:
       - to:
         - ipBlock:
             cidr: CIDR
    EOF
    
  3. 완료되면 상태에 유효성 검사 오류가 표시되는지 확인합니다.

  4. 관리자 사용자에게 데이터 유출 방지를 사용 중지하도록 요청합니다. 이렇게 하면 구성이 사용 설정되고 다른 모든 이그레스가 방지됩니다.

  5. 방금 만든 ProjectNetworkPolicy를 확인하고 유효성 검사 상태 필드의 오류가 사라지고 상태 ReadyTrue로 표시되어 정책이 적용되었는지 확인합니다.

    kubectl --kubeconfig MANAGEMENT_API_SERVER get projectnetworkpolicy
    allow-egress-traffic-to-NAME -n PROJECT_1 -o yaml
    

    다음 정의를 사용하여 변수를 바꿉니다.

    변수정의
    MANAGEMENT_API_SERVER관리 API 서버 kubeconfig 경로입니다.
    PROJECT_1GDC 프로젝트의 이름입니다.
    CIDR허용된 대상의 클래스 없는 도메인 간 라우팅(CIDR) 블록입니다.
    NAME대상과 연결된 이름입니다.

    이 정책을 적용하고 다른 이그레스 정책을 정의하지 않은 경우 PROJECT_1에 대한 다른 모든 이그레스 트래픽이 거부됩니다.