"Killer Shell CKA - NetworkPolicy Misconfigured"의 두 판 사이의 차이

3번째 줄: 3번째 줄:
* https://killercoda.com/killer-shell-cka/scenario/networkpolicy-misconfigured
* https://killercoda.com/killer-shell-cka/scenario/networkpolicy-misconfigured
* 요구사항
* 요구사항
** Namespace <code>default</code>에서 라벨 <code>level=100x</code>를 가진 모든 파드가, Namespaces <code>level-1000</code>, <code>level-1001</code>, <code>level-1002</code> 내 라벨 <code>level=100x</code>를 가진 파드들과 통신할 수 있어야 함
** Namespace <code>default</code>에서 레이블 <code>level=100x</code>를 가진 모든 파드가, Namespaces <code>level-1000</code>, <code>level-1001</code>, <code>level-1002</code> 내 레이블 <code>level=100x</code>를 가진 파드들과 통신할 수 있어야 함
** 위 요구는 Egress(아웃바운드) 허용을 의미
** 위 요구는 Egress(아웃바운드) 허용을 의미
** DNS(53/TCP, 53/UDP)도 허용되어야 함
** DNS(53/TCP, 53/UDP)도 허용되어야 함


==사전 확인==
==사전 확인==
라벨과 테스트 리소스를 확인한다.
레이블과 테스트 리소스를 확인한다.
<syntaxhighlight lang='console'>
<syntaxhighlight lang='console'>
controlplane:~$ kubectl get ns --show-labels
controlplane:~$ kubectl get ns --show-labels
21번째 줄: 21번째 줄:


==문제 원인==
==문제 원인==
* 기존 NetworkPolicy의 <code>namespaceSelector</code> 중 하나가 잘못된 네임스페이스 라벨을 가리키고 있어 <code>level-1001</code>로의 통신이 차단됨
* 기존 NetworkPolicy의 <code>namespaceSelector</code> 중 하나가 잘못된 네임스페이스 레이블을 가리키고 있어 <code>level-1001</code>로의 통신이 차단됨
* NetworkPolicy에서 <code>namespaceSelector</code>는 네임스페이스의 라벨을 사용한다. kubeadm 기반 클러스터는 보통 <code>kubernetes.io/metadata.name={namespace}</code> 라벨이 있다.
* NetworkPolicy에서 <code>namespaceSelector</code>는 네임스페이스의 레이블을 사용한다. kubeadm 기반 클러스터는 보통 <code>kubernetes.io/metadata.name={namespace}</code> 레이블이 있다.


==해결==
==해결==
81번째 줄: 81번째 줄:


==참고/주의==
==참고/주의==
* 본 정책은 <code>default</code> 네임스페이스의 파드 중 <code>level=100x</code> 라벨에만 적용되며, Egress만 제한/허용한다.
* 본 정책은 <code>default</code> 네임스페이스의 파드 중 <code>level=100x</code> 레이블에만 적용되며, Egress만 제한/허용한다.
* DNS 허용은 목적지 제한 없이 53/TCP, 53/UDP를 개방한다. 더 엄격히 하려면 CoreDNS 파드가 있는 <code>kube-system</code> 네임스페이스와 파드 셀렉터를 사용해 특정 대상으로 한정할 수 있다.
* DNS 허용은 목적지 제한 없이 53/TCP, 53/UDP를 개방한다. 더 엄격히 하려면 CoreDNS 파드가 있는 <code>kube-system</code> 네임스페이스와 파드 셀렉터를 사용해 특정 대상으로 한정할 수 있다.
* CNI 플러그인(Calico, Cilium 등)에서 NetworkPolicy 기능이 활성화되어 있어야 정책이 적용된다.
* CNI 플러그인(Calico, Cilium 등)에서 NetworkPolicy 기능이 활성화되어 있어야 정책이 적용된다.

2025년 9월 24일 (수) 20:57 판

1 개요

Killer Shell CKA - NetworkPolicy Misconfigured
  • https://killercoda.com/killer-shell-cka/scenario/networkpolicy-misconfigured
  • 요구사항
    • Namespace default에서 레이블 level=100x를 가진 모든 파드가, Namespaces level-1000, level-1001, level-1002 내 레이블 level=100x를 가진 파드들과 통신할 수 있어야 함
    • 위 요구는 Egress(아웃바운드) 허용을 의미
    • DNS(53/TCP, 53/UDP)도 허용되어야 함

2 사전 확인

레이블과 테스트 리소스를 확인한다.

controlplane:~$ kubectl get ns --show-labels
controlplane:~$ kubectl get pod -A --show-labels
controlplane:~$ kubectl get svc,pod -A --show-labels | grep tester

기존 네트워크정책 확인:

controlplane:~$ kubectl -n default get networkpolicy np-100x -o yaml

3 문제 원인

  • 기존 NetworkPolicy의 namespaceSelector 중 하나가 잘못된 네임스페이스 레이블을 가리키고 있어 level-1001로의 통신이 차단됨
  • NetworkPolicy에서 namespaceSelector는 네임스페이스의 레이블을 사용한다. kubeadm 기반 클러스터는 보통 kubernetes.io/metadata.name={namespace} 레이블이 있다.

4 해결

NetworkPolicy를 올바르게 수정한다.

controlplane:~$ kubectl -n default edit networkpolicy np-100x

수정 예시(YAML):

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: np-100x
  namespace: default
spec:
  podSelector:
    matchLabels:
      level: 100x
  policyTypes:
  - Egress
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: level-1000
      podSelector:
        matchLabels:
          level: 100x
  - to:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: level-1001   # CHANGE: 올바른 네임스페이스로 수정
      podSelector:
        matchLabels:
          level: 100x
  - to:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: level-1002
      podSelector:
        matchLabels:
          level: 100x
  - ports:
    - port: 53
      protocol: TCP
    - port: 53
      protocol: UDP

5 검증

아래 호출들이 성공해야 한다.

controlplane:~$ kubectl exec tester-0 -- curl tester.level-1000.svc.cluster.local
controlplane:~$ kubectl exec tester-0 -- curl tester.level-1001.svc.cluster.local
controlplane:~$ kubectl exec tester-0 -- curl tester.level-1002.svc.cluster.local

6 참고/주의

  • 본 정책은 default 네임스페이스의 파드 중 level=100x 레이블에만 적용되며, Egress만 제한/허용한다.
  • DNS 허용은 목적지 제한 없이 53/TCP, 53/UDP를 개방한다. 더 엄격히 하려면 CoreDNS 파드가 있는 kube-system 네임스페이스와 파드 셀렉터를 사용해 특정 대상으로 한정할 수 있다.
  • CNI 플러그인(Calico, Cilium 등)에서 NetworkPolicy 기능이 활성화되어 있어야 정책이 적용된다.

7 같이 보기

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}