CKA 공부 36일차
in Devops on Kubernetes
Service Networking
같은 노드 내의 파드 A와 B가 있다고 해보자.
A가 B에 접근하고 싶다면, B에 서비스를 추가하고 B 서비스에 할당된 IP나 서비스 이름으로 접근이 가능하다.
이렇게 생성된 B 서비스는 클러스터 내에 어떤 파드들도 접근이 가능하다. (즉 서비스의 네트워크는 특정 노드에 한정적이지 않다는 의미이다.)
이러한 유형의 타입의 서비스를
Cluster IP
라 부른다.만약 특정 서비스를 외부 클러스터에서 노출시키고 싶다면,
NodePort
라는 타입의 서비스를 생성함으로써 해결할 수 있다.그럼 과연 어떻게 이 서비스들은 외부의 접근, 내부의 접근을 허용하게 해주는 것일까? 이번 시간에는 파드보다는 서비스에 더 집중해서 알아보도록 하자.
서비스 생성의 원리
kubelet은 각각의 노드에 위치하고, kube-apiserver와 통신하며 파드의 생성을 담당한다.
비슷하게 각각의 노드에 kube-proxy가 구동되는데 이 kube-proxy는 매번 새로운 서비스가 생성되면 행동을 취한다.
파드와 달리 서비스는 특정 노드에 소속되지 않으며 클러스터 범위의 컨셉이다.
파드는 파드가 생성될 때 프로세스, 네임스페이스, 인터페이스를 할당받지만, 서비스는 그렇지 않다.
서비스는
가상의 오브젝트
라고 봐도 무방하다.그러면 이 가상의 오브젝트는 어떻게 IP를 할당받을까?
우리는 어떻게 서비스를 통해 파드 애플리케이션으로 접근할 수 있는 것일까?
일단 서비스가 생성되면 쿠버네티스로부터 pre-defined(아직 정의되지않은) 범위의 IP를 할당받는다.
kube-proxy는 이 IP를 획득하여 각각의 노드의 포워딩 룰에 추가한다.
예를 들어, 10.99.13.178이라는 서비스가 있고 그 서비스가 10.244.1.2의 파드와 연결되어있으면, IP 주소 10.99.13.178이라는 주소로 요청이 오면 10.244.1.2로 보내라는 포워딩 룰을 추가하는 것이다.
물론 단순히 서비스의 IP뿐만은 아니고 포트도 포함이다.
당연히 kube-proxy는 이 서비스가 생성되거나 제거되면 이 룰을 각 노드에서 제거한다.
IP 테이블에 있는 서비스를 조회해보면 k8s가 서비스에게 할당해준 IP가 DNAT에 의해 파드로 전달되는 것을 볼 수 있다.
즉, kube-proxy가 iptable에 서비스의 IP,PORT를 파드로 포워딩하게끔 만들어주는 것이다. (각 노드 별로)