7.2. 네트워크 정책 생성

admin 역할이 있는 사용자는 네임스페이스에 대한 네트워크 정책을 생성할 수 있습니다.

7.2.1. NetworkPolicy 오브젝트 예

다음은 예제 NetworkPolicy 오브젝트에 대한 주석입니다.

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-27107 1
spec:
  podSelector: 2
    matchLabels:
      app: mongodb
  ingress:
  - from:
    - podSelector: 3
        matchLabels:
          app: app
    ports: 4
    - protocol: TCP
      port: 27017
1
NetworkPolicy 오브젝트의 이름입니다.
2
정책이 적용되는 Pod를 설명하는 선택기입니다. 정책 오브젝트는 NetworkPolicy 오브젝트를 정의하는 프로젝트에서 Pod만 선택할 수 있습니다.
3
정책 오브젝트가 수신 트래픽을 허용하는 Pod와 일치하는 선택기입니다. 선택기는 NetworkPolicy와 동일한 네임스페이스의 Pod와 일치합니다.
4
트래픽을 수락할 하나 이상의 대상 포트 목록입니다.

7.2.2. CLI를 사용하여 네트워크 정책 생성

클러스터의 네임스페이스에서 허용된 수신 또는 송신 네트워크 트래픽을 설명하는 세분화된 규칙을 정의하기 위해 네트워크 정책을 생성할 수 있습니다.

참고

cluster-admin 역할로 사용자로 로그인하는 경우 클러스터의 모든 네임스페이스에서 네트워크 정책을 생성할 수 있습니다.

사전 요구 사항

  • 클러스터는 mode: NetworkPolicy 로 설정된 OpenShift SDN 네트워크 공급자와 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다. 이 모드는 OpenShift SDN의 기본값입니다.
  • OpenShift CLI(oc)를 설치합니다.
  • admin 권한이 있는 사용자로 클러스터에 로그인합니다.
  • 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.

절차

  1. 다음과 같이 정책 규칙을 생성합니다.

    1. <policy_name>.yaml 파일을 생성합니다.

      $ touch <policy_name>.yaml

      다음과 같습니다.

      <policy_name>
      네트워크 정책 파일 이름을 지정합니다.
    2. 방금 만든 파일에서 다음 예와 같이 네트워크 정책을 정의합니다.

      모든 네임스페이스의 모든 Pod에서 수신 거부

      이는 다른 네트워크 정책 구성에서 허용하는 크로스 포드 트래픽 이외의 모든 크로스 포드 네트워킹을 차단하는 기본 정책입니다.

      kind: NetworkPolicy
      apiVersion: networking.k8s.io/v1
      metadata:
        name: deny-by-default
      spec:
        podSelector:
        ingress: []

      동일한 네임 스페이스에 있는 모든 Pod의 수신 허용

      kind: NetworkPolicy
      apiVersion: networking.k8s.io/v1
      metadata:
        name: allow-same-namespace
      spec:
        podSelector:
        ingress:
        - from:
          - podSelector: {}

      특정 네임스페이스에서 하나의 Pod로 들어오는 트래픽 허용

      이 정책을 사용하면 namespace-y 에서 실행되는 Pod의 pod-a 레이블이 지정된 Pod로의 트래픽을 수행할 수 있습니다.

      kind: NetworkPolicy
      apiVersion: networking.k8s.io/v1
      metadata:
        name: allow-traffic-pod
      spec:
        podSelector:
         matchLabels:
            pod: pod-a
        policyTypes:
        - Ingress
        ingress:
        - from:
          - namespaceSelector:
              matchLabels:
                 kubernetes.io/metadata.name: namespace-y
  2. 다음 명령을 실행하여 네트워크 정책 오브젝트를 생성합니다.

    $ oc apply -f <policy_name>.yaml -n <namespace>

    다음과 같습니다.

    <policy_name>
    네트워크 정책 파일 이름을 지정합니다.
    <namespace>
    선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.

    출력 예

    networkpolicy.networking.k8s.io/deny-by-default created

참고

cluster-admin 권한을 사용하여 웹 콘솔에 로그인하는 경우 YAML 또는 웹 콘솔의 양식에서 클러스터의 모든 네임스페이스에서 네트워크 정책을 생성할 수 있습니다.

7.2.3. 기본 거부 모든 네트워크 정책 생성

이는 배포된 다른 네트워크 정책 구성에서 허용하는 네트워크 트래픽 이외의 모든 크로스-Pod 네트워킹을 차단하는 기본 정책입니다. 이 절차에서는 기본 거부 정책을 적용합니다.

참고

cluster-admin 역할로 사용자로 로그인하는 경우 클러스터의 모든 네임스페이스에서 네트워크 정책을 생성할 수 있습니다.

사전 요구 사항

  • 클러스터는 mode: NetworkPolicy 로 설정된 OpenShift SDN 네트워크 공급자와 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다. 이 모드는 OpenShift SDN의 기본값입니다.
  • OpenShift CLI(oc)를 설치합니다.
  • admin 권한이 있는 사용자로 클러스터에 로그인합니다.
  • 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.

절차

  1. 모든 네임스페이스의 모든 Pod에서 수신을 거부하는 거부-별-기본 정책을 정의하는 다음 YAML을 생성합니다. YAML을 deny-by-default.yaml 파일에 저장합니다.

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: deny-by-default
      namespace: default 1
    spec:
      podSelector: {} 2
      ingress: [] 3
    1
    namespace: default 는 이 정책을 default 네임스페이스에 배포합니다.
    2
    podSelector: 비어 있습니다. 즉, 모든 Pod와 일치합니다. 따라서 이 정책은 default 네임스페이스의 모든 Pod에 적용됩니다.
    3
    Ingress 규칙이 지정되지 않았습니다. 이로 인해 들어오는 트래픽이 모든 Pod로 삭제됩니다.
  2. 다음 명령을 입력하여 정책을 적용합니다.

    $ oc apply -f deny-by-default.yaml

    출력 예

    networkpolicy.networking.k8s.io/deny-by-default created

7.2.4. 외부 클라이언트의 트래픽을 허용하는 네트워크 정책 생성

deny-by-default 정책을 사용하여 외부 클라이언트에서 라벨이 app=web 인 Pod로의 트래픽을 허용하는 정책을 구성할 수 있습니다.

참고

cluster-admin 역할로 사용자로 로그인하는 경우 클러스터의 모든 네임스페이스에서 네트워크 정책을 생성할 수 있습니다.

다음 절차에 따라 공용 인터넷의 외부 서비스를 직접 또는 로드 밸런서를 사용하여 Pod에 액세스할 수 있는 정책을 구성합니다. 트래픽은 app=web 레이블이 있는 Pod에만 허용됩니다.

사전 요구 사항

  • 클러스터는 mode: NetworkPolicy 로 설정된 OpenShift SDN 네트워크 공급자와 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다. 이 모드는 OpenShift SDN의 기본값입니다.
  • OpenShift CLI(oc)를 설치합니다.
  • admin 권한이 있는 사용자로 클러스터에 로그인합니다.
  • 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.

절차

  1. 공용 인터넷의 트래픽을 직접 또는 로드 밸런서를 사용하여 Pod에 액세스할 수 있는 정책을 생성합니다. web-allow-external.yaml 파일에 YAML을 저장합니다.

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: web-allow-external
      namespace: default
    spec:
      policyTypes:
      - Ingress
      podSelector:
        matchLabels:
          app: web
      ingress:
        - {}
  2. 다음 명령을 입력하여 정책을 적용합니다.

    $ oc apply -f web-allow-external.yaml

    출력 예

    networkpolicy.networking.k8s.io/web-allow-external created

이 정책은 다음 다이어그램에 설명된 외부 트래픽을 포함하여 모든 리소스의 트래픽을 허용합니다.

외부 클라이언트의 트래픽 허용

7.2.5. 모든 네임스페이스에서 애플리케이션으로의 트래픽을 허용하는 네트워크 정책 생성

참고

cluster-admin 역할로 사용자로 로그인하는 경우 클러스터의 모든 네임스페이스에서 네트워크 정책을 생성할 수 있습니다.

다음 절차에 따라 모든 네임스페이스의 모든 Pod에서 특정 애플리케이션으로의 트래픽을 허용하는 정책을 구성합니다.

사전 요구 사항

  • 클러스터는 mode: NetworkPolicy 로 설정된 OpenShift SDN 네트워크 공급자와 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다. 이 모드는 OpenShift SDN의 기본값입니다.
  • OpenShift CLI(oc)를 설치합니다.
  • admin 권한이 있는 사용자로 클러스터에 로그인합니다.
  • 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.

절차

  1. 모든 네임스페이스의 모든 Pod에서 특정 애플리케이션으로의 트래픽을 허용하는 정책을 생성합니다. YAML을 web-allow-all-namespaces.yaml 파일에 저장합니다.

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: web-allow-all-namespaces
      namespace: default
    spec:
      podSelector:
        matchLabels:
          app: web 1
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector: {} 2
    1
    정책을 기본 네임스페이스의 app:web Pod에만 적용합니다.
    2
    모든 네임스페이스의 모든 Pod를 선택합니다.
    참고

    기본적으로 namespaceSelector 를 지정하지 않으면 정책이 네트워크 정책이 배포된 네임스페이스에서만 트래픽을 허용하는 네임스페이스를 선택하지 않습니다.

  2. 다음 명령을 입력하여 정책을 적용합니다.

    $ oc apply -f web-allow-all-namespaces.yaml

    출력 예

    networkpolicy.networking.k8s.io/web-allow-all-namespaces created

검증

  1. 다음 명령을 입력하여 default 네임스페이스에서 웹 서비스를 시작합니다.

    $ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
  2. 다음 명령을 실행하여 보조 네임스페이스에 alpine 이미지를 배포하고 쉘을 시작합니다.

    $ oc run test-$RANDOM --namespace=secondary --rm -i -t --image=alpine -- sh
  3. 쉘에서 다음 명령을 실행하고 요청이 허용되는지 확인합니다.

    # wget -qO- --timeout=2 http://web.default

    예상 출력

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body { width: 35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>

7.2.6. 네임스페이스에서 애플리케이션으로의 트래픽을 허용하는 네트워크 정책 생성

참고

cluster-admin 역할로 사용자로 로그인하는 경우 클러스터의 모든 네임스페이스에서 네트워크 정책을 생성할 수 있습니다.

다음 절차에 따라 특정 네임스페이스에서 app=web 레이블이 있는 Pod로의 트래픽을 허용하는 정책을 구성합니다. 다음 작업을 수행할 수 있습니다.

  • 프로덕션 워크로드가 배포된 네임스페이스로만 프로덕션 데이터베이스로 트래픽을 제한합니다.
  • 특정 네임스페이스에 배포된 모니터링 툴을 활성화하여 현재 네임스페이스에서 메트릭을 스크랩할 수 있습니다.

사전 요구 사항

  • 클러스터는 mode: NetworkPolicy 로 설정된 OpenShift SDN 네트워크 공급자와 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다. 이 모드는 OpenShift SDN의 기본값입니다.
  • OpenShift CLI(oc)를 설치합니다.
  • admin 권한이 있는 사용자로 클러스터에 로그인합니다.
  • 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.

절차

  1. purpose=production 레이블이 있는 특정 네임스페이스의 모든 Pod의 트래픽을 허용하는 정책을 생성합니다. YAML을 web-allow-prod.yaml 파일에 저장합니다.

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: web-allow-prod
      namespace: default
    spec:
      podSelector:
        matchLabels:
          app: web 1
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              purpose: production 2
    1
    정책을 default 네임스페이스의 app:web Pod에만 적용합니다.
    2
    purpose=production 레이블이 있는 네임스페이스의 Pod로만 트래픽을 제한합니다.
  2. 다음 명령을 입력하여 정책을 적용합니다.

    $ oc apply -f web-allow-prod.yaml

    출력 예

    networkpolicy.networking.k8s.io/web-allow-prod created

검증

  1. 다음 명령을 입력하여 default 네임스페이스에서 웹 서비스를 시작합니다.

    $ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
  2. 다음 명령을 실행하여 prod 네임스페이스를 생성합니다.

    $ oc create namespace prod
  3. 다음 명령을 실행하여 prod 네임스페이스에 레이블을 지정합니다.

    $ oc label namespace/prod purpose=production
  4. 다음 명령을 실행하여 dev 네임스페이스를 생성합니다.

    $ oc create namespace dev
  5. 다음 명령을 실행하여 dev 네임스페이스에 레이블을 지정합니다.

    $ oc label namespace/dev purpose=testing
  6. 다음 명령을 실행하여 dev 네임스페이스에 alpine 이미지를 배포하고 쉘을 시작합니다.

    $ oc run test-$RANDOM --namespace=dev --rm -i -t --image=alpine -- sh
  7. 쉘에서 다음 명령을 실행하고 요청이 차단되었는지 확인합니다.

    # wget -qO- --timeout=2 http://web.default

    예상 출력

    wget: download timed out

  8. 다음 명령을 실행하여 prod 네임스페이스에 alpine 이미지를 배포하고 쉘을 시작합니다.

    $ oc run test-$RANDOM --namespace=prod --rm -i -t --image=alpine -- sh
  9. 쉘에서 다음 명령을 실행하고 요청이 허용되는지 확인합니다.

    # wget -qO- --timeout=2 http://web.default

    예상 출력

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body { width: 35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>

7.2.7. OpenShift Cluster Manager를 사용하여 네트워크 정책 생성

클러스터의 네임스페이스에서 허용된 수신 또는 송신 네트워크 트래픽을 설명하는 세분화된 규칙을 정의하기 위해 네트워크 정책을 생성할 수 있습니다.

사전 요구 사항

  • OpenShift Cluster Manager Hybrid Cloud Console 에 로그인했습니다.
  • AWS 클러스터에서 Red Hat OpenShift Service를 생성하셨습니다.
  • 클러스터의 ID 공급자를 구성했습니다.
  • 구성된 ID 공급자에 사용자 계정을 추가했습니다.
  • Red Hat OpenShift Service on AWS 클러스터 내에 프로젝트를 생성하셨습니다.

절차

  1. OpenShift Cluster Manager Hybrid Cloud Console 에서 액세스할 클러스터를 클릭합니다.
  2. 콘솔 열기 를 클릭하여 OpenShift 웹 콘솔로 이동합니다.
  3. ID 공급자를 클릭하고 클러스터에 로그인할 수 있는 인증 정보를 제공합니다.
  4. 관리자 관점에서 Networking 아래에서 NetworkPolicies 를 클릭합니다.
  5. NetworkPolicy 생성을 클릭합니다.
  6. 정책 이름 필드에 정책 이름을 제공합니다.
  7. 선택 사항: 이 정책이 하나 이상의 특정 Pod에만 적용되는 경우 특정 Pod에 대한 라벨 및 선택기를 제공할 수 있습니다. 특정 Pod를 선택하지 않으면 이 정책은 클러스터의 모든 Pod에 적용됩니다.
  8. 선택 사항: 모든 수신 트래픽 거부 또는 모든 송신 트래픽 거부 확인란을 사용하여 모든 수신 및 송신 트래픽 차단할 수 있습니다.
  9. 또한 수신 및 송신 규칙의 조합을 추가하여 승인하려는 포트, 네임스페이스 또는 IP 블록을 지정할 수 있습니다.
  10. 정책에 수신 규칙을 추가합니다.

    1. 수신 규칙 추가 를 선택하여 새 규칙을 구성합니다. 이 작업에서는 인바운드 트래픽을 제한하는 방법을 지정할 수 있는 Add allowed source 드롭다운 메뉴를 사용하여 새 Ingress 규칙 행을 생성합니다. 드롭다운 메뉴에는 인그레스 트래픽을 제한하는 세 가지 옵션이 있습니다.

      • 동일한 네임스페이스의 Pod가 동일한 네임스페이스 내의 Pod로 트래픽을 제한하도록 허용합니다. 네임스페이스에서 Pod를 지정할 수 있지만 이 옵션을 비워 두면 네임스페이스의 Pod의 모든 트래픽이 허용됩니다.
      • 클러스터 내부의 포드가 정책과 동일한 클러스터 내의 pod로 트래픽을 제한하도록 허용합니다. 인바운드 트래픽을 허용하려는 네임스페이스 및 Pod를 지정할 수 있습니다. 이 옵션을 비워 두면 이 클러스터 내의 모든 네임스페이스 및 Pod의 인바운드 트래픽이 허용됩니다.
      • allow peer by IP 블록에서 는 지정된 CIDR(Classless Inter-Domain Routing) IP 블록의 트래픽을 제한합니다. 예외 옵션으로 특정 IP를 차단할 수 있습니다. CIDR 필드를 비워 두면 모든 외부 소스의 인바운드 트래픽이 모두 허용됩니다.
    2. 모든 인바운드 트래픽을 포트로 제한할 수 있습니다. 포트를 추가하지 않으면 모든 포트에 트래픽에 액세스할 수 있습니다.
  11. 네트워크 정책에 송신 규칙을 추가합니다.

    1. 송신 규칙 추가 를 선택하여 새 규칙을 구성합니다. 이 작업은 Add allowed destination"* 드롭다운 메뉴로 새 Egress 규칙 행을 생성하여 아웃바운드 트래픽을 제한하는 방법을 지정할 수 있습니다. 드롭다운 메뉴에서는 송신 트래픽을 제한하는 세 가지 옵션을 제공합니다.

      • 동일한 네임스페이스의 Pod는 동일한 네임스페이스 내의 Pod로 아웃바운드 트래픽을 제한합니다. 네임스페이스에서 Pod를 지정할 수 있지만 이 옵션을 비워 두면 네임스페이스의 Pod의 모든 트래픽이 허용됩니다.
      • 클러스터 내부의 포드가 정책과 동일한 클러스터 내의 pod로 트래픽을 제한하도록 허용합니다. 아웃바운드 트래픽을 허용하려는 네임스페이스 및 Pod를 지정할 수 있습니다. 이 옵션을 비워 두면 이 클러스터 내의 모든 네임스페이스 및 Pod의 아웃바운드 트래픽이 허용됩니다.
      • IP 블록별 피어 를 허용하면 지정된 CIDR IP 블록의 트래픽을 제한합니다. 예외 옵션으로 특정 IP를 차단할 수 있습니다. CIDR 필드를 비워 두면 모든 외부 소스의 아웃바운드 트래픽이 모두 허용됩니다.
    2. 모든 아웃바운드 트래픽을 포트로 제한할 수 있습니다. 포트를 추가하지 않으면 모든 포트에 트래픽에 액세스할 수 있습니다.