Devops 엔지니어 솔렐레 IT

[도커/쿠버네티스 기초] Kubernetes - 쿠버네티스 개념, VM vs Container, Master / Node 본문

Devops 엔지니어가 알려주는 클라우드 지식/Docker, Kubernetes

[도커/쿠버네티스 기초] Kubernetes - 쿠버네티스 개념, VM vs Container, Master / Node

솔렐레_ 2020. 11. 20. 09:00


안녕하세요. 솔렐레입니다.
쿠버네티스에 대한 정리를 해나갈 예정입니다. 점점 더 학습을 진행해서 부족한 부분은 추가하고 잘못된 부분이 있다면 수정하면서 포스팅을 이어나갈 계획입니다. 그럼 시작합니다.


트래픽과 자원을 미리 예측하기가 어려워지고 여러 서비스를 운영한다면 더욱 운영하기 힘들어지고 있습니다. 이에 따라 클라우드 기술과 컨테이너를 활용한 기술이 발전하게 되었습니다. 운영의 규모가 커질수록 쿠버네티스의 효율이 더욱 좋아지게 되는데요. 그 이유에 대해서 설명드리겠습니다.

1. 자동화 기능
- 오토 스케일링
- 오토 힐링
- 무중단 서비스 가능

2. VM vs Container
- VM: Host OS 위에 Hypervisor(ex. vmware, KVM, Virtual Box)에 별도 Geust OS를 설치한 후 사용이 필요합니다. 각각의 VM에 프로그램을 설치하고 Application을 구동합니다. 개발적인 측면에서는 한 서비스를 만들 때 한 프로그래밍 언어를 사용하여 여러 모듈들이 한 서비스로 같이 구동됩니다.

- Container: 컨테이너는 Host OS위에 docker, rkt 같은 컨테이너 가상화를 시키는 SW를 사용하고 이 위에서 컨테이너를 사용하게 됩니다. 컨테이너는 컨테이너 이미지를 만들게 되고 이 안에는 서비스와 라이브러리들이 포함되어 있습니다. 이 서비스마다 이미지를 각각 관리함으로서 버전 변경이나 소스 변경에 영향을 받지 않습니다. 또한 여러 컨테이너간에 호스트 자원도 분리(linux namespace/cgroup)해서 사용할 수 있도록 Docker가 돕기 때문에 OS에 대한 종속률도 낮출 수 있습니다. 개발적인 측면에서는 서비스를 만들 때 모듈별로 쪼개서 각각의 컨테이너를 관리할 수 있습니다. 또한 각 모듈에 맞는 최적화된 프로그래밍 언어를 선택하여 사용이 가능합니다. 여기서 쿠버네티스는 Pod라는 개념으로 컨테이너들을 묶어서 관리할 수 있고 한 Pod가 하나의 배포 단위가 됩니다. 따라서 내가 필요한 Pod만 배포 및 확장하여 사용을 할 수 있어 효율적으로 개발이 가능합니다.

 

여기서 중요한 점은 컨테이너는 한 OS를 공유하는 개념이고 VM은 각각의 OS를 띄워야하기 때문에 컨테이너가 속도 측면에서 더욱 빠릅니다. 하지만 VM은 Host OS와 다른 OS를 Geust OS를 통해 설치하여 사용이 가능하지만 컨테이너는 동일 OS만 사용해야합니다. 그리고 보안적인 측면에서도 Guest OS가 위험에 노출되더라도 각각 VM에 영향이 없지만 컨테이너는 OS영역이 위험해질 경우 전체적인 컨테이너가 위험에 빠질 수 있다는 단점이 있습니다.

3. Master, Node
쿠버네티스는 Master 서버 1대와 그 외에는 Node로 구성이 되어 있습니다. Master는 쿠버네티스의 전반적인 기능들을 컨트롤하는 역할이고 Node는 자원을 제공하는 역할을 합니다. 만약 내가 클러스터 전체의 자원을 늘리고 싶다면 Node를 추가하여 늘릴 수 있습니다.

여러 노드는 한 Master와 연결이되고 이를 쿠버네티스 클러스터라고 합니다. 클러스터 내에는 Namespace가 구성되어 각각의 독립적인 환경을 구성해주고 있습니다. Namespace에는 배포 최소단위인 Pod들이 있고 이 Pod들에게 외부에서 연결이 가능하도록 IP를 할당해주는 서비스가 있어서 접근이 가능합니다. 이 서비스는 다른 namespace에 있는 Pod에는 접근이 불가능합니다. 또한 Pod 안에는 여러 컨테이너가 존재합니다. 이 컨테이너 안에는 여러 application이 동작하고 있습니다. 각각의 Pod들은 Volume에 연결되어 데이터를 저장하고 Pod에 문제가 발생했을 경우 Volume 안에 있는 데이터를 통해 재생성이 가능합니다. 또한 Namespace에 ResourceQuota와 LimitRange를 달아서 자원의 양을 한정시키거나 Pod의 수, CPU, Memory를 조절할 수 있습니다. 그리고 환경변수 값을 넣거나 파일을 mount 해줄 수 있는데 이는 ConfigMap이나 Secret을 통해 가능합니다.

컨트롤러는 Pod들을 관리하게됩니다. 컨트롤러에는 Replication Controller/ Replicaset 이 가장 기본적인 컨트롤러로 Pod가 죽으면 감지해서 다시 생성하고 Pod의 scale in/out 을 해주는 역할을 하고 있습니다. 그리고 Deployment는 배포 후 Pod 들을 업데이트 및 문제가 발생했을 때 rollback을 해주는 역할을 합니다. Demonset은 한 노드에 파드가 1개씩만 유지되도록 관리해주고 있습니다. CronJob은 주기적인 특정 Job들을 처리할 수 있도록 도와주고 있습니다.


해당 포스팅에서는 쿠버네티스의 개념을 이해하기 위해 기본적인 내용들을 설명하였습니다. 혹시 관련해서 의견을 주실 분이 있으시면 댓글로 남겨주시면 반영해서 처리하도록 하겠습니다. 감사합니다.

Comments