탄력적 네트워크
를 Amazon EKS 에서 배치하는 곳을 결정합니다. VPC와 서브넷을 나눌때는 CIDR를 신중하게 고려해야한다. 할당 가능한 IP 개수가 부족해지면 Pod 생성이 안되며 IP가 부족함을 해결하는 방법또한 복잡성이 높고 권장되지 않기 때문이다.
컨트롤 플레인과 작업자 노드 사이
에 흐를 수 있도록 기본 셋팅가용역역 : 1개 이상의 물리 데이터센터를 묶은 논리적인 데이터 센터
즉 가용역역 간에는 독립적인 전원,물리적 보인 등의 시설을 가지며 물리적인 장애가 발생 하더라도 가용역역 간에 영향을 미치지 않는다.
리전 : 가용역역이 2개 이상 구성된 지리적 영역
EKS 클러스터 내부의 Pod들은 각각 IP주소를 가지며 포트를 할당 받는다.
Pod 간의 통신 컨테이너 통신은 아래와 같이 가능하다.
Pod 내부의 컨테이너들은 모두 같은 namespace를 가지기 때문에 NAT 없이도 통신이 가능하다.
각각의 pod는 서로 다른 namespace를 가지고 있을 수 있으며
이런 경우는 위와 다른 방식으로 통신을 한다.
각각의 pod 들은 라우팅 테이블을 가지고 있으며, 노드 역시도 고유한 라우팅 테이블을 가진다. 라우팅 테이블에 알맞은 설정들이 되어 있어서 Linux 가상 이더넷 (veth) 를 통해서 pod와 노드의 네임스페이스간에 터널
을 생성한다.
veth 는 리눅스의 가상 이더넷 인터페이스로 한 쌍으로 만들어져서 네트워크 네임스페이스들을 터널로서 연결 할 수 있다.
서로 다른 노드간의 통신을 위해서는 각각의 Pod에서 노드 외부로 통신을 전달 하기 위해 브릿지 인터페이스를 타고 NAT 처리를 하는 등의 작업이 필요하다.
하지만 CNI 를 사용하여 브릿지 인터페이스를 만들고 컨테이너 네트워크 대역대를 나눠주며 라우팅 테이블을 생성 할 수 있게 되면서 통신이 가능하다.
NAT : 클라이언트의 프라이빗 IP 주소를 퍼블릭 IP주소로 변환하여 요청을 송신, 응답은 반대의 경우로 하는 행위를 처리한다.
CNI : container network interface 로 컨테이너 간의 네트워킹을 제어할 수 있는 플러그인을 만들기 위한 표준
Pod는 동적으로 사라지고 생성되기 때문에 고정적인 Ip를 가지지 못한다. 그러한 문제점을 해결하고 Pod와 통신 하기 위해서는 서비스를 이용 한다.
서비스는 고정된 Ip 주소 및 포트를 가지고 있기 때문에 서비스로 요청을 전달하고 서비스가 연결된 Pod 중 하나로 라우팅 처리를 해주게 된다.
그리고 이러한 서비스는 아래의 4가지 방법으로서 사용 된다.
ClusterIP 서비스는 클러스터 내부에서만 엑세스 할 수 있는 Ip 로
각가의 Pod 들은 clusterIP를 통해서 통신을 진행하며 소개되는 다른 서비스 방식들의 기초가 되는 Ip 입니다.
clusterIp는 전달 받은 트래픽을 설정된 포트의 Pod 로 라우팅 해준다.
라우팅 할 때는 kube-prox의 iptable 규칙을 사용한다.
클러스터 내부에서만 사용 가능한 IP 이기 때문에 외부에서 직접적으로 호출을 할 수 는 없다.
ex)
아래 clusterIp의 80번 포트로 들어온 트레픽은 myapp의 pod중 하나의 9376 포트로 라우팅 된다.
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
type: ClusterIP
ports:
- name: http
protocol: TCP
targetPort: 9376
port: 80
selector:
app: myapp
type: frontend
cluster 내부에 있는 노드에 port 를 열어서 외부에서 직접적으로 호출을 할 수 있다. NodePort를 생성할때 자동으로 ClusterIp도 생성되며 내부에서의 통신은 clusterIp를 통해서 이루어지게 된다.
ex)
아래는 노드의 30008포트가 열려서 외부에서 통신이 가능하며
들어온 트래픽은 clusterIp의 80포트를 통해서
myapp의 pod 중 하나의 80 포트로 라우팅 된다.
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
type: NodePort
ports:
- targetPort: 80
port: 80
nodePort: 30008
selector:
app: myapp
type: frontend
node는 동적으로 사라지고 생성될 수 있기 때문에 고정적인 Ip로 호출이 가능하다고 해도 nodeport만 사용하는것에는 한계가 있다.
클러스터 외부에서 각 노드들로 트래픽을 전달 해주는게 LoadBalance 이며
NodePort와 ClusterIp를 생성하여 활용 한다.
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 80
clusterIP: 10.0.171.239
selector:
app: myapp
type: frontend
status:
loadBalancer:
ingress:
- ip: 192.0.2.127
추가로 서비스마다 로드밸런서를 정의하는것은 쉽지 않기 때문에
Ingress를 활용하여 특정 url 을 기반으로 다른 성격의 서비스를 라우팅 할 수 있다. 이렇게 정의가 된다면 서비스당 로드 밸런서 한개에서 Ingress 당 로드 밸런서 하나로 라우팅이 가능하다.
외부 서비스를 쿠버네티스 내부에서 호출할때 사용 한다.
MSA 구조에서 서비스간의 커뮤니케이션 통제 불편함을 해소하기 위해 나온 개념으로
서비스 간의 통신을 제어하고 표시하고 관리할 수 있는데 특화된 마이크로 서비스를 위한 인프라 계층
이다.
기존의 서비스 아키텍처와 다르게 직접 호출을 하지 않고 자체 인프라 계층의 Proxy를 통해서 호출이 이루어 딘다. 이를 통해서 서비스의 트레픽을 네트워크단에서 통제 할 수 있으며 Client의 요구에 따라 proxy단에서 라우팅 서비스도 가능하다.
Reference
seongjin.me