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를 파드로 포워딩하게끔 만들어주는 것이다. (각 노드 별로)