표준 클러스터용 Kubernetes 네트워크 정책 만들기

이 페이지에서는 Google Distributed Cloud (GDC) 오프라인에서 Kubernetes 네트워크 정책을 사용하여 표준 클러스터의 클러스터 내 트래픽을 구성하는 방법을 설명합니다.

Kubernetes NetworkPolicy은 포드 그룹이 서로 통신하고 다른 네트워크 엔드포인트와 통신하는 방법을 지정합니다. NetworkPolicy 리소스는 라벨을 사용하여 포드를 선택하고 선택한 포드에 허용되는 트래픽을 지정하는 규칙을 정의합니다. 이러한 정책은 로컬로 범위가 지정되며, 다른 표준 및 공유 클러스터의 엔드포인트와의 통신도 허용하는 allow-all 정책이 생성되지 않는 한 정의된 클러스터 내의 트래픽에만 적용됩니다.

시작하기 전에

Kubernetes 네트워크 정책을 구성하려면 관련 네임스페이스에서 NetworkPolicy 리소스를 생성, 수정, 삭제할 수 있는 클러스터 내 권한이 있어야 합니다.

클러스터 내 포드 간 정책 만들기

이러한 정책은 동일한 표준 클러스터 내의 포드 간 트래픽을 제어합니다.

클러스터 내 포드 간 인그레스 정책 만들기

  • 클러스터 내 포드 간 인그레스 트래픽을 허용하려면 다음 리소스를 만들어 적용합니다.

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-intra-cluster-ingress-traffic
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              Kubernetes.io/metadata.name: PEER_NAMESPACE
          podSelector:
            matchLabels:
              PEER_LABEL_KEY: PEER_LABEL_VALUE
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    다음을 바꿉니다.

    • CLUSTER_API_SERVER: 클러스터 API 서버의 kubeconfig 경로입니다. API 서버의 kubeconfig 파일을 아직 생성하지 않은 경우 로그인을 참고하세요.
    • SUBJECT_NAMESPACE: 표준 클러스터의 주제 네임스페이스입니다.
    • PEER_NAMESPACE: 표준 클러스터의 피어 네임스페이스입니다.
    • SUBJECT_LABEL_KEY: 주제 워크로드를 선택하는 데 사용되는 라벨의 키입니다. 예를 들면 app, tier, role입니다.
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY와 연결된 값입니다. 예를 들어 SUBJECT_LABEL_KEYapp이고 SUBJECT_LABEL_VALUEbackend이면 라벨이 app: backend인 워크로드가 트래픽을 수신합니다.
    • PEER_LABEL_KEY: 피어 워크로드를 선택하는 데 사용되는 라벨의 키입니다.
    • PEER_LABEL_VALUE: PEER_LABEL_KEY와 연결된 값입니다.
    • PORT: 트래픽이 허용되는 주제 워크로드의 포트입니다.

클러스터 내 포드 간 이그레스 정책 만들기

  • 클러스터 내 포드 간 트래픽을 허용하려면 다음 리소스를 만들고 적용하세요.

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-egress-intra-cluster-traffic
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Egress
      egress:
      - to:
        - namespaceSelector:
            matchLabels:
              Kubernetes.io/metadata.name: PEER_NAMESPACE
          podSelector:
            matchLabels:
              PEER_LABEL_KEY: PEER_LABEL_VALUE
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    다음을 바꿉니다.

    • CLUSTER_API_SERVER: 클러스터 API 서버의 kubeconfig 경로입니다. API 서버의 kubeconfig 파일을 아직 생성하지 않은 경우 로그인을 참고하세요.
    • SUBJECT_NAMESPACE: 표준 클러스터의 주제 네임스페이스입니다.
    • PEER_NAMESPACE: 표준 클러스터의 피어 네임스페이스입니다.
    • SUBJECT_LABEL_KEY: 주제 워크로드를 선택하는 데 사용되는 라벨의 키입니다. 예를 들면 app, tier, role입니다.
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY와 연결된 값입니다. 예를 들어 SUBJECT_LABEL_KEYapp이고 SUBJECT_LABEL_VALUEbackend이면 라벨 app: backend이 있는 워크로드가 트래픽을 전송합니다.
    • PEER_LABEL_KEY: 피어 워크로드를 선택하는 데 사용되는 라벨의 키입니다.
    • PEER_LABEL_VALUE: PEER_LABEL_KEY와 연결된 값입니다.
    • PORT: 트래픽이 허용되는 피어 워크로드의 포트입니다.

부하 분산기를 사용하여 클러스터 내 포드 간 정책 만들기

이러한 정책은 트래픽이 외부 부하 분산기를 통해 라우팅될 때 동일한 클러스터 내의 포드 간 트래픽을 제어합니다.

부하 분산기를 사용하여 클러스터 내 포드 간 인그레스 정책 만들기

  • 부하 분산기를 사용하여 클러스터 내 포드 간 인그레스 트래픽을 허용하려면 다음 리소스를 만들어 적용하세요.

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-intra-cluster-ingress-traffic-via-elb
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Ingress
      ingress:
      - from:
        - ipBlock:
            cidr: EGRESS_NAT_IP/32
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    다음을 바꿉니다.

    • CLUSTER_API_SERVER: 클러스터 API 서버의 kubeconfig 경로입니다. API 서버의 kubeconfig 파일을 아직 생성하지 않은 경우 로그인을 참고하세요.
    • SUBJECT_NAMESPACE: 표준 클러스터의 주제 네임스페이스입니다.
    • SUBJECT_LABEL_KEY: 주제 워크로드를 선택하는 데 사용되는 라벨의 키입니다. 예를 들면 app, tier, role입니다.
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY와 연결된 값입니다. 예를 들어 SUBJECT_LABEL_KEYapp이고 SUBJECT_LABEL_VALUEbackend이면 라벨이 app: backend인 워크로드가 트래픽을 수신합니다.
    • EGRESS_NAT_IP: 소스 포드의 이그레스 NAT IP입니다.
    • PORT: 트래픽이 허용되는 주제 워크로드의 포트입니다.

부하 분산기를 사용하여 클러스터 내 포드 간 이그레스 정책 만들기

  • 부하 분산기를 사용하여 클러스터 내 포드 간 아웃바운드 트래픽을 허용하려면 다음 리소스를 만들고 적용하세요.

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-intra-cluster-egress-traffic-via-elb
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Egress
      egress:
      - to:
        - ipBlock:
            cidr: ELB_EXTERNAL_IP/32
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    다음을 바꿉니다.

    • CLUSTER_API_SERVER: 클러스터 API 서버의 kubeconfig 경로입니다. API 서버의 kubeconfig 파일을 아직 생성하지 않은 경우 로그인을 참고하세요.
    • SUBJECT_NAMESPACE: 표준 클러스터의 주제 네임스페이스입니다.
    • SUBJECT_LABEL_KEY: 주제 워크로드를 선택하는 데 사용되는 라벨의 키입니다. 예를 들면 app, tier, role입니다.
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY와 연결된 값입니다. 예를 들어 SUBJECT_LABEL_KEYapp이고 SUBJECT_LABEL_VALUEbackend이면 라벨 app: backend이 있는 워크로드가 트래픽을 전송합니다.
    • ELB_EXTERNAL_IP: 부하 분산기의 외부 IP 주소입니다.
    • PORT: 트래픽이 허용되는 외부 엔드포인트의 포트입니다.

조직 외부 정책 만들기

이러한 정책은 표준 클러스터의 포드와 외부 엔드포인트 (클러스터 외부의 모든 IP 주소) 간의 트래픽을 제어합니다.

조직 외부 트래픽에 대한 인그레스 정책 만들기

  • 조직 외부 엔드포인트에서 인그레스 트래픽을 허용하려면 다음 리소스를 만들어 적용하세요.

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-ingress-from-organization-external-to-standard-cluster-pod
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Ingress
      ingress:
      - from:
        - ipBlock:
            cidr: EXTERNAL_CIDR
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    다음을 바꿉니다.

    • CLUSTER_API_SERVER: 클러스터 API 서버의 kubeconfig 경로입니다. API 서버의 kubeconfig 파일을 아직 생성하지 않은 경우 로그인을 참고하세요.
    • SUBJECT_NAMESPACE: 표준 클러스터의 주제 네임스페이스입니다.
    • SUBJECT_LABEL_KEY: 주제 워크로드를 선택하는 데 사용되는 라벨의 키입니다. 예를 들면 app, tier, role입니다.
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY와 연결된 값입니다. 예를 들어 SUBJECT_LABEL_KEYapp이고 SUBJECT_LABEL_VALUEbackend이면 라벨이 app: backend인 워크로드가 트래픽을 수신합니다.
    • EXTERNAL_CIDR: 외부 CIDR(예: 20.0.0.0/16)입니다.
    • PORT: 트래픽이 허용되는 주제 워크로드의 포트입니다.

조직 외부 트래픽에 대한 이그레스 정책 만들기

  • 조직 외부 엔드포인트로의 이그레스 트래픽을 허용하려면 다음 리소스를 만들어 적용하세요.

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-egress-from-standard-cluster-pod-to-organization-external
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector:
        matchLabels:
          SUBJECT_LABEL_KEY: SUBJECT_LABEL_VALUE
      policyTypes:
      - Egress
      egress:
      - to:
        - ipBlock:
            cidr: EXTERNAL_CIDR
        ports:
        - protocol: TCP
          port: PORT
    EOF
    

    다음을 바꿉니다.

    • CLUSTER_API_SERVER: 클러스터 API 서버의 kubeconfig 경로입니다. API 서버의 kubeconfig 파일을 아직 생성하지 않은 경우 로그인을 참고하세요.
    • SUBJECT_NAMESPACE: 표준 클러스터의 주제 네임스페이스입니다.
    • SUBJECT_LABEL_KEY: 주제 워크로드를 선택하는 데 사용되는 라벨의 키입니다. 예를 들면 app, tier, role입니다.
    • SUBJECT_LABEL_VALUE: SUBJECT_LABEL_KEY와 연결된 값입니다. 예를 들어 SUBJECT_LABEL_KEYapp이고 SUBJECT_LABEL_VALUEbackend이면 라벨 app: backend이 있는 워크로드가 트래픽을 전송합니다.
    • EXTERNAL_CIDR: 외부 CIDR(예: 20.0.0.0/16)입니다.
    • PORT: 트래픽이 허용되는 외부 엔드포인트의 포트입니다.

모두 허용 정책 만들기

다음 정책을 사용하여 모든 트래픽을 명시적으로 허용할 수 있습니다. 이를 통해 다른 표준 및 공유 클러스터의 엔드포인트와 통신할 수 있습니다.

인그레스 허용 정책 만들기

  • 모든 수신 트래픽을 허용하려면 다음 리소스를 만들어 적용하세요.

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-all-ingress-traffic
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector: {}
      policyTypes:
      - Ingress
      ingress:
      - {}
    EOF
    

    다음을 바꿉니다.

    • CLUSTER_API_SERVER: 클러스터 API 서버의 kubeconfig 경로입니다. API 서버의 kubeconfig 파일을 아직 생성하지 않은 경우 로그인을 참고하세요.
    • SUBJECT_NAMESPACE: 표준 클러스터의 주제 네임스페이스입니다.

이그레스 허용-모두 정책 만들기

  • 모든 아웃바운드 트래픽을 허용하려면 다음 리소스를 만들고 적용하세요.

    kubectl --kubeconfig CLUSTER_API_SERVER apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-all-egress-traffic
      namespace: SUBJECT_NAMESPACE
    spec:
      podSelector: {}
      policyTypes:
      - Egress
      egress:
      - {}
    EOF
    

    다음을 바꿉니다.

    • CLUSTER_API_SERVER: 클러스터 API 서버의 kubeconfig 경로입니다. API 서버의 kubeconfig 파일을 아직 생성하지 않은 경우 로그인을 참고하세요.
    • SUBJECT_NAMESPACE: 표준 클러스터의 주제 네임스페이스입니다.