7.3. 네트워크 정책
7.3.1. 네트워크 정책 정의
개발자는 클러스터의 Pod로 트래픽을 제한하는 네트워크 정책을 정의할 수 있습니다.
7.3.1.1. 네트워크 정책 정의
기본적으로 네트워크 정책 모드에서는 다른 Pod 및 네트워크 끝점에서 프로젝트의 모든 Pod에 액세스할 수 있습니다. 프로젝트에서 하나 이상의 Pod를 분리하기 위해 해당 프로젝트에서 NetworkPolicy
오브젝트를 생성하여 수신되는 연결을 표시할 수 있습니다. 프로젝트 관리자는 자신의 프로젝트 내에서 NetworkPolicy
오브젝트를 만들고 삭제할 수 있습니다.
하나 이상의 NetworkPolicy
오브젝트에서 선택기와 Pod가 일치하면 Pod는 해당 NetworkPolicy
오브젝트 중 하나 이상에서 허용되는 연결만 허용합니다. NetworkPolicy
오브젝트가 선택하지 않은 Pod에 완전히 액세스할 수 있습니다.
네트워크 정책은 TCP, UDP, ICMP 및 SCTP 프로토콜에만 적용됩니다. 다른 프로토콜은 영향을 받지 않습니다.
네트워크 정책은 호스트 네트워크 네임스페이스에 적용되지 않습니다. 호스트 네트워킹이 활성화된 Pod는 네트워크 정책 규칙의 영향을 받지 않습니다. 그러나 호스트 네트워크 pod에 연결하는 Pod는 네트워크 정책 규칙의 영향을 받을 수 있습니다.
네트워크 정책은 localhost 또는 상주 노드의 트래픽을 차단할 수 없습니다.
다음 예제 NetworkPolicy
오브젝트는 다양한 시나리오 지원을 보여줍니다.
모든 트래픽 거부:
기본적으로 프로젝트를 거부하려면 모든 Pod와 일치하지만 트래픽을 허용하지 않는
NetworkPolicy
오브젝트를 추가합니다.kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-by-default spec: podSelector: {} ingress: []
OpenShift Container Platform Ingress 컨트롤러의 연결만 허용합니다.
프로젝트에서 OpenShift Container Platform Ingress 컨트롤러의 연결만 허용하도록 하려면 다음
NetworkPolicy
개체를 추가합니다.apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-openshift-ingress spec: ingress: - from: - namespaceSelector: matchLabels: network.openshift.io/policy-group: ingress podSelector: {} policyTypes: - Ingress
프로젝트 내 Pod 연결만 허용:
중요동일한 네임스페이스에 있는
hostNetwork
Pod의 수신 연결을 허용하려면allow-from-hostnetwork
정책을allow-same-namespace
정책과 함께 적용해야 합니다.Pod가 동일한 프로젝트 내 다른 Pod의 연결은 수락하지만 다른 프로젝트에 속하는 Pod의 기타 모든 연결을 거부하도록 하려면 다음
NetworkPolicy
오브젝트를 추가합니다.kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-same-namespace spec: podSelector: {} ingress: - from: - podSelector: {}
Pod 레이블을 기반으로 하는 HTTP 및 HTTPS 트래픽만 허용:
특정 레이블(다음 예에서
role=frontend
)을 사용하여 Pod에 대한 HTTP 및 HTTPS 액세스만 활성화하려면 다음과 유사한NetworkPolicy
오브젝트를 추가합니다.kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-http-and-https spec: podSelector: matchLabels: role: frontend ingress: - ports: - protocol: TCP port: 80 - protocol: TCP port: 443
네임스페이스와 Pod 선택기를 모두 사용하여 연결 수락:
네임스페이스와 Pod 선택기를 결합하여 네트워크 트래픽을 일치시키려면 다음과 유사한
NetworkPolicy
오브젝트를 사용하면 됩니다.kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-pod-and-namespace-both spec: podSelector: matchLabels: name: test-pods ingress: - from: - namespaceSelector: matchLabels: project: project_name podSelector: matchLabels: name: test-pods
NetworkPolicy
오브젝트는 추가 기능이므로 여러 NetworkPolicy
오브젝트를 결합하여 복잡한 네트워크 요구 사항을 충족할 수 있습니다.
예를 들어, 이전 샘플에서 정의된 NetworkPolicy
오브젝트의 경우 동일한 프로젝트 내에서 allow-same-namespace
정책과 allow-http-and-https
정책을 모두 정의할 수 있습니다. 따라서 레이블이 role=frontend
로 지정된 Pod는 각 정책에서 허용하는 모든 연결을 허용할 수 있습니다. 즉 동일한 네임스페이스에 있는 Pod의 모든 포트 연결과 모든 네임스페이스에 있는 Pod에서 포트 80
및 443
에 대한 연결이 허용됩니다.
7.3.1.1.1. allow-from-router 네트워크 정책 사용
다음 NetworkPolicy
를 사용하여 라우터 구성과 관계없이 외부 트래픽을 허용합니다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-router
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
policy-group.network.openshift.io/ingress: ""1
podSelector: {}
policyTypes:
- Ingress
- 1
policy-group.network.openshift.io/ingress:"
레이블은 OVN-Kubernetes를 지원합니다.
7.3.1.1.2. allow-from-hostnetwork 네트워크 정책 사용
다음 allow-from-hostnetwork
NetworkPolicy
오브젝트를 추가하여 호스트 네트워크 Pod에서 트래픽을 전달합니다.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-hostnetwork spec: ingress: - from: - namespaceSelector: matchLabels: policy-group.network.openshift.io/host-network: "" podSelector: {} policyTypes: - Ingress
7.3.1.2. OVN-Kubernetes 네트워크 플러그인을 사용하여 네트워크 정책 최적화
네트워크 정책을 설계할 때 다음 지침을 참조하십시오.
-
spec.podSelector
사양이 동일한 네트워크 정책의 경우 수신 또는 송신 규칙의 하위 집합이 있는 여러 네트워크 정책보다 여러수신
또는송신
규칙이 있는 하나의 네트워크 정책을 사용하는 것이 더 효율적입니다. podSelector
또는namespaceSelector
사양을 기반으로 하는 모든수신
또는송신
규칙은네트워크 정책에서 선택한 Pod 수 + 수신 또는 송신 규칙에서 선택한 Pod 수에 비례하여 OVS 흐름 수를
생성합니다. 따라서 모든 Pod에 대한 개별 규칙을 생성하는 대신 하나의 규칙에서 필요한 만큼 많은 Pod를 선택할 수 있는podSelector
또는namespaceSelector
사양을 사용하는 것이 좋습니다.예를 들어 다음 정책에는 다음 두 가지 규칙이 있습니다.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy spec: podSelector: {} ingress: - from: - podSelector: matchLabels: role: frontend - from: - podSelector: matchLabels: role: backend
다음 정책은 동일한 두 규칙을 나타냅니다.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy spec: podSelector: {} ingress: - from: - podSelector: matchExpressions: - {key: role, operator: In, values: [frontend, backend]}
동일한 지침이
spec.podSelector
사양에 적용됩니다. 다른 네트워크 정책에 대해 동일한수신
또는송신
규칙이 있는 경우 일반적인spec.podSelector
사양을 사용하여 하나의 네트워크 정책을 생성하는 것이 더 효율적일 수 있습니다. 예를 들어 다음 두 정책에는 다른 규칙이 있습니다.apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: policy1 spec: podSelector: matchLabels: role: db ingress: - from: - podSelector: matchLabels: role: frontend --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: policy2 spec: podSelector: matchLabels: role: client ingress: - from: - podSelector: matchLabels: role: frontend
다음 네트워크 정책은 규칙과 동일한 두 규칙을 나타냅니다.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: policy3 spec: podSelector: matchExpressions: - {key: role, operator: In, values: [db, client]} ingress: - from: - podSelector: matchLabels: role: frontend
선택기가 여러 개만 표시된 경우 이 최적화를 적용할 수 있습니다. 선택기가 다른 레이블을 기반으로 하는 경우 이 최적화를 적용하지 못할 수 있습니다. 이러한 경우 특히 네트워크 정책 최적화를 위해 몇 가지 새로운 레이블을 적용하는 것이 좋습니다.
7.3.1.3. 다음 단계
- 네트워크 정책 생성
- 선택 사항: 프로젝트의 기본 네트워크 정책 정의
7.3.1.4. 추가 리소스
7.3.2. 네트워크 정책 생성
admin
역할이 있는 사용자는 네임스페이스에 대한 네트워크 정책을 생성할 수 있습니다.
7.3.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
7.3.2.2. CLI를 사용하여 네트워크 정책 생성
클러스터의 네임스페이스에서 허용된 수신 또는 송신 네트워크 트래픽을 설명하는 세분화된 규칙을 정의하기 위해 네트워크 정책을 생성할 수 있습니다.
cluster-admin
역할로 사용자로 로그인하는 경우 클러스터의 모든 네임스페이스에서 네트워크 정책을 생성할 수 있습니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
다음과 같이 정책 규칙을 생성합니다.
<policy_name>.yaml
파일을 생성합니다.$ touch <policy_name>.yaml
다음과 같습니다.
<policy_name>
- 네트워크 정책 파일 이름을 지정합니다.
방금 만든 파일에서 다음 예와 같이 네트워크 정책을 정의합니다.
모든 네임스페이스의 모든 Pod에서 수신 거부
이는 다른 네트워크 정책 구성에서 허용하는 포드 간 트래픽 이외의 모든 교차 포드 네트워킹을 차단하는 기본 정책입니다.
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-by-default spec: podSelector: {} policyTypes: - Ingress 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
다음 명령을 실행하여 네트워크 정책 오브젝트를 생성합니다.
$ oc apply -f <policy_name>.yaml -n <namespace>
다음과 같습니다.
<policy_name>
- 네트워크 정책 파일 이름을 지정합니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
출력 예
networkpolicy.networking.k8s.io/deny-by-default created
cluster-admin
권한을 사용하여 웹 콘솔에 로그인하는 경우 클러스터의 모든 네임스페이스에서 직접 또는 웹 콘솔의 양식에서 네트워크 정책을 생성할 수 있습니다.
7.3.2.3. 기본 거부 모든 네트워크 정책 생성
이 정책은 배포된 다른 네트워크 정책의 구성에서 허용하는 네트워크 트래픽 이외의 모든 포드 간 네트워킹을 차단하는 기본 정책입니다. 이 절차에서는 기본 거부
정책을 적용합니다.
cluster-admin
역할로 사용자로 로그인하는 경우 클러스터의 모든 네임스페이스에서 네트워크 정책을 생성할 수 있습니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
모든 네임스페이스의 모든 포드의 수신을
거부하도록 기본
거부 정책을 정의하는 다음 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
다음 명령을 입력하여 정책을 적용합니다.
$ oc apply -f deny-by-default.yaml
출력 예
networkpolicy.networking.k8s.io/deny-by-default created
7.3.2.4. 외부 클라이언트의 트래픽을 허용하는 네트워크 정책 생성
기본 거부
정책을 배치하면 app=web
레이블이 있는 외부 클라이언트에서 Pod로의 트래픽을 허용하는 정책을 구성할 수 있습니다.
cluster-admin
역할로 사용자로 로그인하는 경우 클러스터의 모든 네임스페이스에서 네트워크 정책을 생성할 수 있습니다.
다음 절차에 따라 공용 인터넷의 외부 서비스를 직접 또는 Load Balancer를 사용하여 Pod에 액세스하는 방식으로 허용하는 정책을 구성합니다. app=web
레이블이 있는 Pod에만 트래픽이 허용됩니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
직접 또는 로드 밸런서를 사용하여 pod에 액세스하여 공용 인터넷의 트래픽을 허용하는 정책을 생성합니다. YAML을
web-allow-external.yaml
파일에 저장합니다.kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: web-allow-external namespace: default spec: policyTypes: - Ingress podSelector: matchLabels: app: web ingress: - {}
다음 명령을 입력하여 정책을 적용합니다.
$ oc apply -f web-allow-external.yaml
출력 예
networkpolicy.networking.k8s.io/web-allow-external created
이 정책은 다음 다이어그램에 설명된 대로 외부 트래픽을 포함하여 모든 리소스의 트래픽을 허용합니다.
7.3.2.5. 모든 네임스페이스에서 애플리케이션에 대한 트래픽을 허용하는 네트워크 정책 생성
cluster-admin
역할로 사용자로 로그인하는 경우 클러스터의 모든 네임스페이스에서 네트워크 정책을 생성할 수 있습니다.
다음 절차에 따라 모든 네임스페이스의 모든 Pod에서 특정 애플리케이션으로의 트래픽을 허용하는 정책을 구성합니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
모든 네임스페이스의 모든 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
참고기본적으로
namespaceSelector
를 지정하는 것을 생략하면 네임스페이스를 선택하지 않으므로 정책에서 네트워크 정책이 배포된 네임스페이스의 트래픽만 허용합니다.다음 명령을 입력하여 정책을 적용합니다.
$ oc apply -f web-allow-all-namespaces.yaml
출력 예
networkpolicy.networking.k8s.io/web-allow-all-namespaces created
검증
다음 명령을 입력하여
기본
네임스페이스에서 웹 서비스를 시작합니다.$ 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>
7.3.2.6. 네임스페이스에서 애플리케이션에 대한 트래픽을 허용하는 네트워크 정책 생성
cluster-admin
역할로 사용자로 로그인하는 경우 클러스터의 모든 네임스페이스에서 네트워크 정책을 생성할 수 있습니다.
다음 절차에 따라 특정 네임스페이스의 app=web
레이블을 사용하여 Pod로의 트래픽을 허용하는 정책을 구성합니다. 다음을 위해 이 작업을 수행할 수 있습니다.
- 프로덕션 데이터베이스가 프로덕션 워크로드가 배포된 네임스페이스로만 트래픽을 제한합니다.
- 특정 네임스페이스에 배포된 모니터링 툴을 활성화하여 현재 네임스페이스에서 메트릭을 스크랩할 수 있습니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 네트워크 정책이 적용되는 네임스페이스에서 작업하고 있습니다.
프로세스
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
다음 명령을 입력하여 정책을 적용합니다.
$ oc apply -f web-allow-prod.yaml
출력 예
networkpolicy.networking.k8s.io/web-allow-prod created
검증
다음 명령을 입력하여
기본
네임스페이스에서 웹 서비스를 시작합니다.$ 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>
7.3.2.7. 추가 리소스
7.3.3. 네트워크 정책 보기
admin
역할이 있는 사용자는 네임스페이스에 대한 네트워크 정책을 볼 수 있습니다.
7.3.3.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
7.3.3.2. CLI를 사용하여 네트워크 정책 보기
네임스페이스에서 네트워크 정책을 검사할 수 있습니다.
cluster-admin
역할을 가진 사용자로 로그인하면 클러스터의 모든 네트워크 정책을 볼 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc
)를 설치합니다. -
admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 네트워크 정책이 존재하는 네임스페이스에서 작업하고 있습니다.
프로세스
네임스페이스의 네트워크 정책을 나열합니다.
네임스페이스에 정의된 네트워크 정책 개체를 보려면 다음 명령을 입력합니다.
$ oc get networkpolicy
선택 사항: 특정 네트워크 정책을 검사하려면 다음 명령을 입력합니다.
$ oc describe networkpolicy <policy_name> -n <namespace>
다음과 같습니다.
<policy_name>
- 검사할 네트워크 정책의 이름을 지정합니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
예를 들면 다음과 같습니다.
$ oc describe networkpolicy allow-same-namespace
oc describe
명령의 출력Name: allow-same-namespace Namespace: ns1 Created on: 2021-05-24 22:28:56 -0400 EDT Labels: <none> Annotations: <none> Spec: PodSelector: <none> (Allowing the specific traffic to all pods in this namespace) Allowing ingress traffic: To Port: <any> (traffic allowed to all ports) From: PodSelector: <none> Not affecting egress traffic Policy Types: Ingress
cluster-admin
권한을 사용하여 웹 콘솔에 로그인하는 경우 YAML 또는 웹 콘솔의 양식에서 클러스터의 모든 네임스페이스에서 네트워크 정책을 직접 볼 수 있습니다.
7.3.4. 네트워크 정책 편집
관리자
역할이 있는 사용자는 네임스페이스에 대한 기존 네트워크 정책을 편집할 수 있습니다.
7.3.4.1. 네트워크 정책 편집
네임스페이스에서 네트워크 정책을 편집할 수 있습니다.
cluster-admin
역할을 가진 사용자로 로그인하면 클러스터의 모든 네임스페이스에서 네트워크 정책을 편집할 수 있습니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 네트워크 정책이 존재하는 네임스페이스에서 작업하고 있습니다.
프로세스
선택 사항: 네임스페이스의 네트워크 정책 개체를 나열하려면 다음 명령을 입력합니다.
$ oc get networkpolicy
다음과 같습니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
네트워크 정책 오브젝트를 편집합니다.
네트워크 정책 정의를 파일에 저장한 경우 파일을 편집하고 필요한 사항을 변경한 후 다음 명령을 입력합니다.
$ oc apply -n <namespace> -f <policy_file>.yaml
다음과 같습니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
<policy_file>
- 네트워크 정책이 포함된 파일의 이름을 지정합니다.
네트워크 정책 개체를 직접 업데이트해야 하는 경우 다음 명령을 입력합니다.
$ oc edit networkpolicy <policy_name> -n <namespace>
다음과 같습니다.
<policy_name>
- 네트워크 정책의 이름을 지정합니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
네트워크 정책 개체가 업데이트되었는지 확인합니다.
$ oc describe networkpolicy <policy_name> -n <namespace>
다음과 같습니다.
<policy_name>
- 네트워크 정책의 이름을 지정합니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
cluster-admin
권한을 사용하여 웹 콘솔에 로그인하는 경우 Actions 메뉴를 통해 클러스터의 모든 네임스페이스에서 직접 또는 웹 콘솔의 정책에서 네트워크 정책을 편집할 수 있습니다.
7.3.4.2. 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
7.3.4.3. 추가 리소스
7.3.5. 네트워크 정책 삭제
admin
역할이 있는 사용자는 네임스페이스에서 네트워크 정책을 삭제할 수 있습니다.
7.3.5.1. CLI를 사용하여 네트워크 정책 삭제
네임스페이스에서 네트워크 정책을 삭제할 수 있습니다.
cluster-admin
역할을 가진 사용자로 로그인하면 클러스터의 모든 네트워크 정책을 삭제할 수 있습니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
admin
권한이 있는 사용자로 클러스터에 로그인합니다. - 네트워크 정책이 존재하는 네임스페이스에서 작업하고 있습니다.
프로세스
네트워크 정책 개체를 삭제하려면 다음 명령을 입력합니다.
$ oc delete networkpolicy <policy_name> -n <namespace>
다음과 같습니다.
<policy_name>
- 네트워크 정책의 이름을 지정합니다.
<namespace>
- 선택 사항: 오브젝트가 현재 네임스페이스와 다른 네임스페이스에 정의된 경우 이를 사용하여 네임스페이스를 지정합니다.
출력 예
networkpolicy.networking.k8s.io/default-deny deleted
cluster-admin
권한을 사용하여 웹 콘솔에 로그인하는 경우, YAML에서 직접 또는 Actions 메뉴를 통해 웹 콘솔의 정책에서 클러스터의 모든 네임스페이스에서 네트워크 정책을 삭제할 수 있습니다.
7.3.6. 프로젝트의 기본 네트워크 정책 정의
클러스터 관리자는 새 프로젝트를 만들 때 네트워크 정책을 자동으로 포함하도록 새 프로젝트 템플릿을 수정할 수 있습니다. 새 프로젝트에 대한 사용자 정의 템플릿이 아직 없는 경우에는 우선 생성해야 합니다.
7.3.6.1. 새 프로젝트의 템플릿 수정
클러스터 관리자는 사용자 정의 요구 사항을 사용하여 새 프로젝트를 생성하도록 기본 프로젝트 템플릿을 수정할 수 있습니다.
사용자 정의 프로젝트 템플릿을 만들려면:
사전 요구 사항
-
cluster-admin
권한이 있는 계정을 사용하여 OpenShift Container Platform 클러스터에 액세스할 수 있습니다.
프로세스
-
cluster-admin
권한이 있는 사용자로 로그인합니다. 기본 프로젝트 템플릿을 생성합니다.
$ oc adm create-bootstrap-project-template -o yaml > template.yaml
-
텍스트 편집기를 사용하여 오브젝트를 추가하거나 기존 오브젝트를 수정하여 생성된
template.yaml
파일을 수정합니다. 프로젝트 템플릿은
openshift-config
네임스페이스에서 생성해야 합니다. 수정된 템플릿을 불러옵니다.$ oc create -f template.yaml -n openshift-config
웹 콘솔 또는 CLI를 사용하여 프로젝트 구성 리소스를 편집합니다.
웹 콘솔에 액세스:
-
관리
클러스터 설정으로 이동합니다. - 구성 을 클릭하여 모든 구성 리소스를 확인합니다.
- 프로젝트 항목을 찾아 YAML 편집을 클릭합니다.
-
관리
CLI 사용:
다음과 같이
project.config.openshift.io/cluster
리소스를 편집합니다.$ oc edit project.config.openshift.io/cluster
projectRequestTemplate
및name
매개변수를 포함하도록spec
섹션을 업데이트하고 업로드된 프로젝트 템플릿의 이름을 설정합니다. 기본 이름은project-request
입니다.사용자 정의 프로젝트 템플릿이 포함된 프로젝트 구성 리소스
apiVersion: config.openshift.io/v1 kind: Project metadata: # ... spec: projectRequestTemplate: name: <template_name> # ...
- 변경 사항을 저장한 후 새 프로젝트를 생성하여 변경 사항이 성공적으로 적용되었는지 확인합니다.
7.3.6.2. 새 프로젝트 템플릿에 네트워크 정책 추가
클러스터 관리자는 네트워크 정책을 새 프로젝트의 기본 템플릿에 추가할 수 있습니다. OpenShift Container Platform은 프로젝트의 템플릿에 지정된 모든 NetworkPolicy
개체를 자동으로 생성합니다.
사전 요구 사항
-
클러스터는 OVN-Kubernetes와 같은
NetworkPolicy
오브젝트를 지원하는 기본 CNI 네트워크 플러그인을 사용합니다. -
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인해야 합니다. - 새 프로젝트에 대한 사용자 정의 기본 프로젝트 템플릿을 생성해야 합니다.
프로세스
다음 명령을 실행하여 새 프로젝트의 기본 템플릿을 편집합니다.
$ oc edit template <project_template> -n openshift-config
<project_template>
을 클러스터에 대해 구성한 기본 템플릿의 이름으로 변경합니다. 기본 템플릿 이름은project-request
입니다.템플릿에서 각
NetworkPolicy
오브젝트를objects
매개변수의 요소로 추가합니다.objects
매개변수는 하나 이상의 오브젝트 컬렉션을 허용합니다.다음 예제에서
objects
매개변수 컬렉션에는 여러NetworkPolicy
오브젝트가 포함됩니다.objects: - apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-same-namespace spec: podSelector: {} ingress: - from: - podSelector: {} - apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-openshift-ingress spec: ingress: - from: - namespaceSelector: matchLabels: network.openshift.io/policy-group: ingress podSelector: {} policyTypes: - Ingress - apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-kube-apiserver-operator spec: ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: openshift-kube-apiserver-operator podSelector: matchLabels: app: kube-apiserver-operator policyTypes: - Ingress ...
선택 사항: 다음 명령을 실행하여 새 프로젝트를 생성하고 네트워크 정책 오브젝트가 생성되었는지 확인합니다.
새 프로젝트를 생성합니다.
$ oc new-project <project> 1
- 1
<project>
를 생성중인 프로젝트의 이름으로 변경합니다.
새 프로젝트 템플릿의 네트워크 정책 오브젝트가 새 프로젝트에 있는지 확인합니다.
$ oc get networkpolicy NAME POD-SELECTOR AGE allow-from-openshift-ingress <none> 7s allow-from-same-namespace <none> 7s
7.3.7. 네트워크 정책으로 다중 테넌트 격리 구성
클러스터 관리자는 다중 테넌트 네트워크 격리를 제공하도록 네트워크 정책을 구성할 수 있습니다.
이 섹션에 설명된 대로 네트워크 정책을 구성하면 이전 버전의 OpenShift Container Platform에서 OpenShift SDN의 다중 테넌트 모드와 유사한 네트워크 격리가 제공됩니다.
7.3.7.1. 네트워크 정책을 사용하여 다중 테넌트 격리 구성
다른 프로젝트 네임스페이스의 Pod 및 서비스에서 격리하도록 프로젝트를 구성할 수 있습니다.
사전 요구 사항
-
클러스터는
mode:
로 설정된 OVN-Kubernetes 네트워크 플러그인과 같은 NetworkPolicy 오브젝트를 지원하는 네트워크 플러그인을 사용합니다.NetworkPolicy
-
OpenShift CLI(
oc
)를 설치합니다. -
admin
권한이 있는 사용자로 클러스터에 로그인합니다.
프로세스
다음
NetworkPolicy
오브젝트를 생성합니다.이름이
allow-from-openshift-ingress
인 정책입니다.$ cat << EOF| oc create -f - apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-openshift-ingress spec: ingress: - from: - namespaceSelector: matchLabels: policy-group.network.openshift.io/ingress: "" podSelector: {} policyTypes: - Ingress EOF
참고policy-group.network.openshift.io/ingress: ""
는 OVN-Kubernetes의 기본 네임스페이스 선택기 레이블입니다.이름이
allow-from-openshift-monitoring
인 정책:$ cat << EOF| oc create -f - apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-openshift-monitoring spec: ingress: - from: - namespaceSelector: matchLabels: network.openshift.io/policy-group: monitoring podSelector: {} policyTypes: - Ingress EOF
이름이
allow-same-namespace
인 정책:$ cat << EOF| oc create -f - kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-same-namespace spec: podSelector: ingress: - from: - podSelector: {} EOF
이름이
allow-from-kube-apiserver-operator
인 정책:$ cat << EOF| oc create -f - apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-kube-apiserver-operator spec: ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: openshift-kube-apiserver-operator podSelector: matchLabels: app: kube-apiserver-operator policyTypes: - Ingress EOF
자세한 내용은 웹 후크 의 상태를 검증하는 새로운
kube-apiserver-operator
웹 후크 컨트롤러를 참조하십시오.
선택 사항: 현재 프로젝트에 네트워크 정책이 있는지 확인하려면 다음 명령을 입력합니다.
$ oc describe networkpolicy
출력 예
Name: allow-from-openshift-ingress Namespace: example1 Created on: 2020-06-09 00:28:17 -0400 EDT Labels: <none> Annotations: <none> Spec: PodSelector: <none> (Allowing the specific traffic to all pods in this namespace) Allowing ingress traffic: To Port: <any> (traffic allowed to all ports) From: NamespaceSelector: network.openshift.io/policy-group: ingress Not affecting egress traffic Policy Types: Ingress Name: allow-from-openshift-monitoring Namespace: example1 Created on: 2020-06-09 00:29:57 -0400 EDT Labels: <none> Annotations: <none> Spec: PodSelector: <none> (Allowing the specific traffic to all pods in this namespace) Allowing ingress traffic: To Port: <any> (traffic allowed to all ports) From: NamespaceSelector: network.openshift.io/policy-group: monitoring Not affecting egress traffic Policy Types: Ingress