인프라/k8s

쿠버네티스 간단 정리

minhan2 2021. 7. 21. 19:55
728x90
반응형

궁금했던 질문들과 공부했던것을 정리하는 중입니다.

예전에는 서버를 애완동물로써 관리를 해왔는데, 이제는 가축으로 관리를한다.

애완동물은 회사 내의 서버, Monolithic구조, 가축은 Cloud 서버, MicroService Architecture 라고 생각해야한다.

하나하나가 소중하게 보살펴줘야하는 서버였지만, 이제는 기업형 목축을 하듯 막 다루는 느낌이 있다.(적당히)

나도 기업형 목축을 위해서 쿠버네티스를 공부하게 되었다.

쿠버네티스란?

CNTF(Cloud Native Computing Foundation)의 오픈소스중 하나이며, 첫번째 졸업 프로젝트이다.

https://www.cncf.io/projects/

[Graduated and incubating projects | Cloud Native Computing Foundation

View on the CNCF landscape View on the CNCF landscape CNCF projects have a maturity level of sandbox, incubating, or graduated, which corresponds to the Innovators, Early Adopters…

www.cncf.io](https://www.cncf.io/projects/)

쿠버네티스는 컨테이너 오케스트레이션 이다.

다수의 서버(하드웨어) 위에서 컨테이너의 전반적인 라이프 사이클을 관리해주는 플랫폼이다.

- 실행 및 배포

- 이중화와 가용성 보장

- 수평확장 및 축소를 관리(오토 스케일링, 로드밸런싱)

- 스케줄링 담당

- 네트워크 설정을 담당(Service)

QA/1 - 컨테이너란?

각각의 컴퓨터마다 운영체제가 다르고, 같은 운영체제라도 버전이 다르면 배포에 문제가 생기는 경우가 있다.

잘못된 라이브러리가 있거나, 버전이 다르거나, 운영체제 안의 날짜, 인가, 인증에 대한 권한.. 등 개발자가 개발하고 있는 환경과 서버의 환경은 다를수 있는 경우가 매우 많고, 그럼으로써 개발환경에서 잘 돌아가던 서비스가, 실서버에서 배포를 할시에 실패하는 경우도 많을수 있다.

가장 간단한 설명은, 같은 환경에서 개발과 배포를 진행할수 있게해주는 가상 공간이다.

QA/2 - 그럼 VMWARE나 virtualbox, virtual machine .. 등이랑 다른게 무엇인가?

Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼이므로, OS(Operating System)을 가상화하여 동작한다.

Virtual Machine는 특정 hardware의 resource를 할당하여, Physical hardware을 추상화하여 동작한다.

하나의 Machine 위에서 여러 개의 VM이 동작하고, 각각 VM은 OS,binary & Library file이 있어야 한다.

그렇기 때문에 이로인해서 저장공간이 하나의 Machine위에 동작하는 VM이 증가할수록 낭비가 심해진다

하지만, Docker의 Container 구조는 Application layer에서 종속되는 패키지 코드를 추상화 하여 동작한다.

즉,Host OS 위에서 Docker가 동작하여 여러개의 App 형태로 동작을 하는것이다.

그렇기 때문에 VM의 문제점이었던 자원 할당에 대한 문제점도 다른 컨테이너와 함께 OS Kernel을 공유할 수 있어 문제점을 보완할 수 있고 저장공간이 별개로 필요하지 않기 때문에 저장공간 또한 낭비를 막을 수 있음.

QA/3 - 와! 그런게 모든 운영체제에서 작동할수 있는건가?

LINUX는 당연히 가능하다. (NameSpace와 Cgroup지원 ).

그리고 리눅스에서 사용하는 도커의 컨테이너는, 실제 LINUX서버와 성능차이가 없다. (자원 누수가 거의 없음)

다만, Windows는 Hyper-v, Mac은 Mac xhyve를 사용한다.

이 말은, 결국 가상화된 OS(Linux)를 작동 시키고, 그위에서 namespace와 cgorup을 작동시키는것이기때문에, 제성능을 내지 못한다.

QA/4 - Cgroup ? namespace?

첫 번째로는 리눅스 네임스페이스(namespace)로 각각 컨테이너에서 실행된 프로세스가 시스템(user, 파일, 네트워크, 호스트명, 프로세스 등)에 대해서 독립되어 서로 충돌하지 않도록 하는 기능이다.

독립적인 공간을 제공하고 서로가 충돌하지 않도록 하는 기능을 갖고 있습니다.

그 다음으로는 리눅스의 cgroups를 사용해 각각의 컨테이너(프로세스)가 사용할 수 있는 시스템 리소스(CPU, 메모리, network,I/O, device)를 제한해 준다. cgroups으로 리소스 사용이 제한된 각 컨테이너는 다른 컨테이너에게 예약된 리소스를 사용할 수 없다.

이는 해당 프로세스가 별도의 OS에서 실행될 때와 비슷한 효과를 줄 수 있다.

namespace와 cgroups. 이 두 가지로 각 컨테이너는 Host, 그리고 다른 컨테이너들과 OS 커널을 공유하면서도 격리된 것처럼 사용할 수 있게 되며, 호스트머신 에게는 프로세스로 인식되지만, 컨테이너 관점에서는 마치 독립적인 환경을 가진 가상머신 처럼 보인다.

쿠버네티스의 구조

마스터(컨트롤 플레인)

etcd

메타데이터 저장소입니다. pod 갯수, pod의 상태 등의 클러스터 데이터부터 서비스 동작 정보 등의 세부적인 정보까지 저장되는 Key-Value 형태의 저장소입니다.

kube-controller-manager

namespace, service account, replica 등의 생성/삭제 등을 제어하는 역할입니다.

cloud-controller-manager

cloud-controller-manager는 쿠버네티스의 컨트롤러들을 클라우드 서비스와 연결해서 관리하는 컴포넌트입니다.

kube-apiserver

kubectl에 의해 마스터 노드로 들어온 명령어는 API 서버로 전달된다.
명령어를 각 worker 노드에 전달해준다거나, etcd(로그 저장소 정도로 우선 생각합시다)와 통신하는 등의 역할을 담당한다.

kube-scheduler

pod, service 등 각 쿠버네티스 리소스들을 적절한 노드에 할당하는 역할을 담당한다.

워커(노드)

kubelet

쿠버네티스 클러스터의 각 노드에서 실행되는 에이전트입니다. 각 pod에서 컨테이너가 확실하게 동작하도록 관리하는 역할을 담당한다.

API서버와 통신하며 워커 노드의 컨테이너를 관리한다.

kube-proxy

쿠버네티스 클러스터의 각 노드에서 실행되는 네트워크 프록시이다.

각 노드의 네트워크 규칙을 유지 및 관리함으로써, 클러스터 내부 네트워크 세션(마스터와 노드간)이나 클러스터 바깥에서 파드로 네트워크 통신을 할 수 있도록 만드는 역할을 담당한다.

쿠버네티스는 어떻게 사용해야할까?

(출처:맨텍)

이 모든게 있어야 하나의 쿠버네티스 생태계를 구축하였다 할수 있다.

 

쿠버네티스의 오브젝트들

쿠버네티스를 어째서 사용해야하는가?

바라는 상태(Desired State)

Q&A)

1. yaml파일은 도대체 무엇이고, 어디서 나온걸까?

2. yaml 을 어떻게 사용해야하는건가?

3. 쿠버네티스의 apiVersion은 왜 있으며, 어째서 선언해줘야 하는걸까?

4. kind, metadata, spec 은 무엇인가?

4. Container가 있는데 왜 POD을 써야하는걸까?

5. 볼륨이 다양한 이유는 무엇이며, 어떨때 어떤 볼륨을 써야하는걸까?

7. 자원 할당을 왜 해줘야하는걸까? 그냥 없이 사용하면 어떻게 되는걸까?

8. 자원할당은 어떻게 사용해야하는건가?

- cpu는 core 단위로 할당. (0.5, 1 등)

- memory는 byte 단위로 할당합니다. (Ei, Pi, Ti, Gi, Mi, Ki)

cpu나 memory의 limit 값을 초과할 경우 Pod가 Restart 되므로 이를 사전에 막기 위해 Kubernetes에서는 HPA(Horizontal Pod AutoScaler)를 적용하여 특정 임계치에 도달할 경우 Pod를 증가시켜 limit에 도달하지 않도록 방지하며, 부하를 분산하는 방식으로 오토스케일 아웃을 수행합니다.

이때 Scale Out 조건으로는 Request 값을 기준으로 모든 Pod의 평균이 임계치에 도달했을 경우 Auto Scale Out이 적용됩니다.

728x90
반응형