Introduction
ㅇㅇ
## network policy란?
서로 통신 규약 만들어주는거임
## 공식문서 & yaml양식
Network Policies
If you want to control traffic flow at the IP address or port level (OSI layer 3 or 4), NetworkPolicies allow you to specify rules for traffic flow within your cluster, and also between Pods and the outside world. Your cluster must use a network plugin tha
kubernetes.io
여기가 공식문서다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
이게 yaml양식이다.
기본적으로 network policy는 네임스페이스 안에 생성이 되는것 같다.
그리고 spec부분에 먼저 pod selector라고 원하는 pod들을 선택해서 network policy를 만들어주는거다.
# ingress
이건 기본적으로 해당 pod에 들어오는 inbound트래픽을 말한다.
얼마전 방화벽 설정하면서도 봤는데
내 컴퓨터 네트워크에 어떤 inbound트래픽을 허용할거냐 말거냐 이런걸 설정해줄 수 있다.
이걸 pod들도 적용할 수 있는거다.
yaml파일을 보면
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
cidr에 네트워크 대역대가 적혀있다. 172.17.0.0/16에 있는 모든 ip의 inbound트래픽을 차단한다는거다.
다만 172.17.1.0/24대역대에 있는 아이피는 제외한다는거다.
서브넷마스크 16인 아이피대역대가 24대역대를 포함하니까 저렇게 예외를 만들어놓은거임
또 namespaceselector도 있는데 project: myproject라는 라벨링이 되어있는건 허용한다는거다.
pod는 role: frontend라벨링 된 pod에서는 inbound트래픽을 허용한다는거다. 아마 저 yaml양식은 backend pod인듯?
포트는 6379번 포트를 허용한다는것.
# egress
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
ipBlock에 있는 아이피대역으로 나가는 outbound트래픽만 허용한다는것.
port는 좀 헷갈리는데 5978포트로 나가는 트래픽만 허용한다는것이다.
## 그냥 default namespace에 모든 pod가 통신안되게 하기
현재 default에 있는 pod는 서로 통신이 가능한 상태이다. 이게 기본적인 상태이다.
다른 name space에서 들어오는 트래픽, 서로 다른 pod끼리도 서로 네트워크 통신이 가능하다.
이걸 전부다 막아버리는 설정을 해보자.
이런식으로 만들거다.
kubectl run muzzi --image=nginx --restart=Never -- sh -c 'echo "muzzi web" > /usr/share/nginx/html/index.html && nginx -g "daemon off;"'
kubectl run dori --image=nginx --restart=Never -- sh -c 'echo "dori web" > /usr/share/nginx/html/index.html && nginx -g "daemon off;"'
테스트용 muzzi dori pod들을 만들어주자
dori web에서 muzzi web에 curl을 날리니 잘 동작되는걸 볼 수 있다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
spec:
podSelector: {}
policyTypes:
- Ingress
모든 pod가 ( {}부분 )에 ingress를 제어하겠다 하면, 저렇게 그냥 모든 통신이 막히는 network policy가 생성된다.
이걸 만든 후 다시 pod에서 통신테스트를 해보자.
통신이 안되는걸 확인할 수 있다.
아 참고로 난 다 막힌줄 알았는데 그냥 컨트롤플레인에서 muzzi pod에 curl 요청보내니 되더라.
네트워크 정책이 있더라도 이건되는데 음 이건 k8s네트워크 구조를 좀더 알아야하거나 그냥 관리상 정책이 노드 커맨드라인에서는 안막아놓은듯?
시간이없어서 걍 넘겨봄
## dns포스팅에서 서로 다른 네임스페이스에서 통신되던거 안되게하기
따배씨 / dns
Introductionk8s의 dns에 대해서 포스팅하려고한다.CKA준비하는 포스팅인데 계속 엘리스의 토끼굴에 빠지게됨 ㅡㅡ# k8s의 dns 구성k8s클러스터에서는 이렇게 서비스에 연결된 pod형식으로 dns서버역할을
jacobowl.tistory.com
이 통신을 막아주는걸 해보자.
각각의 namespace에 muzzi seokgu pod가 잘 있다.
outside의 seokgu pod에서 muzzi pod로 통신이 잘 되는 상태.
k8s에선 서로다른 네임스페이스에서도 서로 통신이 기본적으로 되게 되어있다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-internal-block-external
namespace: default
spec:
podSelector: {} # default 네임스페이스의 모든 Pod에 적용
policyTypes:
- Ingress # Ingress 트래픽에 대해 정책 적용
ingress:
- from: # 같은 네임스페이스에서 오는 트래픽을 허용
- podSelector: {} # default 네임스페이스 내 모든 Pod 허용
이거 network policy정책임.
정책레이어개념을 이해해야하는데 밑에 적어둠. 일단 테스트 해보면
outside ns 의 seokgu에선 muzzi pod와 통신이 안되지만, 같은 default ns의 dori pod에서는 통신이 된다.
참고로 network policy는 모든 트래픽이 허용된다. default-deny-ingress에서 모든 통신을 차단하는 정책을 만들어주고
allow-internal-block-external에서는 같은 ns에서 통신은 허용해주면 우선순위가 범위가 작은것, 허용해주는 식으로 작동되기때문에 이렇게 두가지를 만들어주면 원하는 정책이 만들어진다.
aws에서도 정책의 우선순위가 있는데 이거랑 비슷한듯? aws에서는 모든 inbound는 일단 block해버리는게 default설정이고 여기서 몇가지를 열어주는게 정석인데 k8s는 일단 모든 통신 차단하는걸 만들어줘야하는게 좀 다른듯.
기본적으로 전부 차단하는 정책과 default에서 서로 ingress통신은 허용한걸 두개 둬서 우선순위가 잡히니까 정책을 default ns에 두개만들어줬음.
사실 이 정책 레이어 개념을 난 aws 공부할때 접했던거라 이해가 쉬운데 처음 접하면 좀 어려울듯 하다.
암튼 최종적인 통신구조는 이렇게 되었다.
# muzzi pod만 outside ns의 seokgu pod와 통신되게하고, dori pod는 seokgu pod에서 접근못하게 하기.
일단 그림처럼 필요한 리소스들과 모든 통신을 차단하는 default-deny-ingress network policy를 남겨두었다.
그리고 default ns에 muzzi pod만 outside ns에서 접근가능하게 하는 network policy를 만들어줘야하는데 이걸위해서는 namespace를 명시하기위해 outside ns에 라벨링을 해줘야한다.
muzzi pod 에는 run=muzzi라는 라벨링이 되어있는걸 확인.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: only-muzzi-pol
namespace: default
spec:
podSelector:
matchLabels:
run: muzzi
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
ns: out
ports:
- protocol: TCP
port: 80
podSelector필드에서 무찌파드에 이 network policy를 적용시켜준다고 헀고,
인그레스 룰에서 ns : out이라는 라벨링이 되어있는 네임스페이스만 80번 통신을 허용한다고 해줬다.
포트는 그냥 한번 해봄.
해당 network policy를 만들어주고 seokgu pod에서 muzzi dori pod에 각각 curl 요청을 날려보니 muzzi는 되고 dori는 안된다.
최종적으로 이런그림이 된다.
# 로컬 클러스터에서 먼저 테스트했는데 시발 network policy가 제대로 적용이안된다. 일단 deny 정책이 먹통이됨.
그래서 그냥 kode kloud 실습환경에서 했음.
'k8s > CKA' 카테고리의 다른 글
따배씨&kode kloud / trouble shooting (Worker Node Failure) (0) | 2024.10.29 |
---|---|
따배씨 / pod - multi & side-car & init containers / resource usage (0) | 2024.10.28 |
따배씨 / dns (0) | 2024.10.22 |
따배씨 / persistent volume (0) | 2024.10.20 |
Mock Exam - 2 (0) | 2024.09.24 |