2024년 12월 3일
마이크로서비스 아키텍처
컨테이너 인프라 환경의 적용
쿠버네티스(Kubernetes)란
쿠버네스 아주 도움 되는 글 :
https://velog.io/@holicme7/K8s-쿠버네티스란-무엇인가
줄여서 k8s 라고 표기하는 것을 자주 보게 됨
컨테이너 오케스트레이션 솔루션
도커와 잘 어울리는 실행 환경 구성 도구
k8s 클러스터
k8s 클러스터의 구성 요소
클러스터는 하나 이상의 노드(들)로 구성됨
마스터 노드 (컨트롤 플레인)
워커 노드
포드(Pod)와 컨테이너(Container)
k8s가 제공하는 기능
컨테이너 밸런싱 (container balancing)
트래픽 로드 밸런싱 (traffic load balancing)
동적 수평 스케일링 (HPA; Horizontal Pod Autoscaling)
오류 복구 (error recovery)
롤링 업데이트 (rolling update)
스토리지 오케스트레이션 (storage orchestration)
서비스 디스커버리 (service discovery)
k8s Pod의 생명 주기 (Life Cycle)
kubectl을 통해 API 서버에 포드의 생성을 요청
컨트롤러 매니저는 포드를 생성하고, 이 상태를 API 서버에 전달
스케줄러는 포드가 생성되었다는 정보를 인지하고, 이 포드를 어떤 워커 노드에 적용할지를 결정해서 해당 노드에 포드의 실행을 요청
해당 노드의 kubelet이 CRI에 요청하여 포드가 만들어지고 사용 가능한 상태가 됨
k8s는 절차적인 구조가 아닌 선언적인 구조를 가지고 있음
k8s 오브젝트들
기본 오브젝트
Pod - 한 개 이상의 컨테이너로 단일 목적의 일을 하기 위해서 모인 단위
Namespace - k8s 클러스터에서 사용되는 리소스들을 구분해 관리하는 그룹
Volume - 포드가 생성될 때 포드에서 사용할 수 있는 디렉토리를 제공
Service - 유동적인 포드들에 대한 접속을 안정적으로 유지하도록 클러스터 내 / 외부에 연결하는 역할
디플로이먼트(Deployment)
기본 오브젝트들을 보다 효율적으로 작도알 수 있도록 조합하고 추가로 구현한 것
레플리카셋(replicaset) 오브젝트를 합쳐 놓은 형태로 단순하게 생각할 수 있음
k8s 인프라 구축
로컬 환경
Public clouds
On-prem 설치
정리 : container < pod < node(마스터노드-컨트롤플레인, 워커노드-컴퓨팅머신) < cluster
계획
k8s 클러스터에 어떠한 것을 지시할 수 있는 지 살펴보자
k8s 클러스터의 현재 상태를 조회하는 방법 알아보기
오브젝트 스펙을 작성하는 기초를 익히고 실습하기
실습 시작
노드와 포드 정보 조회
정말 아무런 포드도 없는 것일까?
컨테이너 이미지를 이용한 포드 생성
레플리카셋 복사본 만들기
디플로이먼트를 이용해야함
Deployment
동작 방식
디플로이먼트 선언
디플로이먼트 상세 조회
레플리카셋 생성 (포드 늘리기)
디플로이먼트 조회
클러스터 외부로부터 접근이 가능하도록 서비스 실행
k8s 서비스 (service) 이용해야함
노출하는 대상
서비스의 서로 다른 형태들
서비스(NodePort)를 통해 노출
kubectl expose pod nginx-pod --type=NodePort --name=pod-sve --port=80
(nginx-pod 포드에 있는 모든 컨테이너가(현재는 한개이지만) 웹서비스 http의 포트번호 80번으로 노출 )
kubectl get svc
(서비스 확인)
curl localhost:31444 (서비스를 통한 특정한 포트번호를 통해 포드 노출시킨것 확인 )
kubectl expose deployment dpy-nginx --type=NodePort --name=dpy-svc --port=80 (이번엔 디플로이먼트 노출)
kubectl get services (서비스 확인)
curl localhost:30804 (디플로이먼트 확인 - 위와 같은 결과 나오는 것 확인)
포드 오브젝트 삭제
서비스 오브젝트 삭제
포드 삭제
디플로이먼트의 생성에 의하여 만들어진 포드 삭제(포드 삭제하려고 시도했지만, 디플로이먼트의 선언 상태에 맞도록 다른 포드가 생성되어서 세 개의 포드를 유지시킴)
매니페스트 (Manifest)
k8s 오브젝트에 대한 명세를 파일로 기록한 것
파일에 각 오브젝트에 의도하는 상태 (desired state)를 기술
이 파일을 이용하여
자동화가 필요한 환경에서 (당연히) 명령어 라인에 일일이 입력하는 것보다 많이 이용됨
디플로이먼트의 오브젝트 스펙
서비스의 오브젝트 스펙
매니페이스트를 이용한 오브젝트 생성
계획
반복실습과 k8s 클러스터에 배포된 응용의 동작 보증 관찰
간단한 테스트용 flask 웹 응용을 만들고 이것을 nginx 위에 쌓아 도커 이미지 만들기
만들어진 이미지를 이용한 컨테이너를 실행하고 서비스를 노출하도록 매니페스트 작성
이 응용을 (수동으로) k8s 클러스터에 배포하고 예외상황에 대한 k8s의 대처 방식 관측
실습 - 웹 서버 만들기
웹 서버 만들기
서버 구성 준비
도커 이미지 구성 (컨테이너 설계)
도커 이미지 작성
이미지 태그하고 리포지토리에 푸시
매니페스트 작성
테스트 응용의 수동 배포
서비스 생성
실습 - 주기적인 요청 테스트
주기적인 요청을 이용해 테스트
실습 - 포드가 사멸하는 경우 테스트
check.sh이 계속 실행하는 상태에서 포드를 사멸했을때 STAUTS가 Terminatng되고 새로운 포드가 생성된 것을 볼 수 있다. 그리고 deployment에는 하나로 존재하는 것을 확인할 수 있음
디플로이먼트의 상태 유지
실습 - 컨테이너에 오류 발생 테스트
check.sh이 계속 실행되는데 컨테이너쉘에 접속해서 컨테이너를 죽이면 아래의 스크린샷처럼 잠시 멈추는 구간이 발생하고 다시 쿠버네티스가 다시 시작시키는 것을 확인할 수 있다
포드의 동작 보증
소프트웨어의 업데이트가 발생함에 따라 (매번 새로 배포하는 것이 아니라) 동적 업데이트 필요
소프트웨어의 업데이트는 실패할수 있으므로, 빠르고 유연한 복구는 필수 기능
실습 - 롤아웃 정보의 열람
—record는 deprecated 옵션임 → 나중에는 없어짐
실습 - 배포 이력의 기록: kubectl annotate
실습 - 특정시점으로 디플로이먼트 복구하기
서비스
클러스터 외부에서 클러스터에 접속하는 방법
서로 다른 서비스의 종류
클러스터 IP
노드포트
로드밸런서
인그레스
동적 수평 오토스케일링
HPA(Horizontal Pod Autoscaler)
스케일링 기준이 되는 값과 최소/최대 포드의 수를 지정
실습 - 응용배포, 오토스케일러 설정
볼륨
k8s는 클러스터 내에서 이용할 수 있는 저장장치(storage)의 추상화된 객체로 볼륨을 정의
PV(Persistent Volume)
PVC(Persistent Volume Claim)
볼륨 이용 실습
디렉토리 만들고 파일들 수정
pv-volume.yaml
만약, 컨테이너가 실행하다가 파일이 만들어져서 볼륨에 저장되면?
-> 컨테이너에서 생성한 파일을 호스트객체의 디렉토리에서도 확인할 수 있었음
용어 정리