Cloud/Kubernetes
Kubernetes Intro
yellowmarine
2020. 5. 8. 19:54
Kubernetes
Intro
History
Tradition
- 어플리케이션의 리소스를 정확히 파악할 수 없었으므로 자원의 비효율이 많이 발생
- 이를 해결하기 위해 물리 서버를 증설 하는것 외에는 답이 없었다
Virtual Machine
- 단일 서버에서 여러가지 가상화를 통해 어플리케이션을 격리함으로써 리소스 할당에 제한을 둘수 있었다.
- 각 머신은 운영체제를 가지고 있고 격리, 파괴가 아주 쉬움
- 그러나 각각의 VM이 격리 되어있기때문에 유연하지 못하다
- 이 모든걸 OS위의 hypervisor가 통제
Container
-
VM과 다르게 자체 OS를 두지 않고 하나의 OS를 공유 -> 오버헤드가 적고 라이트하다
-
격리성을 최대한 완화, 또 인프라와의 종속성을 끊었기 떄문에 이식이 매우 쉬움
-
보통적으로 Docker가 container를 관리한다
Image
- Container를 구성하는 요소로써 설계도라고 볼 수 있다.
- 기본적인 설정 값들을 미리 설정
- 베이스 이미지 + 유저 이미지가 합쳐저서 컨테이너가 형성된다.
- 이미지들 간에는 베이스 이미지에서 브랜치 형식으로 추가되는 이미지가 생겨나게 된다 -> 메모리가 커지지 않는 구조
What to do?
Service Discovery & Load Balancer
- MSA 같은 상황에 서비스가 원격으로 호출되고 이런 서비스는 동적으로 생성되거나 변경이 일어남 이런 상황에서 서비스 위치를 찾는 기법
- 기본적으로 Service registry를 두어 서비스의 주소값을 미리 저장
- Client side : 클라이언트가 레지스트리에 물어봄
- Server side : 서비스 앞에 로드밸런서를 두고 로드밸런서가 레지스트리로 부터 위치 리턴 후 라우팅
- 이러한건 부하 분산, 보안, 서비스 가능 여부등을 판별하여 제공가능
Kubetnetes Component
구성요소
Control plane
-
Kube-apiserver
- 쿠버네티스 클러스터의 api를 사용할수 있게 해주는 프로세스
- 클러스터로 요청이 왔을때 요청의 유효성을 판단
- 수평적 확장이 가능하기때문에 여러 장비에 호출 가능
-
ETCD
- 고가용성 key-value 저장소
- 백업으로 많이 쓰임
-
kube-scheduler
- 새로운 포드들의 노드 할당에 관여한다
- 하드웨어 요구사항, 어피니티/안티어피니티 조건, 특정 노드 조건 등을 설정 가능
-
kube-controller-manager
- 각각의 컨트롤러가 pod들을 관리 이러한 컨트롤러 관리 역할
- 각 컨트롤러를 하나의 바이너리 파일로 컴파일 시키고, 단일 프로세스로 실행
- 큐에 때려박아서 실행
-
cloud-controller-manager
- 쿠버네티스를 다른 클라우드와 연동시켜주는 역할
- 노드 컨트롤러 : 클라우드 서비스 내에서 노드관리
- 라우트 컨트롤러 : 클라우드 인프라내에서 네트워크 라우팅 관리
- 서비스 컨트롤러 : 클라우드 서비스의 로드밸런서를 생성/갱신/삭제
- 볼륨 컨트롤러 : 클라우드 서비스의 볼륨을 관리
- 쿠버네티스를 다른 클라우드와 연동시켜주는 역할
Node
- kubelet
- 클러스터의 모든 노드에 위치
- 포드내의 컨테이너 실행을 직접 관리
- kube-proxy
- 클러스터 내부에 별도의 가상 네트워크를 설정 관리
- pod간의 통신 가능?
- Container runtime
- 실제 컨테이너가 실행되는 공간
- 도커,rkt등
- Addons
- 클러스터 내부에서 필요한 기능들을 위해 실행되는 pod
- Deployment, replecaset 등에 의해 관리
- Namespace 는 kube-system