T아카데미 - 컨테이너 오케스트레이션 쿠버네티스 살펴보기
도커가 등장하기 전 서버 운영
1. 자체 서버 운영
- 서버주문 , 서버 설치, cpu 메모리 하드 조립 네트워크 연결, OS설치, 계정설정, 방화벽 설정
- 서버를 설정하기 위해 많은 노력과 시간이 필요함
- 성능이 좋은 걸 미리 구매하고 효율적인 사용을 위해 여러 애플리케이션을 설치
- 단계를 지날 때 마다 명령어를 이용함 ex) cp, mv, rm
- ruby 버전을 변경 하게 되면 이후 모든 상태에 영향이 감 (위험)
- 특정 시점의 서버 상태를 누가 언제 어떻게 작업했는지 알기 어려움
- 서버관리자 = 문제 생기면 다 해결 = 변화를 싫어함 = 확장이 어려움 = 혁신이 어려움
2. 재현 가능한 상태 관리
- Configuration Management
* 명령어를 통한 서버 관리를 지양
* 상태를 관리하는 코드를 이용하여 서버 관리 (설정 파일)
* 선언적 서버 상태 정의
* 서버의 상태가 재현 가능해짐
* 서버 운영의 협업이 가능해짐 (소스관리, 코드리뷰)
- Ansible
3. 가상 머신의 등장
- 하나의 서버에 여러개의 가상 서버를 설치할 수 있음
- 다양한 버전의 java 여러개의 데이터베이스를 쉽게 사용
- 서버의 상태를 이미지로 저장할 수 있음
- 새로운 서버를 만들고 기존 서버의 내용을 복사할 수 있음
- immutable 변하지 않는
* 서버에 설치된 애플리케이션을 새로운 버전으로 업데이트 하면 mutable
* 새로운 버전이 설치된 서버의 상태를 이미지로 만들고 교체하면 immutable
* 기존 상태를 고려할 필요 없이 통째로 서버를 교체
* 생각보다 어렵고 느리고 특정 회사 제품을 써야 함
4. 클라우드
- AWS, Google Cloud, Azura
- 하드웨어 파편화 문제 해결
- 가상화된 환경만으로 아키텍처 구성이 가능해짐
- 이미지를 기반으로한 다수의 서버 상태관리
* 상태관리에 대한 새로운 접근
* 서버 운영의 문제는 여전히 남아있음
- 마치 전기를 사용하는듯 편리함
- 단점
* (보통) 어떻게 만들었는지 모름
* (보통) 처음부터 다시 만들 수 없음
* 관리가 어려움 / 결과만 스냅샷을 찍기에..
5. PaaS (Platform as a service)
- Heroku, Netlify, AWS Elastic Beanstail, Google Cloud App Engine
- 서버를 운영하는 것은 복잡하고 어렵다
- 소스 코드만으로 배포가 가능하다.
- 일반화된 프로비저닝 방법을 제공
- 프로비저닝 과정에 개입 불가
- 단점
* 애플리케이션을 PaaS 방식에 맞게 작성해야함
* 자바 버전도 PaaS가 제공하는 버전을 따라야 함
* 서버에 대한 원격 접속 시스템을 제공하지 않음 (로그 못봄)
* 서버에 파일 시스템을 사용할 수 없음
* site 패키지를 설치할 수 없음
* 로그수집을 제한적인 방식으로만 하용
* 배포에 대한 새로운 패러다임을 이해해야 함
- PaaS에서 할 수 있을까?
* 크론잡
* 데이터 분석
* 로그 분석
* 애플리케이션 성능 모니터링
* A/B 테스트, Canary 배포
* 네트워크 , 스토리지 설정
도커의 등장
1. 도커란?
- 2013년 DocCloud 에서 첫 공개
- 컨테이너 : 격리된 환경에서 작동하는 프로세스
- 리눅스 커널의 여러 기술을 활용
- 하드웨어 가상화 기술보다 가벼움
- 이미지 단위로 프로세스 실행 환경을 구성
- Vm은 os위에 os를 올려서 사용함 / 도커는 도커 엔진 위에 격리된 프로세스를 띄우므로 속도 빠름
- 도커의 특징
* 확장성 : 특정 회사나 서비스에 종속되지 않고 실행 가능, 개발서버 생성 간편
* 표준성 : ruby nodejs go php 의 서비스 배포 방식이 제각각인데 docker run 방식 하나로 사용 가능
* 이미지 : dockerfile 을 이용하여 이미지를 쉽게 빌드하며 hub로 쉽게 pull push 가능
* 설정 : 환경변수로 쉽게 지정 가능
* 자원 : 삭제 후 새로 만들 시 모든 데이터가 초기화됨
- 도커가 가져온 변화
* PaaS 와 같은 제한 없음
* 클라우드 이미지보다 관리하기 쉬움
* 다른 프로세스와 격리되어 가상머신처럼 사용하지만 성능저하가 없음
* 복잡한 기술 namespace, cgroup 등을 몰라도 사용할 수 있음
* 이미지 빌드 기록이 남음
* 코드와 설정으로 관리 > 재현 및 수정 가능
* 오픈소스 > 특정 회사 기술에 종속적이지 않음
- 애플리케이션 업데이트를 위해 컨테이너를 교체하는 방식 사용 (앞단 Proxy)
- 서비스 디스커버리
* 서버들의 정보 (ip, port 등)을 포함한 다양한 정보를 저장하고 가져오고 값의 변화가 일어날 때, 이벤트를 받아 자동으로 서비스의 설정 정보를 수정하고 재시작하는 개념
1. 새로운 서버가 추가되면 서버 정보를 key / value store에 추가 함
2. key / value store는 디렉토리 형태로 값을 저장함. /services/web 하위를 읽으면 전체 web 서버 정보를 읽을 수 있음
3. key / value store을 watch 하고 있던 configuration manager 가 값이 추가되었다는 이벤트를 받음
4. 이벤트를 받으면 템플릿 파일을 기반으로 새로운 설정파일을 생성
5. 새로운 설정 파일을 만들어 기존 파일을 대체하고 서비스 재시작
- docker-gen
* docker의 기본 기능을 적극 활용한 service discovery 도구
- 도커 데몬이 가지고 있는 컨테이너의 정보를 그대로 이용
- 컨테이너를 실행할 때 입력한 환경변수를 읽음
- VIRTUAL_HOST=www.subicura.com 과 같이 환경변수를 지정하면 이를보고 nginx의 virtual host 설정 파일들을 구성함
컨테이너 오케스트레이션
- 여러 대의 서버와 여러 개의 서비스를 편리하게 관리해주는 작업
- 스케줄링
* 컨테이너를 적당한 서버에 배표해주는 작업
* 여러 대의 서버 중 가장 할일 없는 서버에 배포하거나 그냥 차례대로 배포 또는 랜덤하게 배포
* 컨테이너 개수를 여러 개로 늘리면 적당히 나눠서 배포하고 서버가 죽으면 실행중이던 컨테이너를 다른서버에 띄워줌
- 클러스터링
* 여러 개의 서버를 하나의 서버처럼 사용함
* 작게는 몇 개 안되는 서버부터 많게는 수천대의 서버를 하나의 클러스터로
* 여기저기 흩어져 있는 컨테이너도 가상 네트워크를 이용하여 마치 같은 서버에 있는것처럼 쉽게 통신
- 서비스 디스커버리
* 서비스를 찾아주는 기능
* 클러스터 환경에서 컨테이너는 어느 서버에 생성될지 알 수 없고 다른 서버로 이동할 수 있음
* 따라서 컨테이너와 통신을 하기 위해서 어느 서버에서 실행중인지 알아야 하고 컨테이너가 생성되고 중지될 때 어딘가에 ip와 port 같은 정보를 업데이트 해주어야 함
* 키 벨류 스토리지에 정보를 저장할 수 도 있고 내부 DNS 서버를 이용
- 로깅, 모니터링
* 여러 대의 서버를 관리하는 경우 로그와 서버 상태를 한곳에서 관리
* ELK 와 prometheus 등 다양한 도구 사용
- 컨테이너 오케스트레이션 도구
* docker swarm
- 호스트 os에 Agent만 설치하면 간단하게 작동하고 빠름
- 단순한 구조에서 효과적임
* kubernetes
- 구글에서 개발한 컨테이너 배포 확장 운영 도구
- 표준
- 대규모에 적함
- 다양한 생태계 구축되어 있음
- 서비스 메시
* 서비스마다 프록시를 모두 붙이고 서로간에 retry 함
* 기능
- 서비스 발견
- 부하 분산
- 경로 관리
- 트래픽 관리
- 운영 탄력성
- 오류 주입
- 로깅 / 모니터링
- 분산 추적
- 보안
- 인증 , 인가
자체서버부터 컨테이너까지
- 결론
* 서버 생성을 쉽고 편리하게
* 명령아가 아닌 코드와 설정을 사용
* 격리된 환경을 이용하여 독립적인 실행환경 구성
* immutable 하게 애플리케이션을 관리하고 스토리지 또는 로그를 분리하여 관리
* 이미지를 쉽게 만들고 편리하게 사용
* 로드 밸런서와 프록시 서버 등 자주 사용하는 기술을 쉽게 사용
* 확장 가능한 설계
'Devops > kubernetes' 카테고리의 다른 글
Kubernetes(쿠버네티스) 실습 1 (kubectl/pod/replicaset/deployment) (0) | 2021.06.01 |
---|---|
Docker-Compose(도커 컴포즈) 실습 (0) | 2021.06.01 |
Docker(도커) 실습 (0) | 2021.06.01 |
실습 환경구성 (0) | 2021.06.01 |
쿠버네티스 & 쿠버네티스 아키텍쳐 (0) | 2021.06.01 |