이 포스팅에서는 Kubernetes 에서 사용할 수 있는 Object 중 하나인 Network Policy 를 생성하는 YAML 에 대해 살펴 보려고 합니다. YAML 의 사용방법이나 Network Policy 를 생성하기 위한 YAML 작성법에 대해서는 다루지 않고 Kubernetes 공식 문서에 있는 Example Code 에서 제가 의문을 가졌던 부분에 대해 살펴 보려고 합니다.
Kubernetes 공식 문서의 Network Policy 관련 페이지를 보면 아래와 같은 샘플 YAML Code 가 있는 것을 확인할 수 있습니다.
YAML 코드를 옮겨보면 아래와 같은데요.
제가 의문을 가졌던 부분은 전체 코드 중 아래의 “Ports” 를 사용하는 부분입니다.
ports:
- protocol: TCP
port: 6379
Kubernetes 의 API 문서를 살펴보면 Network Policy 를 생성할 때 사용할 수 있는 구조를 다음과 같이 설명하고 있습니다.
1. NetworkPolicy v1 networking.k8s.io
여기에는 아래와 같이 apiVersion, kind, metadat, spec 필드를 설명하고 있습니다.
2. NetworkPolicySpec v1 networking
Spec 필드를 다시 한 번 살펴보면 egress, ingress, podSelector, policyTypes 와 같은 필드를 설명하고 있습니다.
3. NetworkPolicyIngressRule v1 networking.k8s.io
세번째는 ingress 필드에서 참조하는 “NetworkingPolicyIngressRule” 부분인데요. 여기를 보시면 from 과 ports 두 개의 필드가 있는 걸 알 수 있습니다.
저는 사실 여기에서 의문을 가졌던 것인데요. (Sample YAML 코드에서 ingress 부분만 언급하겠습니다. )
예제에 나와 있는 YAML 을 살펴보면 ingress 의 규칙을 정의하는 내용에 “Ports” 가 from 의 내부에 들어가 있습니다.
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
위 API Spec 문서를 보면 from 과 ports 가 같은 레벨에 존재해야할 것 같은데 왜 ports 가 from 의 내부로 들어가 있을까? 여기에 의문을 가졌던것인데요.
저는 아래와 같이 ports 에도 “-” 를 붙여주는 것이 API Spec 에 기술한 것과 일치하는 것이 아닌가? 라고 생각을 했던 것입니다
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
결국 이 두가지의 차이점을 확인하기 위해서는 테스트를 해보고 그 결과를 통해 확인하는 것이 최선일 것 같습니다.
테스트 환경에서 이 두 가지 경우를 모두 실행하고 그 결과를 비교해보았는데요.
위에서 나타난 것과 같이 ports 앞에 “-” 이 있는 것과 없는 것은 엄청난 차이가 있다는 것을 알 수 있습니다.
- “ports” 로 구성된 경우
: 하나의 Allow 규칙만이 생성됩니다.
- From 에 명시되어 있는 IPBlock 과 ports 에 정의된 protocol 과 port 를 허용합니다. - “- ports” 로 구성된 경우
: 두 개의 Allow 규칙이 생성됩니다.
- From 에 명시되어 있는 IPBlock 을 허용합니다. Port 는 지정되어 있지 않으므로 Any Port 가 목적지로 허용됩니다.
- Ports 에 명시되어 있는 Protocol/Port 를 허용합니다. IP Block 등은 지정되어 있지 않으므로 Any Source 가 출발지로 허용됩니다.
결과적으로 특정 IP Block 과 Port 정보를 조합해서 규칙을 작성하려면 Kubernetes 의 예제와 같이 ports 에 “-” 을 붙이지 않고 from 이나 “to” 의 하위에 위치하도록 구성해야 한다는 것입니다.
테스트를 통해 ports 앞에 “-” 유무가 어떤 다른 결과를 가져오는지 그리고 왜 필요한지에 대해서는 확인할 수 있었는데요. API Spec 문서의 설명만 본다면 왜 from 과 port 가 NetworkPolicyIngressRule 에 있는걸까? 하는 의문이 남는데요.
동작방식만 본다면 NetworkPolicyPeer 에 있는게 맞는게 아닌가 생각해봤습니다.
감사합니다.