728x90
마이크로서비스 및 DevOps
모놀로식 아키텍처
특징
- 단일 프로세스에서 실행되거나 몇몇 시스템에서 몇 개의 프로세스로 실행되는 거대한 모놀리식 애플리케이션
장점
- 간단한 개발
- 간편한 배포
- 단순한 확장성
단점
- 코드 품질이 낮아짐
- 애플리케이션의 시작이 오래 걸림
- 애플리케이션의 확장이 어려움
- 컴포넌트별 개발의 어려움
- 다양한 기술 적용의 어려움
마이크로서비스 아키텍처
특징
- 모놀로식 아키텍처의 크기가 커짐에 따라 발생하는 문제점을 극복하기 위해 마이크로서비스라는 기능적으로 세분화되고 독립적으로 작동하는 방식 사용
장점
- 크고 복잡한 애플리케이션을 지속적으로 배포할 수 있음
- 향상된 유지 보수성 각 서비스는 작기 때문에 이해하고 변경하기 쉬움
- 테스트 용이성 각 서비스는 독립적으로 테스트 가능
- 배포 효율성 각 서비스는 독립적으로 배포 가능
- 독립적으로 개발 테스트 배포 및 확장
- 개발에 생산성이 높고 배포 속도가 높음
- 다양한 기술 적용 가능
단점
- 분산 시스템 설계에 따른 복잡성
- 서비스 간 통신 매커니즘을 따로 구현
- 서비스 간 상호 작용 테스트
- 배포 및 관리 운영상의 복잡성
- 증가된 리소스 소비
DevOps
작동 방식
- DevOps 모델에서는 개발팀과 운영팀의 서로 단절되었던 역할들이 서로 조율하고 협업하여 더욱 안정적이고 뛰어난 제품을 생산할 수 있도록 지원
장점
- 출시 시간 단축
- 시장과 경쟁 지형에 따른 유연한 대응
- 시스템 안정성 및 신뢰성 유지
- 평균 복구 시간 개선
쿠버네티스란
쿠버네티스
- 여러 컨테이너 오케이스트레이션 도구 중 현재 가장 주목받고 있는 도구
- 구글에 의해 개발된 컨테이너 오케스트레이션 도구
- 기본적으로 도커 플랫폼 사용
도커
- 도커 엔진이 설치된 단일 시스템에서 다수의 컨테이너를 구동하는 방식으로 쉽게 구성 가능
- 단일 시스템만으로는 확보할 수 있는 자원이 한정되어 있어, 구동 가능한 서비스의 한계가 있음
- 도커 엔진이 구동되고 있는 시스템에 장애가 발생할 경우, 해당 시스템의 컨테이너를 사용하는 모든 서비스가 중지될 수 있는 가능성이 있음
오케이스트레이션
- 다수의 시스템과 애플리케이션을 쉽게 설정하고 유지 관리할 수 있는 방식 의미
- 도커 자체적으로 '도커 스웜'을 통해서 오케스트레이션을 지원하고 있음
- 도커 스웜은 도커와 유사한 동작 방식으로 쉬운 사용법을 제공하고 있으나 기능이 비교적 단순하고 세세한 조정이 어려운 단점이 있음
쿠버네티스 아키텍처
- 쿠버네티스 클러스터는 여러 시스템의 연결로 구성
- 마스터와 노드 구성 요소로 분류할 수 있음
- 필요에 따라 추가 요소(애드온)가 있을 수 있음
- 쿠버네티스 클러스터 구성 요소
쿠버네티스 구성 요소
마스터 노드
- 쿠버네티스 클러스터를 구성하기 위한 핵심 요소들의 모음
- 클러스터를 조정하기 위한 컨트롤 플레인을 제공함
- 노드에 작업을 분재하는 스케쥴링 등 클러스터에서 전반적인 결정을 수행하고 대응이 필요한 클러스터 이벤트를 감지하고 이에 대응하는 역할 수행
- 마스터의 기능: API 서버, etcd, 스케줄러, 쿠버네티스 컨트롤러 관리자, 클라우드 컨트롤러 관리자
kubectl
- 쿠버네티스 클러스터에 명령을 내리는 역할
- 바로 실행되는 바이너리 형태로 배포됨
- 주로 API 서버와 통신함
API 서버
- 쿠버네티스 클러스터의 중심 역할을 하는 통로
- 주로 etcd와 통신
- API는 서로 다르게 구성되어 있는 기능들이 데이터를 주고 받기 위한 방식으로 인터페이스를 뜻함
- 쿠버네티스의 구성 요소들은 마스터의 API 서버와 메세지를 주고 받게 되고 API 서버가 허브 역할을 수행하여 모든 요청을 수신하며 명령을 전달하는 역할 수행
etcd
- etc 디렉토리 + distributed(퍼뜨렸다) 합성어
- 쿠버네티스 클러스터의 모든 정보 데이터를 저장하는 저장소
- 데이터 저장 시 'key-value' 형태로 데이터를 저장함
- 데이터 백업에 대하여 반드시 고려할 필요가 있음
scheduler
- 클러스터 내에서 생성되는 파드를 감지하고 실행할 노드를 선택하는 역할을 수행하는 구성 요소
- 리소스 상태, 하드웨어/소프트웨어/정책 상의 제약, 어피니티 등 다양한 기존에 따라 배치 결정
쿠버네티스 컨트롤러 매니저
- API 서버를 통해 클러스터의 상태를 감시하고, 필요한 상태를 유지하는 기능을 수행하는 구성 요소
- 컨트롤러 종류
종류 | 설명 |
노드 컨트롤러 | 노드를 관리하며 노드가 다운되었을 때 알림 및 대응 |
레플리케이션 컨트롤러 | 복제 컨트롤러를 사용하는 모든 오브젝트를 관리하며 알맞은 수의 파드를 유지하는 기능 |
엔드포인트 컨트롤러 | 서비스와 파드 연결 |
서비스 어카운트 및 토큰 컨트롤러 | 쿠버네티스의 네임스페이스, 계정, 토큰 담당 |
클라우드 컨트롤러 관리자
- AWS, GCP 등 각 클라우드 서비스와 클라우드에서 동작하는 쿠버네티스 구성 요소가 상호 작용할 수 있도록 해주는 기능
- 쿠버네티스 1.6에서 도입된 알파 기능
- 클라우드 환경에서 쿠버네티스 컨트롤러가 하는 역할 수행
워커 노드
- 쿠버네티스의 컨테이너가 동작하는 런타임 환경을 제공하며, 동작 중인 파드를 유지하는 기능 담당
- 노드의 역할: 큐블릿, 프록시, 컨테이너 런타임
kubelet
- 쿠버네티스 클러스터의 각 노드에서 실행되는 에이전트로 마스터로부터 제공받는 파드의 구성 정보, 즉 노드가 수행하여야 할 작업을 전달받아서 컨테이너가 확실하게 동작하도록 보장하는 역할 수행
프록시
- 클러스터의 각 노드에서 실행되는 네트워크 프록시로 '서비스'를 구현하기 위한 기능 담당
- 클러스터 내부 간 통신이나, 클러스터 외부에서 내부로 전달되는 통신 등 호스트 레벨의 네트워크 규칙을 구성하고 외부 연결을 파드에 포워딩하며 서비스의 추상화 제공
컨테이너 런타임
- 각 노드에서 실제 컨테이너의 동작을 책임지는 구성 요소
- 파드 안에서 다양한 종류의 컨테이너가 문제 없이 작동하게 만드는 표준 인터페이스
- 구성 요소: docker, containerd, CRI-O, rktlet, Kubernetes CRI
파드
- 한 개 이상의 컨테이너로 단일 목적의 일을 하기 위해서 모인 단위
- 파드는 언제라도 죽을 수 있는 존재임
네트워크 플러그인
- 쿠버네티스 클러스터의 통신을 위해서 네트워크 플러그인을 선택하고 구성해야 함
- 네트워크 플러그인은 일반적으로 CNI로 구성함
- CNI: 컨테이너 네트워크 인터페이스로 컨테이너의 네트워크 안정성과 확장성을 보장하기 위해 개발됨
- CNI 종류: 캘리코, 플래널, 실리움, 큐브 라우터, 로마나, 위브넷 등
CoreDNS
- 빠르고 유연한 DNS 서버
- 쿠버네티스 클러스터에서 도메인 이름을 이용하여 통신하는 데 사용
- 도메인 네임을 편리하게 관리해주는 CoreDNS를 일반적으로 사용함
쿠버네티스 추가 요소
항목 | 설명 |
클러스터 DNS | 쿠버네티스 클러스터 내의 여러 오브젝트(파드, 컨테이너, 서비스 등)에 대하여 주소 기반으로 오브젝트를 접근할 수 있는 DNS 서비스 제공 |
대시보드 | 쿠버네티스 클러스터 구성 및 모니터링을 위한 웹 기반 인터페이스 제공 |
컨테이너 리소스 모니터링 | 컨테이너 리소스 사용량의 시계열 매트릭스 기록 |
클러스터 로깅 | 컨테이너 로그를 중앙 로그 저장소에 저장하고 관리 |
쿠버네티스 API
- API 버전 규칙
쿠버네티스의 모든 구성 요소는 API 오브젝트로 취급되며, API 서버를 통해 API로 메세지를 주고 받음 |
쿠버네티스는 리소스를 쉽게 표현하기 위해, 'api/v1' 또는 '/apis/extensions/v1beta1'과 같이 각각 다른 API를 호출하여 사용할 수 있음 |
같은 종류의 리소스라고 하더라도 서로 다른 API 버전이 존재할 수 있으며, API 버전이 다르다는 것은 안정성이나 기술 지원의 수준이 다르다는 것을 의미함 |
- API 버전 종류: 알파 버전 API, 베타 버전 API, 안전화 버전 API
메니페스트
- 쿠버네티스는 클러스터의 상태를 나타내기 위해 오브젝트 객체를 정의하여 사용함
- 오브젝트를 생성할 때는 오브젝트의 기본 정보, 오브젝트의 상세 스펙을 정확하게 제시해야 함
- YAML, JSON 문법으로 정의할 수 있음
- 오브젝트 정의 시 필수 요구 필드 값
필드 값 | 설명 |
apiVersion | 오브젝트를 생성하기 위한 API 버전 지정 |
kind | 오브젝트의 종류 명시 |
metadata | name, label, namespace 등 기본적인 정보 기술 |
spec | 오브젝트의 세부 상태 정의 |
오브젝트 관리
- 명령형 명령어: kubectl 명령 실행 시 오브젝트 생성에 필요한 정보 인수 또는 옵션을 사용하여 전달하는 방식
- 명령형 오브젝트 구성: 오브젝트에 대한 세부 사항을 YAML/JSON 포맷으로 작성하고, kubectl 명령은 작성된 파일을 참고하여 실행하는 방식
- 선언형 오브젝트 구성: 특정 디렉토리에 오브젝트 파일을 배치하는 방식, kubectl 명령은 특정 디렉토리에 배치된 오브젝트 파일을 참고하여 오브젝트 관리
쿠버네티스 클러스터 구성 도구
kubespray
- 상용 서비스에 적합한 보안성과 고가용성이 있는 쿠버네티스 클러스터를 배포하는 오픈 소스 프로젝트
- 서버 환경 설정 자동화 도구인 앤서블 기반으로 개발됨
- 온프레미스 환경에서 상용 서비스의 쿠버네티스 클러스터를 구성할 때 유용함
- 추가 구성 요소를 클러스터에 실행하는 역할 (ingress-nginx 컨트롤러, 헬름, 볼륨 플러그인, cert-manager 등)
- kubespray에서 제공하는 고가용성 구조는 kubeadm과 다름 ==> 로그밸런서를 사용하지 않고 노드 각각의 nginx가 리버스 프록시로 실행됨
- nginx-proxy가 전체 마스터 노드를 바라봄
kubeadm
- 쿠버네티스에서 공식 제공하는 클러스터 생성/관리 도구
- 여러 대의 서버를 쿠버네티스 클러스터로 쉽게 구성할 수 있음
- 고가용성을 제공하는 클러스터도 구성할 수 있음 ==> 워커 노드들이 마스터 노드에 접근할 때 로드밸런서를 거쳐 접근함
728x90
'쿠버네티스 교육 > 강의 내용 정리' 카테고리의 다른 글
220620_4_k8s_kubeadm을 이용한 쿠버네티스 클러스터 구성 (0) | 2022.06.20 |
---|---|
220620_3_k8s_kubespray를 이용한 쿠버네티스 클러스터 구성 (0) | 2022.06.20 |
220620_2_k8s_vagrant를 이용한 vm 준비 (0) | 2022.06.20 |
220617_4_도커_Docker Compose란 (0) | 2022.06.17 |
220617_3_도커_프라이빗 레지스트리 구축 (0) | 2022.06.17 |