[Kubernetes] Kubernetes NetworkPolicy 설명과 실습
```
[k8s] Kubernetes NetworkPolicy 설명과 실습
```
이번 글을 통해 배워갈 내용
- kubernetes network policy 설명
- NetworkPolicy를 설정하지 않은 경우 모든 podb 에서 poda 로 접근
- 특정 파드에서만 접근을 허용하고자 하는 경우
- 특정 네임스페이스의 특정 파드에서만 접근을 허용하고자 하는 경우
- 특정 네임스페이스의 모든 파드에서 접근을 허용하고자 하는 경우
- 클러스터 외부의 특정 서버로부터 접근을 허용하고자 하는 경우
- 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 같은 명령어를 사용해 컨테이너 내 연결을 점검합니다.
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
참조 및 인용
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Kubernetes etcd backup 과 restore 설명과 실습 (0) | 2024.10.09 |
---|---|
[Kubernetes] Kubernetes CRD 와 CR 설명과 실습 (1) | 2024.09.20 |
[Kubernetes] Kubernetes Configmap 설명과 실습 (0) | 2024.09.19 |
[Kubernetes] Kubernetes Taints,Toleration and affinity 설명과 실습 (0) | 2024.09.18 |
[Kubernetes] Kubernetes Volumes 설명과 실습 (1) | 2024.09.16 |