res.end(`<h1>Docker Container ID -> ${os.hostname()}</h1><br><h1>Server IP -> ${req.socket.localAddress}</h1><h1>Client IP -> ${req.socket.remoteAddress}</h1><br>Container Tag -> Update_20200916`);
각 Pod들이 고유의 IP를 갖고 있기는 하지만, 그 IP들은 서비스의 도움없이 클러스터 외부로 노출되어질 수 없다. 따라서 다음 방식을 통해 내부 또는 외부로의 노출을 검토해야 한다.
1.**CluserIP**
ClusterIP는 `기본 값`이며, 클러스터 내에서 내부 IP 에 대해 서비스를 노출해준다. 이 방식은 오직 클러스터 내에서만 서비스가 접근될 수 있도록 해준다.
2.**NodePort** <= Pick
NAT가 이용되는 클러스터 내에서 각각 선택된 노드들의 동일한 포트에 서비스를 노출시켜준다. <NodeIP>:<NodePort>를 이용하여 클러스터 외부로부터 서비스가 접근할 수 있도록 해준다. **ClusterIP의 상위 집합**이다.
3.**LoadBalancer**
지원 가능한 경우 기존 클라우드에서 외부용 로드밸런서를 생성하고 서비스에 고정된 공인 IP를 할당해준다. **NodePort의 상위 집합**이다.
4.**ExternalName**
이름으로 **CNAME 레코드**를 반환함으로써 임의의 이름(스펙에서 externalName으로 명시)을 이용하여 서비스를 노출시켜준다. 프록시는 사용되지 않는다. 이 방식은 **kube-dns 버전 1.7 이상에서 지원 가능**하다.
> 검증에서는 NodePort를 사용하며, 포트는 **32000/tcp**으로 고정한다. 왜냐하면, Pod 재실행 시 이 포트는 `Random`(기본 값: 30000~32768)하게 변경되기 때문이며, 외부 접속은 Apache Proxy를 사용한다. 이는 현재 Swarm 환경과 거의 동일한 구성이다.
```plaintext
Client -> Proxy(Apache) -> Worker01
-> Worker02
-> Worker03
```
# Pod의 확장
위의 5개의 Replica로 구성된 상태에서 다음과 같이 **2 개의 Replica를 추가해서 확장**해 보자.
> HPA(scale-up, scale-down)과 VPA(Resource-up, Resource-down)에 대한 검증을 진행한다.
# Auto Scaling
k8s에서는 **Horizontal Pod Autoscaler**(HPA), **Vertical Pod Autoscaler**(VPA)로 지정한 메트릭을 Controller가 체크하여, 부하에 따라 필요한 Pod의 Replica수가 되도록 자동으로 Pod수를 늘리거나 줄일 수 있는 기술을 지원한다.
-`Pre-Requirement`
k8s에서 Resouce에 대한 현황을 확인하려면, **metric-server가 설치**되어 있어야 한다. 최초의 경우 다음과 같이 설치를 진행한다.
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
```
-**Horizontal Pod Autoscaler**(HPA, 수평)
**HPA**는 metric(System Resource metric)을 관찰한 후 임계치가 넘을 경우 `Pod 개수를 Scale Up 또는 Scale Down`한다. 만약 요구하는 metric에 비해 실행되고 있는 파드의 수가 작다면, 파드의 수를 늘리고(**Scale Up**), 반대의 경우 파드의 수를 줄인다(**Scale Down**). 단, `DaemonSet`과 같이 크기를 조정할 수 없는 경우에는 적용되지 않는다.
HPA가 파드의 수를 늘리거나 줄여서 스케일링 했다면, **VPA**는 `Pod의 요청 리소스를 늘리거나 줄여서 스케일링 하는 방식`이다. 단, HPA와 다르게 Pod에 할당된 리소스는 실행 중에 다시 할당할 수 없기 때문에 스케일링 시 **Pod를 재시작하게** 된다.