23.4. 다중 네트워크 정책 구성
클러스터 관리자는 추가 네트워크에 대한 다중 네트워크를 구성할 수 있습니다. SR-IOV 및 macvlan 추가 네트워크에 대한 다중 네트워크 정책을 지정할 수 있습니다. macvlan 추가 네트워크가 완전히 지원됩니다. ipvlan과 같은 기타 유형의 추가 네트워크는 지원되지 않습니다.
SR-IOV 추가 네트워크에 대한 다중 네트워크 정책 구성은 기술 프리뷰 기능이며 커널 네트워크 인터페이스 카드(NIC)에서만 지원됩니다. DPDK(Data Plane Development Kit) 애플리케이션에서 SR-IOV가 지원되지 않습니다.
Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.
IPv6 네트워크에서 구성된 네트워크 정책은 무시됩니다.
23.4.1. 다중 네트워크 정책과 네트워크 정책의 차이점
MultiNetworkPolicy
API는 NetworkPolicy
API를 구현하지만 다음과 같은 몇 가지 중요한 차이점이 있습니다.
MultiNetworkPolicy
API를 사용해야 합니다.apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy
-
CLI를 사용하여 다중 네트워크 정책과 상호 작용할 때
multi-networkpolicy
리소스 이름을 사용해야 합니다. 예를 들어oc get multi-networkpolicy <name>
명령을 사용하여 다중 네트워크 정책 오브젝트를 볼 수 있습니다. 여기서<name>
은 다중 네트워크 정책의 이름입니다. macvlan 또는 SR-IOV 추가 네트워크를 정의하는 네트워크 연결 정의의 이름으로 주석을 지정해야 합니다.
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: annotations: k8s.v1.cni.cncf.io/policy-for: <network_name>
다음과 같습니다.
<network_name>
- 네트워크 연결 정의의 이름을 지정합니다.
23.4.2. 클러스터의 다중 네트워크 정책 활성화
클러스터 관리자는 클러스터에서 다중 네트워크 정책 지원을 활성화할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다.
프로세스
다음 YAML을 사용하여
multinetwork-enable-patch.yaml
파일을 생성합니다.apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster spec: useMultiNetworkPolicy: true
다중 네트워크 정책을 활성화하도록 클러스터를 구성합니다.
$ oc patch network.operator.openshift.io cluster --type=merge --patch-file=multinetwork-enable-patch.yaml
출력 예
network.operator.openshift.io/cluster patched
23.4.3. 다중 네트워크 정책 작업
클러스터 관리자는 다중 네트워크 정책을 생성, 편집, 보기 및 삭제할 수 있습니다.
23.4.3.1. 사전 요구 사항
- 클러스터에 대한 다중 네트워크 정책 지원을 활성화했습니다.
23.4.3.2. CLI를 사용하여 다중 네트워크 정책 생성
클러스터의 네임스페이스에서 허용된 수신 또는 송신 네트워크 트래픽을 설명하는 세분화된 규칙을 정의하기 위해 다중 네트워크 정책을 생성할 수 있습니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인 또는 OpenShift SDN 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다. 이 모드는 OpenShift SDN의 기본값입니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
다음과 같이 정책 규칙을 생성합니다.
<policy_name>.yaml
파일을 생성합니다.$ touch <policy_name>.yaml
다음과 같습니다.
<policy_name>
- 다중 네트워크 정책 파일 이름을 지정합니다.
방금 만든 파일에서 다음 예와 같이 다중 네트워크 정책을 정의합니다.
모든 네임스페이스의 모든 Pod에서 수신 거부
이는 다른 네트워크 정책 구성에서 허용하는 교차 포드 트래픽 이외의 모든 포드 간 네트워킹을 차단하는 기본 정책입니다.
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: deny-by-default annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: ingress: []
다음과 같습니다.
<network_name>
- 네트워크 연결 정의의 이름을 지정합니다.
동일한 네임 스페이스에 있는 모든 Pod의 수신 허용
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: allow-same-namespace annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: ingress: - from: - podSelector: {}
다음과 같습니다.
<network_name>
- 네트워크 연결 정의의 이름을 지정합니다.
특정 네임스페이스에서 하나의 Pod로 들어오는 트래픽 허용
이 정책을 사용하면
namespace-y
에서 실행되는 Pod의pod-a
레이블이 지정된 Pod로의 트래픽을 수행할 수 있습니다.apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: allow-traffic-pod annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: matchLabels: pod: pod-a policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: namespace-y
다음과 같습니다.
<network_name>
- 네트워크 연결 정의의 이름을 지정합니다.
서비스에 대한 트래픽 제한
이 정책을 적용하면
app=bookstore
및role=api
레이블이 모두 있는 모든 Pod는app=bookstore
라벨이 있는 Pod에서만 액세스할 수 있습니다. 이 예제에서 애플리케이션은 레이블app=bookstore
및role=api
로 표시된 REST API 서버일 수 있습니다.이 예제에서는 다음 사용 사례를 다룹니다.
- 서비스에 대한 트래픽을 사용해야 하는 다른 마이크로 서비스로만 제한합니다.
애플리케이션 사용만 허용하도록 데이터베이스에 대한 연결 제한.
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: api-allow annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: matchLabels: app: bookstore role: api ingress: - from: - podSelector: matchLabels: app: bookstore
다음과 같습니다.
<network_name>
- 네트워크 연결 정의의 이름을 지정합니다.
다음 명령을 실행하여 다중 네트워크 정책 오브젝트를 생성합니다.
$ oc apply -f <policy_name>.yaml -n <namespace>
다음과 같습니다.
<policy_name>
- 다중 네트워크 정책 파일 이름을 지정합니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
출력 예
multinetworkpolicy.k8s.cni.cncf.io/deny-by-default created
cluster-admin
권한으로 웹 콘솔에 로그인하면 클러스터의 모든 네임스페이스에서 YAML로 직접 또는 웹 콘솔의 양식에서 네트워크 정책을 생성할 수 있습니다.
23.4.3.3. 다중 네트워크 정책 편집
네임스페이스에서 다중 네트워크 정책을 편집할 수 있습니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인 또는 OpenShift SDN 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다. 이 모드는 OpenShift SDN의 기본값입니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
선택 사항: 네임스페이스의 다중 네트워크 정책 오브젝트를 나열하려면 다음 명령을 입력합니다.
$ oc get multi-networkpolicy
다음과 같습니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
다중 네트워크 정책 오브젝트를 편집합니다.
다중 네트워크 정책 정의를 파일에 저장한 경우 파일을 편집하고 필요한 사항을 변경한 후 다음 명령을 입력합니다.
$ oc apply -n <namespace> -f <policy_file>.yaml
다음과 같습니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
<policy_file>
- 네트워크 정책이 포함된 파일의 이름을 지정합니다.
다중 네트워크 정책 오브젝트를 직접 업데이트해야 하는 경우 다음 명령을 입력합니다.
$ oc edit multi-networkpolicy <policy_name> -n <namespace>
다음과 같습니다.
<policy_name>
- 네트워크 정책의 이름을 지정합니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
다중 네트워크 정책 오브젝트가 업데이트되었는지 확인합니다.
$ oc describe multi-networkpolicy <policy_name> -n <namespace>
다음과 같습니다.
<policy_name>
- 다중 네트워크 정책의 이름을 지정합니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
cluster-admin
권한으로 웹 콘솔에 로그인하면 YAML의 모든 네임스페이스에서 또는 Actions 메뉴를 통해 웹 콘솔의 정책에서 직접 네트워크 정책을 편집할 수 있습니다.
23.4.3.4. CLI를 사용하여 다중 네트워크 정책 보기
네임스페이스에서 다중 네트워크 정책을 검사할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
네임스페이스의 다중 네트워크 정책을 나열합니다.
네임스페이스에 정의된 다중 네트워크 정책 오브젝트를 보려면 다음 명령을 입력합니다.
$ oc get multi-networkpolicy
선택 사항: 특정 다중 네트워크 정책을 검사하려면 다음 명령을 입력합니다.
$ oc describe multi-networkpolicy <policy_name> -n <namespace>
다음과 같습니다.
<policy_name>
- 검사할 다중 네트워크 정책의 이름을 지정합니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
cluster-admin
권한으로 웹 콘솔에 로그인하면 클러스터의 모든 네임스페이스에서 네트워크 정책을 YAML에서 직접 또는 웹 콘솔의 양식에서 볼 수 있습니다.
23.4.3.5. CLI를 사용하여 다중 네트워크 정책 삭제
네임스페이스에서 다중 네트워크 정책을 삭제할 수 있습니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인 또는 OpenShift SDN 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다. 이 모드는 OpenShift SDN의 기본값입니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
다중 네트워크 정책 오브젝트를 삭제하려면 다음 명령을 입력합니다.
$ oc delete multi-networkpolicy <policy_name> -n <namespace>
다음과 같습니다.
<policy_name>
- 다중 네트워크 정책의 이름을 지정합니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
출력 예
multinetworkpolicy.k8s.cni.cncf.io/default-deny deleted
cluster-admin
권한으로 웹 콘솔에 로그인하는 경우 YAML의 모든 네임스페이스에서 또는 Actions 메뉴를 통해 웹 콘솔의 정책에서 직접 네트워크 정책을 삭제할 수 있습니다.
23.4.3.6. 기본 거부 모든 다중 네트워크 정책 생성
이는 배포된 다른 네트워크 정책에서 허용하는 네트워크 트래픽 이외의 모든 교차 포드 네트워킹을 차단하는 기본 정책입니다. 이 절차에서는 기본 거부
정책을 적용합니다.
cluster-admin
역할을 가진 사용자로 로그인하면 클러스터의 모든 네임스페이스에서 네트워크 정책을 생성할 수 있습니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인 또는 OpenShift SDN 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다. 이 모드는 OpenShift SDN의 기본값입니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
모든 네임스페이스의 모든 Pod에서 수신을
거부하는 거부-별-기본
정책을 정의하는 다음 YAML을 생성합니다. YAML을deny-by-default.yaml
파일에 저장합니다.apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: deny-by-default namespace: default 1 annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> 2 spec: podSelector: {} 3 ingress: [] 4
다음 명령을 입력하여 정책을 적용합니다.
$ oc apply -f deny-by-default.yaml
출력 예
multinetworkpolicy.k8s.cni.cncf.io/deny-by-default created
23.4.3.7. 외부 클라이언트의 트래픽을 허용하는 다중 네트워크 정책 생성
deny-by-default
정책을 사용하여 외부 클라이언트에서 라벨이 app=web
인 Pod로의 트래픽을 허용하는 정책을 구성할 수 있습니다.
cluster-admin
역할을 가진 사용자로 로그인하면 클러스터의 모든 네임스페이스에서 네트워크 정책을 생성할 수 있습니다.
다음 절차에 따라 공용 인터넷에서 직접 또는 Load Balancer를 사용하여 포드에 액세스할 수 있는 정책을 구성합니다. 트래픽은 app=web
레이블이 있는 Pod에만 허용됩니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인 또는 OpenShift SDN 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다. 이 모드는 OpenShift SDN의 기본값입니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
공용 인터넷에서 직접 또는 로드 밸런서를 사용하여 포드에 액세스하는 방식으로 트래픽을 허용하는 정책을 생성합니다.
web-allow-external.yaml
파일에 YAML을 저장합니다.apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: web-allow-external namespace: default annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: policyTypes: - Ingress podSelector: matchLabels: app: web ingress: - {}
다음 명령을 입력하여 정책을 적용합니다.
$ oc apply -f web-allow-external.yaml
출력 예
multinetworkpolicy.k8s.cni.cncf.io/web-allow-external created
이 정책은 다음 다이어그램에 설명된 대로 외부 트래픽을 포함하여 모든 리소스의 트래픽을 허용합니다.
23.4.3.8. 모든 네임스페이스에서 애플리케이션으로의 트래픽 허용 다중 네트워크 정책 생성
cluster-admin
역할을 가진 사용자로 로그인하면 클러스터의 모든 네임스페이스에서 네트워크 정책을 생성할 수 있습니다.
다음 절차에 따라 모든 네임스페이스의 모든 Pod에서 특정 애플리케이션으로의 트래픽을 허용하는 정책을 구성합니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인 또는 OpenShift SDN 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다. 이 모드는 OpenShift SDN의 기본값입니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
모든 네임스페이스의 모든 포드에서 특정 애플리케이션으로 트래픽을 허용하는 정책을 생성합니다. YAML을
web-allow-all-namespaces.yaml
파일에 저장합니다.apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: web-allow-all-namespaces namespace: default annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: matchLabels: app: web 1 policyTypes: - Ingress ingress: - from: - namespaceSelector: {} 2
참고기본적으로
namespaceSelector
를 지정하지 않으면 정책이 네트워크 정책이 배포된 네임스페이스에서만 트래픽을 허용하는 네임스페이스를 선택하지 않습니다.다음 명령을 입력하여 정책을 적용합니다.
$ oc apply -f web-allow-all-namespaces.yaml
출력 예
multinetworkpolicy.k8s.cni.cncf.io/web-allow-all-namespaces created
검증
다음 명령을 입력하여
default
네임스페이스에서 웹 서비스를 시작합니다.$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
다음 명령을 실행하여
보조
네임스페이스에alpine
이미지를 배포하고 쉘을 시작합니다.$ oc run test-$RANDOM --namespace=secondary --rm -i -t --image=alpine -- sh
쉘에서 다음 명령을 실행하고 요청이 허용되는지 확인합니다.
# 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>
23.4.3.9. 네임스페이스에서 애플리케이션으로의 트래픽을 허용하는 다중 네트워크 정책 생성
cluster-admin
역할을 가진 사용자로 로그인하면 클러스터의 모든 네임스페이스에서 네트워크 정책을 생성할 수 있습니다.
다음 절차에 따라 특정 네임스페이스에서 app=web
레이블이 있는 Pod로의 트래픽을 허용하는 정책을 구성합니다. 다음을 수행할 수 있습니다.
- 프로덕션 워크로드가 배포된 네임스페이스로만 트래픽을 제한합니다.
- 특정 네임스페이스에 배포된 모니터링 툴을 활성화하여 현재 네임스페이스에서 지표를 스크랩할 수 있습니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인 또는 OpenShift SDN 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다. 이 모드는 OpenShift SDN의 기본값입니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 다중 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
절차
purpose=production
레이블이 있는 특정 네임스페이스의 모든 Pod의 트래픽을 허용하는 정책을 생성합니다. YAML을web-allow-prod.yaml
파일에 저장합니다.apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: web-allow-prod namespace: default annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: matchLabels: app: web 1 policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: purpose: production 2
다음 명령을 입력하여 정책을 적용합니다.
$ oc apply -f web-allow-prod.yaml
출력 예
multinetworkpolicy.k8s.cni.cncf.io/web-allow-prod created
검증
다음 명령을 입력하여
default
네임스페이스에서 웹 서비스를 시작합니다.$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
다음 명령을 실행하여
prod
네임스페이스를 생성합니다.$ oc create namespace prod
다음 명령을 실행하여
prod
네임스페이스에 레이블을 지정합니다.$ oc label namespace/prod purpose=production
다음 명령을 실행하여
dev
네임스페이스를 생성합니다.$ oc create namespace dev
다음 명령을 실행하여
dev
네임스페이스에 레이블을 지정합니다.$ oc label namespace/dev purpose=testing
다음 명령을 실행하여
dev
네임스페이스에alpine
이미지를 배포하고 쉘을 시작합니다.$ oc run test-$RANDOM --namespace=dev --rm -i -t --image=alpine -- sh
쉘에서 다음 명령을 실행하고 요청이 차단되었는지 확인합니다.
# wget -qO- --timeout=2 http://web.default
예상 출력
wget: download timed out
다음 명령을 실행하여
prod
네임스페이스에alpine
이미지를 배포하고 쉘을 시작합니다.$ oc run test-$RANDOM --namespace=prod --rm -i -t --image=alpine -- sh
쉘에서 다음 명령을 실행하고 요청이 허용되는지 확인합니다.
# 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>