Container Orchestraion/ K8S/ K8S Object
Container Orchestration
어느 환경에서든 실행 가능한 Container기술이 뜨면서 많은 사람들이 Application을 Container형태로 띄웠습니다.
그렇게 Container가 수 백개~수 천개가 되면서 Container를 관리하기가 힘들어졌습니다.

이런 Container들을 좀 더 잘 관리하기 위해 나온 것이 Container Orchestration.
Container Orchestration이 컨테이너를 스케줄링/클러스터링/서비스 디스커버리/ 로깅 및 모니터링 등의 역할을 해줍니다.
컨테이너 오케스트레이션 도구에는 어떤 것들이 있을까?
kubernetes, Docker Swarm, Apache Mesos 등이 있다
Docker Swarm은 간단하고 설정이 쉽지만 큰 프로젝트에서 사용하기엔..아쉬움이 있다.
Apache Mesos은 대규모 클러스터링을 지원해서 확장성(확장 가능한 노드 개수가 k8s보다 많다.)이 좋다. 하지만 문서나 Reference가 부족...
Kubernetes는 구글이 만들었고, 기능이 풍부해서 가장 널리 사용되는 도구이다,.
Kubernetes가 Container를 관리하려고 하니.. 너무 중구난방이어서 rule이 필요했습니다.
제일 먼저 정한 rule이 k8s는 “너네들이 원하는 걸 정해! 그럼 내가 그걸 유지해줄게!”라고 해서 “Desired State"라는 개념이 등장했습니다.
Desired State는 내가 원하는 상태
예를 들어 나는 CPU 2core자원을 유지해야해, 나는 A라는 집에서 살고 싶어(특정 Node에 배포해줘), 나는 api 요청이 한 번에 몰려서 몰릴 때 Scale Out이 되어야해(HPA) 같은 원하는 상태를 정의할 수 있습니다.
이 원하는 상태를 k8s에게 알려주기 위해서 정의하는 것이 Object입니다.
그래서 Object의 spec(내가 원하는 상태에 대한 스펙)과 status(현재 상태)라는 값을 가집니다.
Kubernetes Object
k8s Object에는 어떤 것들이 있을까요?
Pod
쿠버네티스에서 실행되는 최소 단위입니다. 독립적인 공간과 IP를 가집니다.
k8s는 Pod 단위로 Container를 묶어서 LifeCycle을 관리합니다.
Namespace
쿠버네티스 클러스터에서 사용되는 리소스들을 구분해서 관리하는 그룹입니다.
Service
서비스는 네트워크 서비스로 노출하는 추상화 방법입니다.
파드는 유동적이기 때문에 접속 정보가 고정되지 않으므로, 파드 접속을 안정적으로 유지하기 위한 기능입니다.
Pod는 수시로 생겼다가 삭제되면서 접속정보(IP:Port)가 계~속 바뀝니다.
이 놈인줄 알고 호출했는데 어느 새 죽고 다른 애가 되어있고...
그래서 Pod를 네트워크 상에 찾을 수 있도록 Pod와의 연결 고리를 만들어 주는 것이 Service
Service를 Pod와 어떻게 연결 지을까? Service를 정의할 때 필요한 요소는?
Service Type: 어떤 방식으로 Pod를 외부에 노출 시킬 지에 대한 Type에는 여러 종류가 있습니다.
1. ClusterIP(default): 클러스터 내부에 IP에서 서비스를 노출하여 클러스터 내에서만 서비스에 접근하고자 할 때 쓰는 방법입니다
- 같은 namespace에 있는 Service는 http://<Service Name>:<Service Port>로 접근할 수 있습니다.
2. NodePort: 각 노드의 IP에 특정 Port를 붙여서 서비스를 외부로 노출 시키는 방법입니다.
- NodePort를 지정하지 않는 다면 k8s 가 자동 배정합니다. 30000~32767 사이 port가 배정됩니다.
- NodePort를 직접 지정하고 싶다면 Service.yaml에 nodePort에 값을 지정하면 됩니다. (단, 30000~32767 사이 port로)
- 이 NodePort 타입이 왜 있을까? 언제 필요할까?
- DB(oracle, postgresql)는 TCP 통신이라서 ingress 처리가 불가능해서 nodeport를 사용함
3. LoadBalancer: 외부의 LoadBalancer를 사용하여 서비스를 외부로 노출합니다. (Cloud에서 제공하는 물리적인 Load Balancer를 사용하기 위한 설정이라고 보면 됩니다.)