메뉴 닫기

Kubernetes 에서 네임스페이스 네트워크 격리 및 특정 포트 허용하기 (Calico)

자동차 열쇠 클로즈업

 

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)

 

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x