앞서

이 게시글은 subicura 님의 인프런 유료 강의, "초보를 위한 쿠버네티스 안내서"를 듣고 정리하기 위해 작성했습니다.

https://www.inflearn.com/course/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%9E%85%EB%AC%B8/dashboard

 

초보를 위한 쿠버네티스 안내서 - 인프런 | 강의

쿠버네티스를 1도 모르는 입문자, 초보자를 위한 쿠버네티스 안내서 입니다. 초보자도 이해하기 쉬운 내용과 흐름으로 구성했어요., 데브옵스 입문자라면 주목! 지금, 초보자를 위한 쿠버네티스

www.inflearn.com

 

서버 관리?

서버의 상태를 관리하기 위한 노력 ( 밤에 출근하기 싫다. 갑자기 죽는 서버가 밉다... )

- 첫 번째 노력 : 문서화

  • 환경이 조금 바뀌면 다 바뀌어야 한다.

- 두 번째 노력 : 서버 관리 도구 (CHEF, puppet, ansible ... )

  • 좋기는 한데,,, 서버 관리 도구를 또 배워야 하네.
  • 서버가 복잡해지면 ? 관리도 너무너무너무 복잡해짐.
  • Java 도 써야 하고, Node.js 도 써야 하는데.. 한 서버에서 어떻게 하지?

- 세 번째 노력 : 가상 머신

  • 서버 하나에 가상 머신 여러 개를 띄워서 쓰기 -> 안정적이고 관리도 잘 됨(느리지만..)
  • 특정 vendor 에 의존하게 됨. 그리고 느림..

그리고 이 때, docker 가 등장하게 되는데..

  • 모든 실행 환경을 container 로 바꾸게 됨.
  • 도커만 설치 되어 있으면 어디서든 동작하고, 쉽고, 느리지도 않다. (최고!)

컨테이너의 특징

  • 가상머신에 비해 생성이 쉽고 효율적
  • 컨테이너 이미지를 이용한 배포와 롤백이 간단
  • 언어나 프레임워크 상관 없이, 동일한 방식으로 애플리케이션 관리
  • 개발, 테스팅, 운영 환경은 물론 로컬 PC와 클라우드까지 동일한 환경을 구축
  • 오픈 소스이고, 특정 클라우드 vendor 에 종속적이지 않음.
MySQL, redis, Jenkins, ... 모든 것을 컨테이너로 관리하고 싶은 욕구가 생긴다. => Containerization

도커의 등장 이후,

  1. 개발자가 코드 작성
  2. 빌드
  3. 컨테이너화
  4. 실행!

의 과정으로 개발이 이뤄지게 되었다. 드디어 편해졌나?

모든 걸 컨테이너화 하긴 했는데...

  • 컨테이너가 점점 많아지면..?
  • 4개일 때는 괜찮았는데, 100개, 1000개, Integer.MAX_VALUE 개가 된다면..? 어떻게 관리함???

도커 그 이후

배포는 어떻게?

  • 도커 서버가 많아지면 ? 하나하나 실행하기가...
  • 컨테이너가 실행되지 않는 서버도 생긴다.
    • 그럼 당연히 비어있는 서버에 실행하는 게 좋은데,
    • 어떤 게 비어있지??
  • v1 -> v2 로 업데이트를 힘들게 서버 하나하나 접속해가며 했는데, 오류가 나서 롤백을 해야 한다

서비스 검색은 어떻게?

프록시가 있고, 컨테이너를 연결해줄 때, 컨테이너가 늘어나면 ?

  • 생각할 수 있는 것 : 로드밸런서 붙이기
  • 마이크로서비스가 유행하면서, 점점 컨테이너가 많아지는 데, 이럴 때 마다 도커 서버 주소를 추가해주고, 어떤 건 삭제하고... 일련의 과정이 너무 힘들다.

서비스 노출은?

기존의 방식

  • public 영역에 nginx 같은 프록시 서버를 두고, 들어오는 host 에 따라서 private 영역의 내부 서버에 연결하는 방식
  • 마찬가지로, 서버 하나 추가되면 nginx conf 파일 들어가서 추가해주고.. 귀찮다

모니터링은??

어떤 서버가 죽어버리거나, 느려져버리면.. 그게 하필 새벽이라면..

명절을 앞둔 서버 개발자의 모습

복잡한 컨테이너 환경 효과적으로 관리하기 위한 도구가 필요해!

Container Orchestration 의 등장

  • 서버 관리자의 일을 대신 해주는 도구
  • 특징
  1. Cluster
    1. 중앙제어(Cluster)
      1. node 1번에는 뭐가 있고, 얼마의 리소스가 있고, 2번에는...
      2. 이게 많아지면 ? 사람이 알고 있기에는 한계가 있다.
      3. 이 많은 node 들을 cluster 라는 단위로 묶어서 관리한다.
    2. 상태관리(State)
      1. app1 이라는 이미지를 replicas 2로 설정하면 2개 뜨게, 3으로 설정하면 3개 뜨게 함.
      2. 3개인 상황에서 하나가 문제가 생기면, 죽이고 하나를 새로 띄워주는 것
    3. 배포관리(Scheduling)
      1. 어느 서버가 여유있는 지 찾아서, 새로운 앱을 띄울 때 그 서버에 띄워주거나, 혹은 여유 있는 서버가 없으면 서버 하나 새로 띄워주는 것
    4. 배포 버전관리(Rollout-Rollback)
      1. { version : "v2" } 로 하면 v2 로 모두 바뀌고, v1 으로 하면 모두 바뀌게 중앙에서 처리해주는 것
    5. 서비스 등록 및 조회(Service Discovery)
      1. 서버가 x.x.x.100 에 뜨면 master node 에 등록되고, 101에 하나 더 뜨면 또 등록됨.
      2. 설정 변경 시 프로세스 재시작을 자동으로 해줌.
    6. 볼륨 스토리지(Volume)
      1. 1번 노드는 NFS 에 연결, 2번 노드는 AWS EBS 에 연결, 3번 노드는 ...
      2. 손으로 일일히 할 수 있지만, 설정으로 관리해줄 수 있음.

Container Orchestration 은 하나의 개념이다.

다양한 게 생겼고, docker 에서 만든 docker swarm 이란 것도 있다. 하지만 kubernetes 가 암묵적인 표준이 되어버렸다

 

왜 kubernetes 가??

- 1주일에 20억개의 컨테이너를 생성하는 google

- 컨테이너 배포 시스템으로 사용하던 borg 를 기반으로 만듦.

- 유연하고, 어디서든 동작하며, 오픈소스이다.

- 무한한 확장성 : 머신러닝, CI/CD, 서비스메시, 서버리스 등... k8s 가 하나의 플랫폼이 되어버렸다.

- 도커도 쿠버네티스 지원하고, 아마존, azure, google 도 다 지원하게 되었다.

 

사실상의 표준(de facto) 이다.

 

마치며

- subicura 님의 강의력이 너무 좋더라구요. 그래도 제 머리가 미천하여 한 번 듣고는 기억을 못할 것 같아서 작성하게 되었습니다. 혹시 문제가 된다면 삭제하겠습니다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기