DevOps/Kubernetes

[Kubernetes] Kubernetes NetworkPolicy 설명과 실습

kimc 2024. 9. 15. 00:45
반응형

[Kubernetes] Kubernetes NetworkPolicy 설명과 실습


```

[k8s] Kubernetes NetworkPolicy 설명과 실습

```

이번 글을 통해 배워갈 내용

  1. kubernetes network policy 설명
  2. NetworkPolicy를 설정하지 않은 경우 모든 podb 에서 poda 로 접근
  3. 특정 파드에서만 접근을 허용하고자 하는 경우
  4. 특정 네임스페이스의 특정 파드에서만 접근을 허용하고자 하는 경우
  5. 특정 네임스페이스의 모든 파드에서 접근을 허용하고자 하는 경우
  6. 클러스터 외부의 특정 서버로부터 접근을 허용하고자 하는 경우
  7. Best Practices

1. kubernetes network policy 설명

Kubernetes에서 NetworkPolicy는 파드 간의 네트워크 트래픽을 제어하는 규칙을 설정하는 리소스입니다. 

 

이를 통해 특정 파드나 네임스페이스에 대한 접근을 허용하거나 차단할 수 있습니다. 

 

NetworkPolicy는 다음과 같은 기능을 제공합니다:
1. 트래픽 제어

파드에 들어오거나 나가는 트래픽을 허용하거나 차단합니다.

 

2. 레이블 기반 접근 제어:

특정 레이블을 가진 파드만 접근할 수 있도록 설정할 수 있습니다.

 

3. 포트와 프로토콜 지정:

어떤 포트와 프로토콜로 통신할 수 있는지 지정할 수 있습니다.
예를 들어, 데이터베이스 파드에 대해 API 파드만 접근할 수 있도록 설정하면, 데이터베이스에 대한 불필요한 접근을 막아 보안을 강화할 수 있습니다. 

 

NetworkPolicy를 통해 네트워크 접근을 세밀하게 제어하여 클러스터의 보안을 높일 수 있습니다.


2. NetworkPolicy를 설정하지 않은 경우 모든 podb 에서 poda 로 접근

kubectl create namespace myspace
kubectl run poda --image=nginx -n=myspace
kubectl run podb --image=nginx -n=myspace

kubectl get pod -n myspace -o wide
kubectl exec -it poda -n myspace -- sh
curl http://위에서 찾은 아이피주소
kubectl delete namespace myspace --force

 


3. 특정 파드에서만 접근을 허용하고자 하는 경우

특정 파드에서만 접근을 허용하고자 하는 경우
예) podb 에서 poda 로 접근
예) podc 에서 poda 로 접근

kubectl create namespace myspace
kubectl run poda --image=nginx -n=myspace
kubectl run podb --image=nginx -n=myspace
kubectl run podc --image=nginx -n=myspace

cat <<EOF > my-network-policy001.yaml  
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-network-policy001
  namespace: myspace
spec:
  podSelector:
    matchLabels:
      run: poda
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          run: podb
    ports:
    - protocol: TCP
      port: 80
EOF

kubectl apply -f my-network-policy001.yaml

kubectl get pod -n myspace -o wide
kubectl exec -it poda -n myspace -- sh
curl http://위에서 찾은 아이피주소

kubectl delete namespace myspace --force

4. 특정 네임스페이스의 특정 파드에서만 접근을 허용하고자 하는 경우

3번 예시와 같으나
네트워크 설정에 namespaceSelector 추가

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-network-policy003
  namespace: myspace
spec:
  podSelector:
    matchLabels:
      run: poda
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: myspace
      podSelector:
        matchLabels:
          run: podb
    ports:
    - protocol: TCP
      port: 80

 


5.특정 네임스페이스의 모든 파드에서 접근을 허용하고자 하는 경우

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-network-policy005
  namespace: myspace
spec:
  podSelector:
    matchLabels:
      run: poda
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: myspace
    ports:
    - protocol: TCP
      port: 80

 

 

 


 

6. 클러스터 외부의 특정 서버로부터 접근을 허용하고자 하는 경우

외부 아이피 사용

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-network-policy006
  namespace: myspace
spec:
  podSelector:
    matchLabels:
      run: poda
  policyTypes:
  - Ingress
  ingress:
  - from:
    - ipBlock:
        cidr: "192.168.1.1/32"
    ports:
    - protocol: TCP
      port: 80

 

7. Best Practices

모든 파드에 정책 적용: 

클러스터 내 모든 파드가 네트워크 정책의 적용을 받아야 합니다. 정책이 없으면 모든 파드가 자유롭게 통신할 수 있어 보안 위험이 커집니다.

정확한 선택자 사용: 

파드, 네임스페이스, IP 블록 선택자를 가능한 한 구체적으로 설정하여 불필요한 파드가 정책에 포함되지 않도록 합니다.

기본 거부 정책 설정 후 허용 정책 추가: 

기본 "모두 거부" 정책을 설정한 후, 필요한 트래픽 흐름을 허용하는 정책을 추가하여 새로운 파드의 네트워크 노출을 방지합니다.

정책 정기적으로 검토 및 업데이트: 

클러스터가 변화함에 따라 정책을 정기적으로 검토하고 환경에 맞게 수정합니다.

정책 테스트: 

새 정책이 올바르게 작동하는지 확인하기 위해 테스트를 수행합니다. curl이나 ping 같은 명령어를 사용해 컨테이너 내 연결을 점검합니다.

 

 


 

 

 

읽어주셔서 감사합니다

 

무엇인가 얻어가셨기를 바라며

 

오늘도 즐거운 코딩 하시길 바랍니다 ~ :)

 

참조 및 인용

반응형