Orchestrator 실습
참고강의: 10개의 프로젝트로 한 번에 끝내는 MLOps 파이프라인 구현 초격차 패키지 Online.
이번에는 직접 간단한 쿠버네티스 실습을 진행해보겠다.
[목차]
- 환경 구축
- 쿠버네티스와 아키텍처
- 쿠버네티스 주요 구성 요소
- 실습 진행
1. 환경 구축
쿠버네티스는 직접 install하지 않고, 온라인 테스트 환경에서 진행해보겠다.
링크: https://labs.play-with-k8s.com
링크타고 들어가면 위와 같은 페이지가 나온다.
로그인 방법으로 github 계정이나 docker hub의 계정을 연동 할 수 있다.
나의 경우는 docker를 사용해서 로그인을 하였다.
로그인 성공 시 start 버튼이 생성된다.
[labs 초기화면]
start를 누르고 들어가면 나타나는 화면인데 제한시간 4시간을 확인 할 수 있다.
[ADD NEW INSTANCE]
왼쪽의 상단의 add new instance를 클릭하면 새로운 노드가 생성된다
[새로운 instance가 생성된 화면]
[명령어: kubectl]
kubectl 커맨드 사용하여 쿠버네티스 실습 진행을 해보겠다.
2. 쿠버네티스 아키텍처
쿠버네티스 개념
- 컨테이너화된 애플리케이션의 배포, 확장 및 운영을 자동화하기 위한 오픈 소스 시스템
- 구글에 의해 개발되었으며, CNCF (Cloud Native COmputing Foundation)에 기여
쿠버네티스 주요 특징
- 자동화된 롤아웃 및 롤백: 애플리케이션 업데이트 시 롤아웃을 자동으로 관리하고, 문제 발생 시 이전 버전으로 롤백
- 서비스 발견 및 로드 밸런싱: 서비스를 사용하여 클러스터 내의 애플리케이션에 쉽게 접근하고, 트래픽을 자동으로 분산
- 스케일링: 애플리케이션의 리소스 사용에 따라 자동 또는 수동으로 스케일링
- 자체 치유: 실패한 컨테이너를 재시작하고, 건강하지 않은 컨테이너를 교체하며, 준비되지 않은 노드로부터 애플리케이션을 이전
쿠버네티스 아키텍처
- Master-Node 구조로 이루어진 클러스터를 사용
마스터 컴포넌트
- API 서버 (kube-apiserver): 쿠버네티스 API를 제공하며, 사용자와 내부 컴포넌트 간의 중재자 역할
- 스케줄러 (kube-scheduler): 새로 생성된 파드를 어떤 노드에 할당할지 결정
- 컨트롤러 매니저 (kube-controller-manager): 여러 컨트롤러를 실행. ex) 노드 컨트롤러, 레플리케이션 컨트롤러
- etcd: 모든 클러스터 데이터를 저장하는 경량의 분산 키-값 저장소
✅ 파드란?
이전 실습에서 Scikit-learn 모델을 실행했던 하나의 컨테이너가 파드이다.
엄밀히 따지자면 하나의 파드안에 여러개의 컨테이너가 존재할 수 있다.
노드는 이 파드들의 그룹이라고 보면 된다.
노드 컴포넌트
- kubelet: 각 노드에서 실행되며, 파드 스펙(Spec)에 설명된 대로 컨테이너가 실행되고 있는지 확인
- kube-proxyy: 각 노드의 네트워크 규칙을 관리하여 네트워크 통신을 가능하도록 하게 함
- 컨테이너 런타임: 컨테이너 실행을 담당하는 소프트웨어 ex) Docker, containerd, CRI-O 등
쿠버네티스 작동 방식
- 클러스터 구성: 먼저 쿠버네티스 클러스터를 구성한다. 이 클러스터는 여러 노드(물리적 or 가상 머신)와 이들을 관리하는 마스터 노드로 구성
- API 서버와의 통신: 사용자는 kubectl 명령줄 인터페이스나 API를 통해 API 서버와 통신함. 이를 통해 파드 생성, 업데이트, 삭제 등의 작업을 요청함
- 스케줄링과 실행: 스케줄러는 새로운 파드에 대해 가장 적합한 노드를 선택. kubelet은 해당 노드에서 파드의 컨테이너가 올바르게 실행되도록 관리함
- 서비스 관리: kube-proxy는 서비스를 통한 네트워크 트래픽을 관리하고 서비스는 파드 그룹에 안정적인 접근점을 제공함
- 자동화된 롤아웃 및 롤백: 데플로이먼트를 통해 애플리케이션의 업데이트, 롤아웃 및 롤백을 자동으로 관리
- 스케일링과 자체 치유: 클러스터는 애플리케이션의 수요에 따라 자동으로 스케일링하고, 실패한 파드를 재시작하는 등의 자체 치유 기능을 제공
3. 쿠버네티스 주요 구성 요소
3-1) Pod
Pod란?
- 쿠버네티스에서 배포할 수 있는 가장 작은 작업 단위
- 하나 이상의 컨테이너를 포함할 수 있으며, 이들은 스토리지와 네트워크를 공유
주요 특징
- 컨테이너 그룹핑: 파드는 하나 이상의 밀접하게 관련된 컨테이너를 그룹화하며, 이 컨테이너들은 같은 컴퓨팅 리소스를 공유
- 공유 리소스: 파드 내의 컨테이너는 같은 IP 주소와 포트 공간을 공유하고, 서로 localhost를 통해 통신
- 일시적인 성격: 파드는 일시적임. 즉, 파드가 삭제되면 그 안의 컨테이너도 함께 삭제됨. 이는 파드가 불변적이지 않고 변경 가능한 리소스로 간주됨을 의미
- 생명주기: 파드는 생성되고, 실행되며, 종료될 때까지의 생명주기를 가짐. 파드가 종료되면, 쿠버네티스 클러스터에서 제거
사용 예
- 단일 컨테이너 파드: 대부분의 파드는 하나의 컨테이너만을 실행
- 멀티 컨테이너 파드: 로깅, 데이터 백업, 데이터 처리와 같은 보조 기능을 수행하는 사이드카(Sidecar) 컨테이너를 포함
3-2) Service
Service란?
- 서비스는 파드의 집합에 대한 안정적인 네트워크 주소를 제공
- 서비스를 통해 파드 집합에 대한 접근을 관리하고, 로드 밸런싱 및 서비스 발견을 가능
주요 특징
- 안정적인 주소 제공: 서비스는 파드 집합에 지속적으로 접근할 수 있는 안정적인 IP 주소와 포트를 제공
- 로드 밸런싱: 서비스는 요청을 여러 파드에 분산시켜 로드 밸런싱을 수행
- 서비스 발견: DNS 또는 환경 변수를 통해 클러스터 내의 다른 파드가 서비스를 쉽게 찾을 수 있음
- 서비스 타입: 다양한 서비스 타입(ClusterIP, NodePort, LoadBalancer, ExternalName)을 통해 다양한 네트워크 요구 사항을 충족
사용 예
- ClusterIP: 클러스터 내부에서만 접근 가능한 서비스를 만들 때 사용
- LoadBalancer: 클라우드 제공 업체의 로드 밸런서를 사용하여 서비스에 대한 외부 접근을 관리
3-3) Deployment
Deployment란?
- 데플로이먼트는 쿠버네티스에서 파드와 레플리카셋의 상태를 선언적으로 관리하는 API 오브젝트
- 애플리케이션의 배포, 업데이트, 스케일링 등을 자동화하고 관리
✅ 선언적으로 관리하는 API 오브젝트란?
하나의 파드가 있을 때 이것을 5개 만들고 싶은 상황이라면
-> 하나의 파드에 대해서 5개의 레플리카셋을 만들어 달라고 한다.(=선언)
만약 5개중 하나가 어떠한 상황으로(ex) 에러)죽었다면 디플로이먼트가 알아서 하나를 만들어서 5개 상태를 유지해준다.
주요 특징
- 자동화된 롤아웃과 롤백: 데플로이먼트는 애플리케이션의 새 버전을 롤아웃하고, 필요한 경우 이전 버전으로 롤백하는 프로세스를 자동화
- 상태 관리: 원하는 상태(Desired State)를 정의하고, 쿠버네티스가 실제 상태(Current State)를 그 상태로 유지
- 선언적 업데이트: YAML 파일이나 JSON 형식을 사용하여 애플리케이션을 업데이트하는 방식을 선언
- 스케일링: 파드의 수를 수동 또는 자동으로 조절하여 애플리케이션을 스케일링
사용 예
- 새 버전 배포: 데플로이먼트를 사용하여 애플리케이션의 새 버전을 롤아웃
- 스케일링: kubectl scale deployment 명령어를 사용하여 데플로이먼트를 확장하거나 축소
3-4) ReplicaSet
ReplicaSet이란?
- 레플리카셋은 파드의 복제본을 유지 관리하는 쿠버네티스 오브젝트
- 파드의 원하는 복제본 수를 지정하고, 지정된 수의 파드 복제본이 항상 실행되고 있도록 보장
주요 특징
- 복제본 수 관리: 지정된 수의 파드 복제본을 유지
- 자체 치유: 실패한 파드를 자동으로 대체하여 복제본 수를 유지
- 유연한 파드 선택: 레이블 선택기(Label Selector)를 사용하여 관리할 파드를 결정
사용 예
- 애플리케이션의 가용성 보장: 레플리카셋은 애플리케이션의 가용성을 높이기 위해 여러 파드의 복제본을 실행
- 부하 분산: 여러 파드 복제본을 통해 트래픽이 분산되어, 애플리케이션에 대한 부하가 각 복제본에 균등하게 분배
4. 실습 진행
이어서 아까 구축했던 labs에서 쿠버네티스 실습을 진행해보자.
4-1) 쿠버네티스 초기 셋팅
처음에 들어갔을 때 위와 같은 Warning창이 뜰 것이다.
cluster를 부트스트랩해주어야 하기 때문이다.
위에 1,2,3번을 복사 후 붙여넣기해서 커맨드에서 실행해주면 된다.(시간이 조금 걸릴 수 있음)
4-2) 파드를 통해서 nginx 웹서버 실행하기
[파드 생성]
kubecl run [NAME] --image=[POD NAME]:[TAG] --port [PORT NUMBER]
나의 경우 fasrcampusserver라는 이름으로 nginx 컨테이너를 포트번호 80번으로 생성했다.
// fastcampusserver로 설정하려다 오타가 나서 그대로 진행했다.
명령어를 친 후에 "파드/설정한 이름"으로 생성됬다는 문구가 잘 나옴을 확인할 수 있다.
[파드 정보 확인]
kubectl get pods
현재 상태가 Ready인 것이 확인되고, 상태가 Pending것은 쿠버네티스가 pod라는 것을 할당해서 만들고 있다는 뜻이다.
파드가 생성되기까지 시간이 조금 소요된다.
[파드의 상세정보 확인]
kubectl describe pods
자세한 파드의 정보를 보고싶으면 kubectl describe pods 명령어를 사용하면 된다.
오케스트로가 관리하는 최소의 단위 = 파드
❓ 굳이 파드를 안쓰고 도커 컨테이너를 왜 직접적으로 관리하면 안되나?
파드안의 컨테이너가 도커 컨테이너가 아니라 다른 기술기반의 컨테이너 일 수도 있음.
-> 확장성을 위해서 파드라는 계층을 하나 두었다고 보면 된다.
4-2) Deployment 생성하기
pod와 비슷한 명령어로 deployment도 생성할 수 있다.
kubectl create deployment [NAME] --image=[CONTAINER NAME] --replicas=[SIZE]
- -replicas=[SIZE] : 원하는 개수의 레플리카를 설정함
fastcampusdeployment라는 이름의 deployment를 생성했다.
[Deployment 정보 확인]
kubectl get deployments.apps
- kubectl get deployments.apps: 현재 deplotment들의 정보를 확인 할 수 있다.
- 레플리카를 2개로 설정했기 때문에 READY에 총 2개의 값이 준비되어 있는 것이 보인다.
[파드 정보 확인]
이제 생성한 Deployment의 정보들도 확인된다.
[Deployment 정보 수정]
kubectl edit deployments.apps [DEPLOYMENT NAME]
명령어를 치게되면 바로 해당 deployments의 파일로 넘어간다.
[확인되는 deployment의 정보]
여기서 deployment의 옵션을 수정할 수 있다.
서버운영시 서버의 스케일링 등 다양한 변경사항을 적용할 수 있다.
빨간줄은 기존에 레플리카를 2로 설정했던 내용임을 대강 알 수 있다.
레플리카를 5로 변경 후 적용해보자.
이렇게 5로 변경 후 나가보면
deployment가 수정됬다는 문구가 출력되었다.
다시한번 파드의 정보를 조회해보면 기존의 2개의 deployment에서 5개로 늘어난 것이 보인다.
마지막으로 중요한 내용을 정리하자면,
컨테이너를 관리하기 위해서
1. 파드단위로 컨테이너를 관리할 수도 있고
2. 여러개를 관리하고 싶을 때는 스케일링 뿐만 아니라 고가용성을 보장하고 다양한 기능을 제공해주는 Deployment라는 구성요소를 사용할 수도 있다.
// labs에서 실습을 진행해서 그런지 파드의 생성이 너무 느리다. 45분째 pending중이니 따라하실 분들은 직접 해보기를 추천한다.
'AI > MLOps' 카테고리의 다른 글
[Workflow] Airflow Workflow Management 실습 (0) | 2024.11.16 |
---|---|
[Workflow] Workflow Management 이론 (0) | 2024.11.15 |
[쿠버네티스] Orchestarator 이론 (0) | 2024.11.11 |
[Docker] Docker 실습 - Container (0) | 2024.11.09 |
[Docker] Docker 설치 및 기본 명령어 (0) | 2024.11.08 |
댓글