Kubernetes 에서 네임스페이스 내의 Pod 끼리 통신을 허용하고 모든 외부의 접근은 차단 시킬 수 있습니다. 또한 특정 서비스 접근이 필요한 경우 포트를 허용하여 접근하게 할 수 있습니다.
Kubernetes 는 네트워크 방화벽처럼 작동하는 네트워크 트래픽을 허용/거부할 수 있는 네트워크 정책 (NetworkPolicy) 이라는 리소스를 제공합니다. 기본적으로 이 리소스를 사용하려면 먼저 이를 구현하는 Kubernetes Networking 플러그인 (Calico) 을 추가해야 합니다.
1) 들어오는 모든 트래픽 차단
sysdocu 네임스페이스에 들어오는 트래픽을 차단하는 것은 다음과 같습니다.
# vi drop.yaml
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: no-inbound-traffic namespace: namespace_이름 spec: policyTypes: - Ingress podSelector: matchLabels: {}
policyTypes : Ingress 는 들어오는 트래픽만 선택합니다. 참고로 나가는 트래픽 제어는 Egress 으로 변경하거나 추가하면 됩니다.
podSelector/matchLabels : 내용을 비우면 네임스페이스 내의 모든 Pod 에 규칙을 적용합니다. 입력 규칙이 정의되지 않았으므로 모든 것이 차단됩니다.
kubectl apply -f drop.yaml
2) 동일한 네임스페이스 내의 Pod 간 트래픽 허용
sysdocu 네임스페이스 내의 모든 Pod 가 서로 통신할 수 있도록 하려면 네트워크 정책 규칙을 추가합니다.
# vi same.yaml
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-same-namespace-traffic namespace: namespace_이름 spec: policyTypes: - Ingress podSelector: matchLabels: {} ingress: - from: - namespaceSelector: matchLabels: role: role_이름
kubectl apply -f same.yaml
3) 외부에서 들어오는 특정 포트 트래픽 허용
사전에 미리 만들어 둔 웹 애플리케이션 nginx 가 Pod 에서 80 포트로 서비스 되고 있습니다. 이를 공개적으로 액세스할 수 있도록 하려면 다음과 같은 규칙을 하나 더 추가해야 합니다.
# vi allow.yaml
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-port-80 namespace: namespace_이름 spec: policyTypes: - Ingress podSelector: matchLabels: app: nginx ingress: - ports: - port: 80
kubectl apply -f allow.yaml
주의할 것은, 노드의 포트 (30080) 가 아니고, Pod 의 포트 (80) 입니다.
이렇게 모든 Pod 를 선택하는 대신, sysdocu 네임스페이스의 레이블 app: nginx 가 있는 Pod 만 선택합니다. 그런 다음 규칙을 적용하면 누구나 웹 애플리케이션의 포트 80 번에 연결할 수 있습니다.
물론 외부에서 접근하기 때문에 NodePort 30080 으로 접근해야 합니다.
외부 네트워크 PC 에서 테스트 하는 방법입니다.
# curl 115.68.142.4:30080
4) 나가는 트래픽 모두 차단 (선택 사항)
네트워크 정책을 사용하여 트래픽이 나가는 것을 방지할 수도 있습니다.
차단 전에 테스트를 위해 telnet 패키지를 먼저 설치합니다.
Pod 이름은 먼저 확인해 주세요.
# kubectl exec -it nginx-deployment-7c79c4bf97-7wj9r -n namespace_이름 — apt -y install telnet
구글 DNS 를 제외하고 모든 트래픽을 차단하는 설정입니다.
# vi drop.yaml
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: disable-outbound-traffic namespace: namespace_이름 spec: policyTypes: - Egress podSelector: matchLabels: {} egress: - to: - ipBlock: cidr: 8.8.8.8/32 - ipBlock: cidr: 8.8.4.4/32 ports: - protocol: UDP port: 53 - protocol: TCP port: 53
추천 글: GITLAB Ubuntu 22.04 구축
(https://about.gitlab.com/install/#ubuntu)