Ingress: 입구
Egress: 퇴장
이제 쿠버네티스의 네트워크 보안을 살펴보자. 파드와 서비스 세트를 호스팅하는 노드 집합의 클러스터가 있다. 노드마다 IP 주소가 있고 파드마다 서비스도 존재한다.
쿠버네티스 네트워킹의 전제조건
1. 어떤 솔루션을 구현하든 파드가 서로 통신할 수 있어야 한다.
이 네트워크 솔루션에서 모든 파드가 가상 사설 네트워크에 있고 IP나 파드 이름 또는 서비스 이름을 통해 쿠버네티스 클러스터 내 노드를 가로지르며 기본값으로 서로에게 닿을 수 있다.
쿠버네티스는 기본값으로 모든 허용 규칙과 함께 구성된다. 클러스터 내의 어떤 파드나 서비스가 서로에게 접근할 수 있다.
우리는 파드를 통해 앱의 각 구성요소(프론트엔드 웹 서버, 백엔드 API 서버, DB)를 배포한다.
이전 슬라이드에서 논의했듯이 기본적으로 쿠버네티스 클러스터 내에서 세 개의 파드는 서로 통신할 수 있다.
이때, 프론트엔드 웹 서버가 데이터베이스 서버와 직접적으로 통신하는 것을 막기 위해서 Network Policy가 필요하다.
Network Policy은 쿠버네티스 네임스페이스에 있는 또 다른 객체로 파드, 레플리카 셋이나 서비스 처럼 하나 이상의 파드에 네트워크 정책을 연결한다.
이 경우에는 3306 포트 API 파드에서만 Ingress 트래픽을 허용한다. 일단 이 정책이 생성되면 파드의 모든 트래픽을 차단하고 지정된 규칙에 부합하는 트래픽만 허용한다.
replicaset이나 service를 파드와 matchlabels, labels를 통해 링크하는 동일한 기술을 사용한다.
policyTypes에 트래픽이 Ingress인지 Egress인지를 명시하고 규칙을 지정한다.
Network Policy의 정의 파일은 다음과 같다.
이 Network Policy는 진입 트래픽만 격리되고 퇴장 트래픽은 영향이 없다.
네트워크 정책은 네트워크 솔루션에 의해 실행된다. 모든 네트워크 솔루션이 네트워크 정책을 지원하는 것은 아니다.
네트워크 정책을 지원하는지 확인하기 위해 공식 문서를 항상 참조해보길 권한다.
네트워크 정책을 지원하지 않는 솔루션으로 구성된 클러스터에서도 정책을 만들 순 있지만 강요되는 것은 아니다.
백엔드 API 파드를 제외한 다른 소스로부터 데이터베이스 파드로의 트래픽을 허용해서는 안된다.
만약 들어오는 트래픽을 허용하면 그 트래픽에 대한 응답이나 회신이 자동으로 허용된다. 그래서 응답, 회신에 대한 것은 따로 규정하지 않아도 된다.
다음과 같이 네트워크 정책 정의 파일을 작성할 수 있다.
이렇게 작성하면 api-pod를 제외하고 DB 파드로 가는 모든 트래픽을 차단할 수 있다.
네트워크 정책은 기본으로 metadata에 지정된 namespace에 있는 파드(지정된 파드와 동일한 네임스페이스에 있는 파드)만 지정할 수 있다.
만약 다른 네임스페이스의 파드에 도달하고 싶다면 namespaceSelector 영역에 네임스페이스를 지정해주면 된다.
podSelector 없이 namespaceSelector만 지정할 수도 있다.
그럴 경우, 지정한 네임스페이스 내의 모든 파드만 데이터베이스 파드에 도달할 수 없다.
클러스터 외부에서 데이터베이스 파드에 접속할 수 있도록 네트워크 정책을 구성할 수 있다.
ipBlock 영역을 통해 IP 주소를 지정하면 해당 IP의 개체가 DB 파드에 접근할 수 있다.
정리하자면 특정한 파드, 네임스페이스, ip 주소를 지정하기 위해 podSelector, namespaceSelector, ipBlock 영역을 사용하면 된다.
이러한 것들은 개별적인 규칙으로 통과될 수도 있고 하나의 규칙의 일부로 함께 통과될 수도 있다.
이 예제에서는 두 가지 규칙이 있다.
podSelector와 namespaceSelector가 함께 적용되어 첫 번째 규칙이 만들어지고 ipBlock을 통해 두번째 규칙이 만들어진다.
만약 namespaceSelector 앞에 대시를 추가해 규칙을 분리할 수 있다.
첫 번째 규칙은 podSelector에 의해 api-pod와 일치하는 모든 파드가 허용된다.
두 번째 규칙은 namespaceSelector에 의해 prod 네임스페이스 내의 어떤 파드에서든 트래픽이 허용된다.
세 번째 규칙은 파드이든 백업 서버이든 특정 IP를 가진 개체를 허용한다.
반대로 DB 파드에서 백업 서버로 푸쉬해야 한다면 데이터베이스 파드에서 외부 백업 서버로 네트워크를 허용해야 한다.
policyTypes에 Egress를 추가하고 데이터베이스 파드에서 외부 백업 서버로 통신을 허용하는 egress 규칙을 추가해야 한다.
테스트 문제 기록
kubectl get networkpolicies
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: internal-policy
namespace: default
spec:
podSelector:
matchLabels:
name: internal
policyTypes:
- Egress
- Ingress
ingress:
- {}
egress:
- to:
- podSelector:
matchLabels:
name: mysql
ports:
- protocol: TCP
port: 3306
- to:
- podSelector:
matchLabels:
name: payroll
ports:
- protocol: TCP
port: 8080
- ports:
- port: 53
protocol: UDP
- port: 53
protocol: TCP
테스트 통과 완료