
회사에는 사내 클라우드에 구축되어 있는 api 로깅 서비스가 존재한다. 그리고 이 서비스를 신규 사내 클라우드로 성공적으로 이관하는 과제를 맡게 되었다.
해당 서비스는 Rancher를 사용한 쿠버네티스 환경에 구축되어 있는데, Rancher는 뭐고 쿠버네티스는 도대체 무엇이란 말인가?
쿠버네티스를 알기 전에, 기본적으로 아래의 것을 복습하자.
운영체제에서 실행되는 프로세스를 격리된 환경에서 별도의 실행 환경(컨테이너 이미지)을 제공하는 기술
ci/cd를 구축할 때 도커를 활용하여 구축한 경험이 있기에, 컨테이너가 무엇인지는 알고 있다
컨테이너를 실행하고, 만들고, 배포하는 것을 편하게 해주는 플랫폼.
도커에서 Dockerfile을 사용하면 컨테이너 이미지를 편하게 만들 수 있다.
컨테이너 이미지를 저장하는 저장소이다. 로컬에서 만든 도커 이미지를 원격 저장소에 올려, 원하는 곳에서 다운받을 수있다.
지금까지는 Docker Hub라는 퍼블릭 저장소를 사용했지만, 사내에서는 Harbor라는 프라이빗 저장소를 사용한다.
컨테이너화 된 애플리케이션의 스케일링, 관리를 도와주는 컨테이너 오케스트레이션 툴이다.
아래와 같은 주요 기능을 제공한다.
실패한 컨테이너를 자동으로 재시작하고, 정의된 상태와 다를 경우 자동으로 교체한다.
애플리케이션의 트래픽을 자동으로 분산하며, 외부 트래픽 처리를 위한 고유 ip주소를 제공한다.
컨테이너 끼리 서로를 찾고, 소통할 수 있는 환경을 자동으로 설정한다.
명령어 하나로 컨테이너의 수를 관리 가능하다.
Docker Compose와 쿠버네티스의 차이?
ci/cd를 구축할 때 도커 컨테이너를 실행하기 위해 Docker Compose를 사용했다. 컨테이너를 관리하는 측면에서 어떤 차이가 있을까?
- Docker Compose : 단일 호스트 내에서 여러 개의 컨테이너를 관리. 고가용성, 장애복구, 스케일링 등의 기능이 없음
- Kubernetes : 여러 호스트에서, 호스트 끼리 묶어서(클러스터) 복잡한 관리가 가능함. 스케일링, 로드밸런싱 등의 기능을 제공
쿠버네티스는 컨테이너를 관리할 수 있는 아주 강력한 툴이다. 그리고 이런 쿠버네티스 환경에 존재하는 여러 클러스터를 더욱 편리하게 관리하기 위한 솔루션으로 랜처가 존재한다.
위에서 말한 쿠버네티스의 기능을 Web UI를 통해 사용할 수 있다.
쿠버네티스에서 사용하는 가장 작은 배포단위이다.
하나의 Pod에 존재하는 컨테이너들은 같은 ip를 공유하고, 같은 볼륨을 사용한다.

Pod를 원하는 상태(개수)로 관리 해 주는 컨트롤러이다. Deployment에서 몇 개의 Pod를 운영할 지 설정하면 알아서 운영을 해준다.
하나의 Pod가 죽더라도 새로운 Pod를 띄워주고, 롤링 업데이트, 롤백 등 고가용성을 유지할 수 있다.

클러스터의 모든 노드에, 지정된 Pod를 하나씩 배포할 수 있다.
아래 그림에서, Daemonset Pod라는 것이 존재한다. 각 노드에 하나씩만 존재해야 하는 모니터링 툴과 같은 Pod를 노드 당 한 개씩만 배포하게 하는 것이다.
노드가 삭제되거나 생성될 때 Daemonset Pod도 삭제되거나 생성된다.

쿠버네티스 Pod는 기본적으로 stateless이다. 하지만 StatefulSet으로 운영되는 Pod는 unique값이 배정이 돼서 삭제 및 리스케줄링이 되어도 상태를 보전한다.
ex)데이터베이스 Pod

Pod는 삭제 및 재생성이 될 때마다 새로운 ip를 가진다. 그래서, 해당 Pod로 안정적으로 진입할 수 있는 방법이 필요하다. 각 Pod로 진입하기 위해, Pod를 묶어주는 일종의 로드밸런서가 바로 Service이다.
ClusterIp, NodePort, LoadBalancer, ExternalName 4가지 타입이 존재하며 내부 트래픽 관리용으로는 ClusterIp 유형을 많이 사용한다.

내부적으로만 네트워킹을 한다면 ClusterIp로 충분하다. 하지만 외부로 네트워크를 노출해야 한다면, 수 많은 Pod의 엔드포인트를 하나로 묶어주어야 한다.
최전방에서 네트워크 요청(외부)를 받아 적절한 Service로 넘겨주는 것이 Ingress이다.

Pod는 언제든지 삭제, 생성이 될 수 있으므로 휘발성이 강하다. 따라서 쿠버네티스 클러스터 어딘가에 저장소를 생성할 수 있는데, 해당 저장소를 생성하는 것을 Persistent Volume이라고 한다.

Pod에 적합한 Persistent Volume을 매핑해주기 위해, 사용자는 Persistent Volume Claim에 정의를 한다.
개발자(pvc 작성)와, 인프라 관리자(pv)의 역할을 분리하게 된다.

ConfigMap은 일반 환경 설정 정보를 저장하고 Secret은 좀 더 민감한 정보를 저장하는 곳이다.
여러 리소스들의 역할이 잘 정리되어 있네요 👍