IT/CKA

CKA 준비과정 - Networking (4) / Service Networking

Primes 2023. 7. 14. 17:59
728x90

앞서 파드 네트워킹에 대해 학습했다. 노드 안에서 네트워크를 어떻게 구성하는지와, IP 주소를 할당받는지 등 파드가 서로 통신할 수 있는 네트워크를 구성하는 과정에 대해 알아보았다.

각 파드는 IP를 할당받게 되고, IP 또는 서비스 이름을 통해서 통신할 수 있다. 다만, 파드와 파드는 직접적으로 소통할 수 있도록 구성하는 경우는 거의 없다. 별도의 서비스를 생성하여 통신을 구성하게 되는데, 위의 그림에서는 주황색 삼각형 서비스를 생성하고 해당 서비스에 IP와 서비스 이름을 부여하였다. 

다른 파드들은 이 서비스를 통해서 10.244.1.3 파드에 접속할 수 있게 된다. 다만, 클러스터 외부에서는 접속할 수 없다.

이러한 역할을 하는 서비스를 Cluster IP 라고 부른다. 반면, 외부에서도 접속할 수 있는 서비스는 NodePort 라고 한다.

 

이제 서비스는 어떻게 IP를 할당받고 서비스는 각 노드의 포트를 통해 서비스를 제공하는지와 같은 부분들을 알아본다.

kubelet 을 통해 노드에 파드들을 생성한다. kube-apiserver 로부터 request가 들어오면, 노드 내에 파드를 생성하고 서비스를 구성한다. 이 때, CNI 플러그인을 호출해 파드에 맞는 네트워크 구조를 구축한다.

또한 동시에 각 노드에 존재하는 kube-proxy 는 kube apiserver 가 서비스를 생성할 때 같이 동작하여 요청을 받아 서비스 생성을 수행한다.

 

서비스가 생성되면 IP:Port가 서비스에 할당된다. 이는 kube-proxy가 포워딩 룰을 생성함으로써 외부 사용자가 파드에 접근할 수 있도록 설정한다.

 

kube-proxy 에서 Forwarding rule 생성 시, 3가지 모드 중 하나를 선택할 수 있다.

kube-proxy --proxy-mode [userspace | iptables | ipvs] ...

userspace / iptables / ipvs 세 옵션 중 하나를 선택할 수 있다.

쿠버네티스 초기에는 userspace가 기본 옵션이었으나, 현재는 iptables 가 기본 옵션이며 ipvs로 넘어갈 추세로 보인다.

userspace

=> 클라이언트로부터 cluster ip 를 통해 요청이 들어오면 kube-proxy는 라운드 로빈 방식으로 각 파드에 요청을 전달한다.

kube-proxy 가 요청을 받고 전달하는 것 까지 모두 담당하게 된다.

클라이언트 - Cluster IP(iptables) - kube proxy - pod

라운드 로빈 방식으로 전달하며 요청 전달 실패 시 다음 pod로 자동으로 전달한다.

 

iptables

=> 해당 모드에서 kube-proxy는 userspace 모드와는 다르게, iptables의 관리만 한다. 즉 kube-proxy가 클라이언트로부터 직접 요청을 받지 않는다. 클라이언트의 요청은 모두 iptables를 따라 파드로 전달된다. 

클라이언트 - Cluster IP(iptables) - pod 의 구조로, userspace 와 다르게 kube-proxy를 거치지 않아 성능이 더 좋다.

다만 userspace와 다르게 요청을 실패하면 다른 pod에 자동으로 시도하지는 않는다.

 

IPVS(IP virtual server)

=> 리눅스 커널에 탑재되어 있는 L4 로드밸런싱 기술이다. 노드 내에 리눅스 커널의 네트워크 프레임워크인 Netfilter가 설치되어야 한다. 커널 레벨에서 작동하고, 데이터 구조를 해시 테이블 방식으로 저장하기 때문에 가장 빠른 성능을 자랑한다. 또한, 로드밸런싱 알고리즘을 다양하게 제공한다. 제공하는 알고리즘은 아래와 같다.

rr (round-robin) : 순서대로 할당

lc (least connection) : 커넥션 수가 가장 작은 노드에 할당

dh (destination hashing) : 목적지 IP주소로 해쉬값을 계산해 할당

sh (source hashing) : 출발지 IP 주소로 해쉬값을 계산에 할당

sed (shortest expected delay) : 응답 속도가 가장 빠른 노드에 할당

nq (never queue) : 응답 속도가 빠른 서버들 중, 활성화 된 노드가 0인 서버를 우선함

 

할당되는 주소는 --service-cluster-ip-range 옵션에서 결정한 범위 내에서 할당된다.

default 값은 10.96.0.0/12 이다.

유의할 점은, 네트워크의 범위가 겹치면 안된다.

 

iptable -L -t nat | grep db-service

위 명령어로 iptable을 확인할 수 있다.

 

위와 같이 10.103.132.104:3306 으로 인입된 트래픽은 10.244.1.2:3306 으로 포워딩하는 것을 확인할 수 있다.

또한, kube-proxy의 로그를 확인해보면 iptable 생성의 로그가 남아있는 것도 볼 수 있다.

 

반응형