Cluster Ip : 두 개의 Pod 가 있는 경우, 각 Pod 별로 별도의 Ip 주소를 사용한다. 이들은 서로 간의 통신을 할 경우, 각 Pod 가 서로 다른 Node 에 있다고 가정한다면, 이들을 마치 하나의 네트워크에 연결하기 위한 환경이 필요한데, 이러한 클러스터상에서 서로 다른 노드에 있는 Pod 들간 통신이 가능하도록 하기 위하여 Cluster Ip 를 두게 된다
- 외부와의 통신은 불가능하다
- Cluster Ip 는 터널링, Overlay Network 를 제공해준다
- 로드밸런서 기능을 제공
Node Port : 외부에서 Node 의 특정 Port ( 30000 ~ 32768 ) 에 접근하면, 포워딩을 통해 Node Port Service 의 특정 Port 와 연결하여, 해당 Service 의 특정 Port 와 연결된 Pod 의 Port 와 연결해준다
- Node Port 는 Node 에 직접 접근해야 하므로, 부하 분산을 위해서는 앞에 Load Balancer 를 배치해야 한다
Service 구현시에도 Selector 가 있다
- ReplicaSet 의 Selector : Pod 의 label 을 확인하고, 지정된 개수를 유지하기 위한 것
- Service 의 Selector : 접속된 트래픽에 대하여 어떤 Pod 에게 전달할 하는지에 대한 것
- 즉, Selector 는 관리할 label 을 지정하는 것이다
구현시 Port 를 3 가지 지정해야 한다
- nodePort : 외부에서 Node 에 접속할 Port
- port : Node 로 접속된 트래픽이 전달될 node Port 서비스의 특정 포트
- targetPort : node Port 서비스의 특정 포트에 트래픽이 전달시 최종적으로 전달될 Pod 의 Port
- --- 를 사용하면, 작업을 구분하게 해준다
- 여러 nodePort 를 정의 가능하다. 각 Port 별 name 을 지정해줄 수 있다
- External Traffic Policy 가 Cluster 라고 되어있다. 이는 트래픽을 전달해줄 범위이다
Scale 을 조정해주자
하나의 Pod 만 동작중이다
접속해보면, 해당 Node 의 Pod 는 중지되었지만, 자동으로 다른 Node 의 Pod 에 접속된다. 이는 범위가 Cluster 이기에, Cluster 환경에 있는 다른 Node 의 동작중인 Pod 에 자동으로 트래픽을 보내준다. 이때, Cluster Ip 는 동일하지만, Pod 기준으로 물리적으로 봤을 때, Hop 을 바꾸기 때문에 라우팅이 발생한다
만약, local 로 되어있다면, 같은 Node 상에 있는 Pod 들에게만 전달되며, 만약 Node 에 동작중인 Pod 가 없으면, 다른 Node 로 전달해주지 못하므로 트래픽을 전달 못해준다
- local 로 변경하면, 해당 노드에 있는 포드로만 접속하게 되고, 만약 포드가 없다면 서비스를 받을 수 없게 된다. 하지만 불필요한 라우팅은 없기 때문에 DataCenter 에 부담을 줄일 수 있게 된다
- Local 로 지정했기에, Pod 가 없으면 해당 Node 의 다른 Pod 에게 전달해야 하는데, 다른 Pod 가 없으므로, Pod 가 없는 Node 에 접속하면 페이지에 연결이 되지 않는다
p. 154
- 만약, Ingress 가 여러 도메인을 사용한다면, 각 도메인의 Ip 주소가 다르기에 L4 로드 밸런서의 기능을 사용하고, 한 가지 도메인을 사용하면, 뒤의 Data 를 확인하고 구분해야 하기에 L7 로드 밸런서의 기능을 사용한다
- L7 은 백엔드에서 L4 의 기능도 수행해준다
- 이런 구조이다
- serviceName 은 연결할 서비스 의 이름이다
- servicePort 는 service 의 Port 이다
- rewrite-target 은 접속할 디렉토리를 지정한다. / 로 되어있으면, 기본 디렉토리 이기에 http 서비스의 경우 /var/www/html 을 지정하는 것이다
- rule 의 http 는 서비스하는 유형을 지정하는 것이다. 이는 httpd, nginx 가 아니라 http, https 와 같은 접속 방식을 말하는 것이다
- host 는 관리할 주소를 지정한다
- 이는 인터넷 상의 yaml 파일을 이용해 배포하는 방식이다
- 이 rewrite target 을 사용하지 않으면, 서비스를 구분하는 경로도 같이 요청이 되므로 오류가 난다 ( ingress 요청 : abc/index.html -> 서비스로의 요청 : abc.index.html )
- rewrite target 을 사용한다면, / 라고 설정시 ingress 요청이 abc/index.html 이라면, 서비스의 요청은 / 로 간다. 즉, 서비스 구분 경로는 그대로 두고, 하위 경로만 요청할 수 있다
- $2 로 설정하면, / 뒤에 2 개까지의 경로를 확인하여 서비스에게 /로서 전달한다. 즉 /abc, /abc/dfc 도 모두 / 로 서비스에 요청하여 /index.html 과 같은 하위 경로만 요청해준다
- Ingress 에서 /$2 와 같은 방식으로 하위 주소까지 다 구분이 가능하기에 굳이 앞에 L7 LB 를 사용할 필요는 없다
- 오토 스케일링을 위한 테스트 도구로 apache benchmark 와 gunplot 을 사용하면 좋다