Kubernetes 네트워크 정책
요약 Juniper 클라우드 네이티브 Contrail® Networking™ (CN2)을 사용하면 Contrail 방화벽 보안 정책 프레임워크 내에서 Kubernetes 네트워크 정책을 구축할 수 있습니다. 네트워크 정책을 구축하려면 Contrail과 NetworkPolicy
같이 지원하는 컨테이너 네트워크 인터페이스(CNI)를 사용해야 합니다. 이 주제에서는 CN2를 실행하는 환경에서 Kubernetes 네트워크 정책을 구축하는 방법에 대한 정보를 제공합니다.
Kubernetes 네트워크 정책 개요
Kubernetes 네트워크 정책을 사용하면 포드가 다른 pod 및 네트워크 엔드포인트와 통신하는 방법을 지정할 수 있습니다. Kubernetes NetworkPolicy
리소스를 사용하면 포드가 다음과 통신할 수 있습니다.
-
허용 목록의 다른 포드(pod는 자체에 대한 액세스를 차단할 수 없습니다).
-
허용 목록의 네임스페이스.
-
IP 블록 또는 CIDR(Classless Inter-Domain Routing).
Kubernetes 네트워크 정책은 네임스페이스 내의 포드에만 적용되며 수신(소스) 및 송신(대상) 규칙을 정의합니다. Kubernetes 네트워크 정책은 포드에 적용할 때 다음과 같은 특성을 갖습니다.
-
포드별이며 단일 포드 또는 포드 그룹에 적용됩니다. 네트워크 정책 규칙은 해당 포드에 트래픽을 지시합니다.
-
수신 트래픽, 송신 트래픽 또는 둘 다에 대한 포드에 대한 트래픽 규칙을 정의합니다. 방향을 명시적으로 지정하지 않으면 정책은 기본적으로 수신 방향에 적용됩니다.
-
수신 및 송신 방향의 허용 목록에서 트래픽을 지정하는 명시적 규칙을 포함해야 합니다. 허용 목록 규칙과 일치하지 않는 트래픽은 거부됩니다.
-
허용된 트래픽에는 포드에 적용된 모든 네트워크 정책과 일치하는 트래픽이 포함됩니다.
Kubernetes 네트워크 정책에는 다음과 같은 추가 특성이 있습니다.
-
포드에 적용되지 않을 경우, 해당 포드는 모든 소스에서 트래픽을 허용합니다.
-
개별 패킷이 아닌 연결에 따라 행동합니다. 예를 들어, pod A에서 pod B로의 트래픽이 구성된 정책에 의해 허용되는 경우, 정책이 pod B가 pod A에 대한 연결을 시작하도록 허용하지 않는 경우에도 포드 B에서 포드 A로의 패킷도 허용됩니다.
Kubernetes 네트워크 정책은 다음 섹션으로 구성됩니다.
-
spec
: Kubernetes 개체의 원하는 상태를 설명합니다. 네트워크 정책의podSelector
경우, 사양 내의 및policyTypes
필드가 해당 정책에 대한 규칙을 지정합니다. -
podSelector
: 정책이 적용되는 포드 그룹을 선택합니다. 빈podSelector
은(는) 네임스페이스에서 모든 포드를 선택합니다. -
policyTypes
: 정책이 선택한 pod의 수신 트래픽에 적용되는지 또는 선택한 포드에 송신 트래픽에 적용되는지 지정합니다. 을(를) 지정하지policyTypes
않으면 기본적으로 수신 방향이 선택됩니다. -
ingress
: 및 섹션과ports
일치하는 수신 트래픽을from
허용합니다. 다음 예에서 수신 규칙은 레이블 앱이 있는 네임스페이dev
스의 모든 포드에 대한 연결을 허용합니다:webserver-dev
TCP 포트 80에서:-
레이블
app: client1-dev
이 있는 기본 네임스페이스의 모든 포드. -
10.169.25.20/32 범위 내의 모든 IP 주소입니다.
-
레이블
project: jtac
이 있는 기본 네임스페이스의 모든 포드.
-
-
egress
: 및 섹션과ports
일치하는 송신 트래픽을to
허용합니다. 예 1에서 송신 규칙은 기본 네임스페이스의 모든 포드에서 TCPapp: dbserver-dev
80을 포트하는 연결을 허용합니다. -
ipBlock
: 수신 소스 또는 송신 대상으로 허용하도록 IP CIDR 범위를 선택합니다. 네트워크 정책의 섹션에는ipBlock
다음 두 필드가 포함됩니다.-
cidr(ipBlock.cidr): 네트워크 정책을 통해 지정된 IP 범위의 트래픽 송신 또는 수신 트래픽을 허용합니다.
-
제외(ipBlock.except): Kubernetes는 지정된 IP 범위의 트래픽이 정책과 일치하지 않을 것으로 예상합니다. 네트워크 정책은 에 지정된 IP 범위의 수신 트래픽을 거부하거나 에서 송신 트래픽을 거부합니다
except
.참고: 네트워크 정책에서 사용하는except
경우 Kubernetes는 IP 범위에서 식별된 트래픽이except
정책과 일치하지 않을 것으로 예상합니다. CN2는 용어를 사용하는 이 특정 시나리오를except
지원하지 않습니다. 따라서 을(를) 사용하지except
않는 것이 좋습니다.
-
다음 NetworkPolicy
리소스 예는 및 egress
규칙을 보여줍니다ingress
.
#policy1-do.yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: policy1 namespace: dev spec: podSelector: matchLabels: app: webserver-dev policyTypes: - Ingress - Egress ingress: - from: - ipBlock: cidr: 10.169.25.20/32 - namespaceSelector: matchLabels: project: jtac - podSelector: matchLabels: app: client1-dev ports: - protocol: TCP port: 80 egress: - to: - podSelector: matchLabels: app: dbserver-dev ports: - protocol: TCP port: 80
이 예에서는 CIDR 10.169.25.20/32
port: 80
내의 IP에서 수신 TCP 트래픽이 허용됩니다. -을(를) 가진 포드로 matchLabels
app: dbserver-dev
TCP port: 80
의 송신 트래픽은 허용됩니다.
클라우드 네이티브 Contrail Networking Kubernetes 네트워크 정책 구축
CN2에서 Kubernetes 네트워크 정책을 구성하고 구축한 후 해당 정책은 Contrail에서 자동으로 생성됩니다. Kubernetes 네트워크 정책의 예는 다음과 같습니다.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: default spec: podSelector: matchLabels: role: db policyTypes: - Ingress - Egress ingress: - from: - ipBlock: cidr: 172.17.0.0/16 except: - 172.17.1.0/24 - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 6379 egress: - to: - ipBlock: cidr: 10.0.0.0/24 ports: - protocol: TCP port: 5978
이 정책의 결과로 CN2에서 다음 객체가 생성됩니다.
주요 | 가치 |
---|---|
역할 | Db |
네임 스페이스 | 기본 |
프로젝트 | 내 프로젝트 |
역할 | 프론트 엔드 |
이름 | 접두사 |
---|---|
test-network-policy-except | 172.17.1.0/24 |
test-network-policy | 172.17.0.0/16 |
test-network-policy-egress | 10.0.0.0/24 |
규칙 이름 | 작업 | 서비스 | 엔드포인트1 | 방향 | 엔드포인트2 |
---|---|---|---|---|---|
default-ingress-test-network-policy-0-ipBlock-0-17x.xx.1.0/24-0 | 거부 | tcp:6379 | role=db & namespace=default | 진입 | 주소 그룹: 172.17.1.0/24 |
default-ingress-test-network-policy-0-ipBlock-0-cidr-17x.xx.0.0/16-0 | 전달 | tcp:6379 | role=db & namespace=default | 진입 | 주소 그룹: 172.17.0.0/16 |
default-ingress-test-network-policy-0-namespace선정자-1-0 | 전달 | tcp:6379 | role=db & namespace=default | 진입 | project=myproject |
default-ingress-test-network-policy-0-podSelector-2-0 | 전달 | tcp:6379 | role=db & namespace=default | 진입 | namespace=default && role=프론트엔드 |
default-egress-test-network-policy-ipBlock-0-cidr-10.0.0.0/24-0 | 전달 | tcp:5978 | role=db & namespace=default | 탈출구 | 주소 그룹: 10.0.0.0/24 |
이름 | 규칙 |
---|---|
default-test-network-policy | default-ingress-test-network-policy-0-ipBlock-0-172.17.1.0/24-0, default-ingress-test-network-policy-0-ipBlock-0-cidr-172.17.0.0/16-0 default-ingress-test-network-policy-0-namespace선정자-1-0 default-ingress-test-network-policy-0-podSelector-2-0, default-egress-test-network-policy-ipBlock-0-cidr-10.0.0.0/24-0 |
Kubernetes 네트워크 정책 일치 익스프레스
클라우드 네이티브 Contrail Networking(CN2) 버전 22.3부터 CN2는 Kubernetes 네트워크 정책을 (2)로 matchExpressions
지원합니다. 에 대한 matchExpressions
자세한 내용은 Kubernetes 설명서의 "설정 기반 요구 사항을 지원하는 리소스" 를 참조하십시오.