프로젝트 내 네트워크 정책 만들기

이 페이지에서는 Google Distributed Cloud (GDC) 에어 갭에서 프로젝트 내 트래픽 네트워크 정책을 구성하는 방법을 설명합니다.

프로젝트 네트워크 정책은 인그레스 또는 이그레스 규칙을 정의합니다. 프로젝트 내, 프로젝트 간, 외부 IP 주소와의 통신을 허용하는 정책을 정의할 수 있습니다.

기본적으로 이러한 정책은 모든 영역에 전역적으로 적용됩니다. GDC 유니버스의 전역 리소스에 대한 자세한 내용은 멀티 영역 개요를 참고하세요.

단일 영역 내에서 프로젝트 내 트래픽 시행이 필요한 경우 단일 영역 워크로드 수준 프로젝트 내 정책 만들기를 참고하세요.

시작하기 전에

프로젝트 내 트래픽 네트워크 정책을 구성하려면 다음이 필요합니다.

  • 필요한 ID 및 액세스 역할입니다. 특정 프로젝트의 정책을 관리하려면 project-networkpolicy-admin 역할이 필요합니다. 모든 영역에 걸쳐 있는 정책을 관리해야 하는 멀티 영역 환경의 경우 global-project-networkpolicy-admin 역할이 필요합니다. 자세한 내용은 사전 정의된 역할 및 액세스 준비를 참고하세요.
  • 기존 프로젝트 자세한 내용은 프로젝트 만들기를 참조하세요.

프로젝트 내 정책 만들기

프로젝트 내 트래픽의 경우 GDC는 사전 정의된 프로젝트 네트워크 정책인 프로젝트 내 정책을 각 프로젝트에 기본적으로 적용합니다. 기본적으로 프로젝트 네임스페이스의 워크로드는 외부 리소스에 아무것도 노출하지 않고 서로 통신할 수 있습니다.

기본적으로 이그레스 정책이 없으므로 모든 프로젝트 내 트래픽에 대해 아웃바운드 트래픽이 허용됩니다. 하지만 단일 이그레스 정책을 설정하면 정책에서 지정한 트래픽만 허용됩니다.

인그레스 프로젝트 내 정책 만들기

프로젝트를 만들면 프로젝트 내 통신을 허용하는 기본 기본 ProjectNetworkPolicy 리소스가 암시적으로 생성됩니다. 이 정책은 동일한 프로젝트의 다른 워크로드로부터의 인바운드 트래픽을 허용합니다.

기본 정책을 삭제할 수 있지만 이렇게 하면 프로젝트 내의 모든 서비스와 워크로드에 대한 프로젝트 내 통신이 거부됩니다. 정책을 삭제하려면 kubectl delete 명령어를 사용합니다.

kubectl --kubeconfig GLOBAL_API_SERVER delete pnp base-policy-allow-intra-project-traffic -n PROJECT

다음 매니페스트를 적용하여 기본 정책을 다시 추가할 수 있습니다.

kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
apiVersion: networking.global.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  namespace: PROJECT
  name: base-policy-allow-intra-project-traffic
spec:
  policyType: Ingress
  ingress:
  - from:
    - projectSelector:
        projects:
          matchNames:
          - PROJECT
EOF

다음을 바꿉니다.

  • GLOBAL_API_SERVER: 전역 API 서버의 kubeconfig 경로입니다. 자세한 내용은 전역 및 영역별 API 서버를 참고하세요. API 서버의 kubeconfig 파일을 아직 생성하지 않은 경우 로그인에서 자세한 내용을 확인하세요.
  • PROJECT: 프로젝트의 이름

이그레스 프로젝트 내 정책 만들기

데이터 무단 반출 방지를 사용 중지하고 외부 리소스에 대한 액세스를 방지하는 등 ProjectNetworkPolicy 이그레스 정책을 프로젝트에 적용하는 경우 다음 필수 정책을 사용하여 프로젝트 내 아웃바운드 트래픽을 허용하세요.

kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
apiVersion: networking.global.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
  namespace: PROJECT
  name: allow-intra-project-outbound-traffic
spec:
  policyType: Egress
  egress:
  - to:
    - projectSelector:
        projects:
          matchNames:
          - PROJECT
EOF

다음을 바꿉니다.

  • GLOBAL_API_SERVER: 전역 API 서버의 kubeconfig 경로입니다. 자세한 내용은 전역 및 영역별 API 서버를 참고하세요. API 서버의 kubeconfig 파일을 아직 생성하지 않은 경우 로그인에서 자세한 내용을 확인하세요.
  • PROJECT: 프로젝트의 이름

워크로드 수준 프로젝트 내 정책 만들기

워크로드 수준 네트워크 정책은 프로젝트 내 개별 워크로드 간 통신을 세부적으로 제어할 수 있습니다. 이 세부적인 제어를 통해 네트워크 액세스를 더 엄격하게 제어하여 보안과 리소스 사용을 개선할 수 있습니다.

인그레스 워크로드 수준 프로젝트 내 정책 만들기

프로젝트를 만들면 모든 워크로드 간의 프로젝트 내 통신을 허용하는 기본 기본 ProjectNetworkPolicy 리소스가 암시적으로 생성됩니다. 이 정책은 동일한 프로젝트의 다른 워크로드로부터의 인바운드 트래픽을 허용합니다.

수신 워크로드 수준 프로젝트 내 정책을 만들려면 먼저 기본 기본 정책을 삭제해야 합니다. 그렇지 않으면 예기치 않은 동작이 발생할 수 있습니다.

  1. 기본 기본 정책을 삭제하려면 다음 명령어를 실행합니다.

    kubectl --kubeconfig GLOBAL_API_SERVER delete pnp base-policy-allow-intra-project-traffic -n PROJECT
    
  2. 인그레스 워크로드 수준 프로젝트 내 정책을 만들려면 다음 커스텀 리소스를 만들고 적용하세요.

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT
      name: allow-intra-project-inbound-traffic-from-target-to-subject
    spec:
      policyType: Ingress
      subject:
        subjectType: UserWorkload
        workloadSelector:
          matchLabels:
            SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      ingress:
      - from:
        - projectSelector:
            projects:
              matchNames:
              - PROJECT
            workloads:
              matchLabels:
                TARGET_LABEL_KEY: TARGET_LABEL_VALUE
    EOF
    

    다음을 바꿉니다.

    • GLOBAL_API_SERVER: 전역 API 서버의 kubeconfig 경로입니다. 자세한 내용은 전역 및 영역별 API 서버를 참고하세요. API 서버의 kubeconfig 파일을 아직 생성하지 않은 경우 로그인에서 자세한 내용을 확인하세요.
    • PROJECT: 프로젝트의 이름
    • SUBJECT_LABEL_KEY: 소스 워크로드를 선택하는 데 사용되는 라벨의 키입니다. 예를 들면 app, tier, role입니다.
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY와 연결된 값입니다. 허용된 트래픽의 소스인 워크로드를 지정합니다. 예를 들어 SUBJECT_LABEL_KEYapp이고 SUBJECT_LABEL_VALUEbackend이면 라벨이 app: backend인 워크로드가 트래픽 소스입니다.
    • TARGET_LABEL_KEY: 대상 워크로드를 선택하는 데 사용되는 라벨의 키입니다.
    • TARGET_LABEL_VALUE: TARGET_LABEL_KEY와 연결된 값입니다. 허용된 트래픽의 대상이 되는 워크로드를 지정합니다.

이그레스 워크로드 수준 프로젝트 내 정책 만들기

  • 이그레스 워크로드 수준 프로젝트 내 정책을 만들려면 다음 커스텀 리소스를 만들고 적용하세요.

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT
      name: allow-intra-project-outbound-traffic-to-subject-from-target
    spec:
      policyType: Egress
      subject:
        subjectType: UserWorkload
        workloadSelector:
          matchLabels:
            SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      egress:
      - to:
        - projectSelector:
            projects:
              matchNames:
              - PROJECT
            workloads:
              matchLabels:
                TARGET_LABEL_KEY: TARGET_LABEL_VALUE
    EOF
    

    다음을 바꿉니다.

    • GLOBAL_API_SERVER: 전역 API 서버의 kubeconfig 경로입니다. 자세한 내용은 전역 및 영역별 API 서버를 참고하세요. API 서버의 kubeconfig 파일을 아직 생성하지 않은 경우 로그인에서 자세한 내용을 확인하세요.
    • PROJECT: 프로젝트의 이름
    • SUBJECT_LABEL_KEY: 소스 워크로드를 선택하는 데 사용되는 라벨의 키입니다. 예를 들면 app, tier, role입니다.
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY와 연결된 값입니다. 허용된 트래픽의 소스인 워크로드를 지정합니다. 예를 들어 SUBJECT_LABEL_KEYapp이고 SUBJECT_LABEL_VALUEbackend이면 라벨이 app: backend인 워크로드가 트래픽 소스입니다.
    • TARGET_LABEL_KEY: 대상 워크로드를 선택하는 데 사용되는 라벨의 키입니다.
    • TARGET_LABEL_VALUE: TARGET_LABEL_KEY와 연결된 값입니다. 허용된 트래픽의 대상이 되는 워크로드를 지정합니다.

단일 영역 워크로드 수준 프로젝트 내 정책 만들기

워크로드 수준 네트워크 정책은 단일 영역에서 PNP를 적용할 수 있습니다. 단일 영역 내의 워크로드에 특정 라벨을 추가하여 해당 영역의 프로젝트 내 또는 여러 프로젝트 간 개별 워크로드 간 통신을 제어할 수 있습니다.

단일 영역 인그레스 워크로드 수준 프로젝트 내 정책 만들기

프로젝트를 만들면 모든 워크로드 간의 프로젝트 내 통신을 허용하는 기본 기본 ProjectNetworkPolicy 리소스가 암시적으로 생성됩니다. 이 정책은 동일한 프로젝트의 다른 워크로드로부터의 인바운드 트래픽을 허용합니다.

단일 영역 인그레스 워크로드 수준 프로젝트 내 정책을 만들려면 먼저 기본 기본 정책을 삭제해야 합니다. 그렇지 않으면 예기치 않은 동작이 발생할 수 있습니다.

  1. 기본 기본 정책을 삭제하려면 다음 명령어를 실행합니다.

    kubectl --kubeconfig GLOBAL_API_SERVER delete pnp base-policy-allow-intra-project-traffic -n PROJECT
    
  2. 단일 영역 인그레스 워크로드 수준 프로젝트 내 트래픽 네트워크 정책을 만들려면 다음 커스텀 리소스를 만들어 적용하세요.

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT
      name: allow-single-zone-intra-project-inbound-traffic-from-target-to-subject
    spec:
      policyType: Ingress
      subject:
        subjectType: UserWorkload
        workloadSelector:
          matchLabels:
            SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
            ZONE_SUBJECT_LABEL_KEY: ZONE_SUBJECT_LABEL_VALUE
      ingress:
      - from:
        - projectSelector:
            projects:
              matchNames:
              - PROJECT
            workloads:
              matchLabels:
                TARGET_LABEL_KEY: TARGET_LABEL_VALUE
                ZONE_TARGET_LABEL_KEY: ZONE_TARGET_LABEL_VALUE
    EOF
    

    다음을 바꿉니다.

    • GLOBAL_API_SERVER: 전역 API 서버의 kubeconfig 경로입니다. 자세한 내용은 전역 및 영역별 API 서버를 참고하세요. API 서버의 kubeconfig 파일을 아직 생성하지 않은 경우 로그인에서 자세한 내용을 확인하세요.
    • PROJECT: 프로젝트의 이름
    • SUBJECT_LABEL_KEY: 소스 워크로드를 선택하는 데 사용되는 라벨의 키입니다. 예를 들면 app, tier, role입니다.
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY와 연결된 값입니다. 허용된 트래픽의 소스인 워크로드를 지정합니다. 예를 들어 SUBJECT_LABEL_KEYapp이고 SUBJECT_LABEL_VALUEbackend이면 라벨이 app: backend인 워크로드가 트래픽 소스입니다.
    • TARGET_LABEL_KEY: 대상 워크로드를 선택하는 데 사용되는 라벨의 키입니다.
    • TARGET_LABEL_VALUE: TARGET_LABEL_KEY와 연결된 값입니다. 허용된 트래픽의 대상이 되는 워크로드를 지정합니다.
    • ZONE_SUBJECT_LABEL_KEY: 소스 영역을 선택하는 데 사용되는 라벨의 키입니다. 예를 들면 zone 또는 region입니다.
    • ZONE_SUBJECT_LABEL_VALUE: ZONE_SUBJECT_LABEL_KEY와 연결된 값입니다. 허용된 트래픽의 소스 영역을 지정합니다. 예를 들어 ZONE_SUBJECT_LABEL_KEYzone이고 ZONE_SUBJECT_LABEL_VALUEus-central1-a이면 라벨이 zone: us-central1-a인 워크로드가 트래픽 소스입니다.
    • ZONE_TARGET_LABEL_KEY: 대상 영역을 선택하는 데 사용되는 라벨의 키입니다.
    • ZONE_TARGET_LABEL_VALUE: ZONE_TARGET_LABEL_KEY와 연결된 값입니다. 허용된 트래픽의 대상이 되는 영역을 지정합니다.

단일 영역 이그레스 워크로드 수준 프로젝트 내 정책 만들기

  • 단일 영역 이그레스 워크로드 수준 프로젝트 내 정책을 만들려면 다음 커스텀 리소스를 만들고 적용하세요.

    kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF
    apiVersion: networking.global.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      namespace: PROJECT
      name: allow-single-zone-intra-project-outbound-traffic-to-subject-from-target
    spec:
      policyType: Egress
      subject:
        subjectType: UserWorkload
        workloadSelector:
          matchLabels:
            SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
            ZONE_SUBJECT_LABEL_KEY: ZONE_SUBJECT_LABEL_VALUE
      egress:
      - to:
        - projectSelector:
            projects:
              matchNames:
              - PROJECT
            workloads:
              matchLabels:
                TARGET_LABEL_KEY: TARGET_LABEL_VALUE
                ZONE_TARGET_LABEL_KEY: ZONE_TARGET_LABEL_VALUE
    EOF
    

    다음을 바꿉니다.

    • GLOBAL_API_SERVER: 전역 API 서버의 kubeconfig 경로입니다. 자세한 내용은 전역 및 영역별 API 서버를 참고하세요. API 서버의 kubeconfig 파일을 아직 생성하지 않은 경우 로그인에서 자세한 내용을 확인하세요.
    • PROJECT: 프로젝트의 이름
    • SUBJECT_LABEL_KEY: 소스 워크로드를 선택하는 데 사용되는 라벨의 키입니다. 예를 들면 app, tier, role입니다.
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY와 연결된 값입니다. 허용된 트래픽의 소스인 워크로드를 지정합니다. 예를 들어 SUBJECT_LABEL_KEYapp이고 SUBJECT_LABEL_VALUEbackend이면 라벨이 app: backend인 워크로드가 트래픽 소스입니다.
    • TARGET_LABEL_KEY: 대상 워크로드를 선택하는 데 사용되는 라벨의 키입니다.
    • TARGET_LABEL_VALUE: TARGET_LABEL_KEY와 연결된 값입니다. 허용된 트래픽의 대상이 되는 워크로드를 지정합니다.
    • ZONE_SUBJECT_LABEL_KEY: 소스 영역을 선택하는 데 사용되는 라벨의 키입니다. 예를 들면 zone 또는 region입니다.
    • ZONE_SUBJECT_LABEL_VALUE: ZONE_SUBJECT_LABEL_KEY와 연결된 값입니다. 허용된 트래픽의 소스 영역을 지정합니다. 예를 들어 ZONE_SUBJECT_LABEL_KEYzone이고 ZONE_SUBJECT_LABEL_VALUEus-central1-a이면 라벨이 zone: us-central1-a인 워크로드가 트래픽 소스입니다.
    • ZONE_TARGET_LABEL_KEY: 대상 영역을 선택하는 데 사용되는 라벨의 키입니다.
    • ZONE_TARGET_LABEL_VALUE: ZONE_TARGET_LABEL_KEY와 연결된 값입니다. 허용된 트래픽의 대상이 되는 영역을 지정합니다.