가상화 클라우드 | Virtualized Cloud
KT 에이블스쿨 6기 가상화 클라우드에 진행한 강의 내용 정리한 글입니다.
가상화 및 클라우드 개요
기존 환경의 문제점과 가상화를 통한 해결방안
IT 에너지 사용 현황
- 42%: 인프라 유지에 사용
- 30%: 애플리케이션 유지에 사용
- 23%: 애플리케이션 투자에 사용
- 5%: 인프라 투자에 사용
주요 문제점
- 극도의 시스템 복잡성
- 유지보수에 과도한 비용이 소모되고 신규 투자는 제한적
- 빈약한 인프라 의존
- IT운영이 안정성 유지에 치중되어 경쟁력 강화를 위한 혁신이 어려움
- 기존 인프라가 새로운 기술을 수용하기 어려워 지속적인 개선이 불가능한 상황
해결방안
- 모든 IT 자산의 가상화
- 가상화 플랫폼을 이용하여 동적이고 유연한 업무 인프라를 구축
- 데이터센터의 모든 리소스를 가상화
기존 IT 서비스 환경과 클라우드 환경 비교
- 기존 IT 서비스 환경 (On-Premises)
- 혁신을 위한 시도가 적음
- 실패의 비용이 높음
- 혁신 속도 저하
- 클라우드 환경 (Public Cloud)
- 혁신을 위한 시도가 많아짐
- 실패의 비용이 낮음
- 많은 혁신 가능
가상화 유형
- 서버 가상화: 하나의 물리적 서버를 여러 가상 서버로 분할하여 운영, 서버 자원의 효율성을 극대화
- 네트워크 가상화: 물리적 네트워크를 논리적으로 분리하거나 통합하여 유연성과 확장성을 제공
- 스토리지 가상화: 물리적 스토리지를 가상화하여 여러 스토리지를 하나의 논리적 스토리지로 통합
- 데스크톱 가상화: 중앙 서버에서 가상 데스크톱 환경을 제공하여 관리 용이성과 보안을 강화
가상화 도입 효과
- 물리적 서버 대수 감소
- 서비스를 위한 물리적 서버 수를 줄임으로써 데이터센터 공간을 절약하고, 효율적인 자원 활용이 가능
- 비용 절감
- 상면 비용 절감
- 데이터센터의 공간 활용이 줄어들어 시설 유지비용 절약
- 기존 5~6개의 시스템 랙 → 1개의 랙으로 운영 가능
- 전력 비용 절감
- 전력 소비를 줄여 에너지 비용 대폭 감소
- 전력 사용량 약 1016KW 절감
- 유지보수 비용 절감
- 하드웨어 유지보수 비용도 감소
- 상면 비용 절감
- 그린 IT 구현
- 탄소 배출 절감
- 탄소 배출량 약 2.8톤 감소 (1KW당 0.5kg의 CO₂ 배출 기준) -약 360그루의 소나무가 흡수할 수 있는 탄소량과 동일
- 친환경적인 IT 운영
- 지속 가능한 에너지 사용 및 친환경 기술 도입이 가능
- 탄소 배출 절감
- 성능 및 자원 통합
- CPU, 메모리, 스토리지 자원의 효율적 통합으로 IT 성능 최적화
- 물리적 서버의 의존도를 줄이고, 가상화된 환경에서의 유연한 확장이 가능
가상화 정의 및 발전
운영 체제와 물리적 하드웨어를 분리하여 IT 문제를 해결하는 기술
- 클라이언트 하이퍼바이저
- 높은 이용률
- 일부 OS/App Fault Isolation
- 서버 하이퍼바이저
- 하이퍼바이저
- 시스템에서 다수의 운영 체제를 동시에 실행할 수 있게 해주는 논리적 플랫폼
- Type 1(Native 또는 Bare-metal) 또는 Type2 (Hosted)
- 전체 OS/App Fault Isolation
- 가상 머신들의 캡술화
- Hardware Independence
- 하이퍼바이저
- 가상 인프라
- 중앙 집중화 관리
- 운영중 가상 머신의 이동
- 자동화된 비즈니스 연속성
- 클라우드
- Compute, Network, Storage 자원들에 대한 정책 기반 제어
- 보안과 장애 대응 (Fault Tolerance)
- 어플리케이션 중심
물리적 리소스 공유
- CPU 리소스 공유
- 가상 환경에서 운영 체제는 시스템의 모든 물리적 CPU 중 할당받은 CPU만을 소유한 것으로 인식
- 메모리 리소스 공유
- 가상 환경에서 운영 체제는 시스템의 모든 물리적 메모리 중 할당 받은 메모리만을 소유한 것으로 인식
- 가상 네트워킹
- 가상 이더넷 어댑터와 가상 스위치는 하이퍼바이저가 소프트웨어적으로 구현하여 제공
클라우드 컴퓨팅
인터넷을 통해 IT 리소스(컴퓨팅 파워, 스토리지, DB 등)를 원할 때 언제든지(On-demand) 제공하고 사용한 만큼만 비용을 지불하는 서비스
클라우드 컴퓨팅의 주요 기능
간단한 명령 또는 몇 번의 클릭만으로 필요한 IT 자원 사용 가능
자원의 배포와 관리는 자동화된 프로세스를 통해 수행
- 다양한 IT 자원 제공
- CPU: 프로세싱 파워를 필요한 만큼 유연하게 조정 가능
- Memory: 애플리케이션 및 데이터 처리에 필요한 메모리 할당
- Storage: 데이터를 저장하고 관리할 수 있는 가상 스토리지
- Network: 네트워크 대역폭 및 가상 네트워크 리소스 제공
- DB (데이터베이스): 다양한 유형의 데이터베이스 지원
- 기타(ETC): AI, 머신러닝, 빅데이터 분석 등 추가적인 고급 서비스
클라우드 컴퓨팅의 이점
- 초기 선 투자 불필요
- 물리적 IT 인프라 구매 및 설치 비용 절감
- 저렴한 종량제 가격
- 사용한 만큼만 비용을 지불하는 효율적인 과금 방식
- 탄력적인 운영 및 확장 가능
- 탄력성: 변화되는 요구 사항에 맞게 신속하게 IT 리소스를 확장하거나 축소하는 기능
- 속도와 민첩성
- 필요한 IT 자원을 빠르게 배포하여 비즈니스 목표 달성 시간 단축
- 비즈니스에만 집중 가능
- IT 인프라 관리 부담 감소로 핵심 비즈니스에 더 많은 자원과 시간 투입 가능
- 손 쉬운 글로벌 진출
- 전 세계에 분산된 클라우드 인프라를 통해 손쉽게 글로벌 서비스를 제공 가능
클라우드 종류
Public Cloud (공용 클라우드)
- 가장 많이 사용하는 클라우드 서비스 형태
- 클라우드 서비스 제공자(Cloud Service Provider)가 소유
- 특정되지 않은 사용자에게 리소스 및 서비스를 제공
- 보안된 네트워크 연결을 통해 접근(일반적인 인터넷 사용)
Private Cloud (사설 클라우드)
- 클라우드 리소스를 조직에서 소유, 관리/운영
- 담당 조직이 담당 조직 데이터센터에 클라우드 환경을 구성
- 특정사용자에게만 리소스, 서비스 제공
- 보안된 네트워크를 통해 접근(사내망 사용)
Hybrid Cloud(하이브리드 클라우드)
- 퍼블릭 클라우드와 프라이빗 클라우드를 결합
- 사내 데이터센터를 사용하다, 클라우드로 확장하는 개념
- 프라이빗 클라우드의 단점을 퍼블릭 클라우드로 보완
- 네트워크는 VPN 또는 전용선으로 연결
클라우드 컴퓨팅 3가지 서비스 모델
- 인프라 서비스(Infrastructure as a Service)
- 서버, 네트워킹, 데이터 저장 등의 인프라 제공
- 손쉽게 이전하거나 기존 온프레미스 환경과 함께 사용 가능
- 플랫폼 서비스 (Platform as a Service)
- 개발 환경 등의 플랫폼을 제공
- 조직에서 기본 인프라를 관리하는 필요성 제거
- 소프트웨어 서비스 (Software as a Service)
- 소프트웨어 제공
- 서비스 제공자가 운영 및 관리
Azure 기본 서비스 (네트워크, 컴퓨팅, 스토리지)
Azure
Microsoft가 제공하는 퍼블릭 클라우드 플랫폼으로 다양한 리소스와 서비스를 제공하여 유연한 IT 환경 구축을 지원
- Azure 리소스
- Azure가 관리하는 항목
- Azure 리소스 그룹
- 리소스 그룹은 수명 주기 및 보안에 따라 단일 엔터티로 관리할 수 있도록 여러 리소스를 연결하는 논리적 컨테이너
- Azure 구독
- Azure에서 리소스를 프로비저닝하는데 사용되는 논리적인 컨테이너
- Location (지역)
- 대기시간이 정해진 일정 경계안의 데이터센터의 집합
- Availability Zone (가용성 영역)
- Region 내에서 물리적으로 분리된 데이터센터
- 장애 발생 시 데이터 손실을 막고자 가용영역간 복제를 권장
- 왕복 대기 시간이 2ms 미만의 고성능 네트워크를 통해 연결
재해 복구 (Disaster Recovery)
- 재해 종류
- 외부 요인
- 지진, 태풍, 홍수, 화재 등 자연재해
- 테러로 인한 폭파, 전쟁, 해킹, 통신장애, 전력 공급 차단 등 인위적인 재해
- 내부 요인
- 시스템 결함, 기계오류, 관리 오류, 사용자의 실수 등
- 외부 요인
- 복구 목표
- RPO(복구 지점 목표)
- 데이터를 복구할 수 있는 마지막 시점
- RTO(복구 시간 목표)
- 시스템이 복구되기까지 걸리는 시간
- RPO(복구 지점 목표)
- 데이터 복구 방안
- 백업
- 특정 시점으로 데이터를 복원
- Azure Backup 을 사용하여 복구에 사용할 수 있는 스냅샷을 생성
- 데이터 복제
- 여러 데이터 저장소 복제본에 실시간 또는 거의 실시간으로 라이브 데이터 복사본을 생성
- Cross Region Replication (지역 간 복제)
- 또 다른 보조 지역을 활용하여 재해 복구를 통해 지역적 또는 대규모 지리적 재해로부터 보호
- 주 지역과 보조 지역은 모두 지역 쌍(Region Pair)을 형성
- 지역 쌍(Region Pair)
- 두 개의 데이터센터에도 영향을 미칠 정도의 큰 재해를 대비
- 광범위하게 분산된 데이터센터를 통해 높은 가용성 보장
- 백업
Azure Vnet
- Azure의 프라이빗 네트워크의 기본 구성 요소, 가상 사설 네트워크 환경
- Azure 리소스가 서로, 인터넷 및 특정 온-프레미스 네트워크와 안전하게 통신
Vnet 사용
- 인터넷 통신
- VNet을 통해 인터넷을 활용한 안전한 통신 가능
- Azure 리소스 간 통신
- Azure 내의 리소스(가상 머신, 데이터베이스 등) 간의 안전한 연결 제공
- 온-프레미스 리소스와 통신
- 온-프레미스 네트워크와의 연결을 통해 하이브리드 클라우드 환경 구현
- 네트워크 트래픽 필터링
- 네트워크 보안 그룹(NSG)을 활용하여 인바운드 및 아웃바운드 트래픽 제어
- 네트워크 트래픽 라우팅
- 사용자 정의 라우팅 테이블로 네트워크 트래픽의 경로를 지정
- Azure 서비스에 대한 가상 네트워크 통합
- Azure 서비스(예: Azure Storage, Azure SQL Database)와 VNet을 통합하여 보안을 강화
사용할 네트워크 사설 대역
- CIDR(Classless Inter-Domain Routing)
- CIDR : 가장 일반적으로 활용되고 있는 IP 주소 할당 및 표기 방법
- 대역 결정 고려사항
- 구축할 서비스의 규모
- 네트워크 대역폭 요구사항은 서비스 규모에 따라 달라짐
- IP 소모 개수
- 네트워크 내에서 사용될 IP 주소의 개수를 고려하여 충분한 대역을 확보
- 추후 확장 가능성
- 향후 서비스 확장 시 추가적인 대역을 쉽게 확보할 수 있도록 설계
- 타 시스템 연계 가능성
- 기존 또는 다른 시스템과의 연계 및 통합 가능성을 고려
- 기타(ETC)
- 추가적인 요구사항(보안, 성능 등) 및 환경에 따른 제약 조건
- 구축할 서비스의 규모
Azure Subnet
- 하나의 네트워크가 분할되어 나눠진 작은 네트워크
- Vnet 의 IP 대역을 적절한 단위로 분할 사용하는 방식
- 각 Subnet 도 Vnet와 동일하게 CIDR 을 이용해 IP 범위 지정
- Subnet 의 IP 대역은 반드시 Vnet 전체 대역 내에 존재해야 함
- Vnet내 Subnet 들의 IP 대역은 중복 할당 불가
- 사용중인 Subnet의 경우 CIDR 변경 불가
Subnet 사용
- 효율적인 IP 관리
- IP 주소를 체계적으로 분배하여 네트워크 대역을 효율적으로 사용 가능
- 각 서브넷은 고유한 IP 범위를 가지며, 중복되지 않도록 관리
- 브로드캐스트 사이즈 감소
- 네트워크 트래픽을 서브넷 단위로 제한하여 브로드캐스트 트래픽 크기를 줄이고, 네트워크 성능 최적화
- 네트워크 분리를 통한 보안성 확보
- 민감한 데이터 또는 리소스를 분리된 서브넷에 배치하여 접근을 제한하고 보안을 강화
- 네트워크 보안 그룹(NSG)을 활용하여 각 서브넷의 트래픽을 제어 가능
Azure NIC
- 가상머신과 가상네트워크 간의 상호 연결
- 가상머신에는 하나 이상의 NIC가 필수
- 가상머신의 크기(사양)에 따라 NIC를 2개 이상 포함할 수 있음
Azure Public IP
Azure 리소스가 인터넷 통신을 하기 위해 사용하는 IP 주소
- 요금 정책
- Public IP 사용 시, 사용량에 따라 요금이 청구
- 사용 가능 개수 제한
- 구독당 사용 가능한 Public IP의 최대 개수가 제한
- 필요 시 Azure에 요청하여 제한 개수를 증설도 가능
Public IP Type
- Static (정적 IP)
- 리소스를 생성할 때 고정된 IP 주소를 할당
- IP 주소가 변경되지 않아, 정해진 IP가 필요한 리소스에 적합
- Dynamic (동적 IP)
- Public IP를 리소스에 연결할 때 IP 주소를 할당
- 리소스를 제거하거나 다시 시작할 경우, 할당된 IP가 변경될 수 있음
VM
물리 OS에서 만들어내는 또다른 가상 운영체제 컴퓨터
Azure VM Azure에서 제공하는 VM 서비스
- Azure VM은 클라우드에서 물리 서버와 동일한 기능을 수행
- 확장성과 유연성을 제공
- 개발, 테스트, 프로덕션 환경 등 다양한 목적에 맞게 활용 가능
- 목적에 따른 다양한 시리즈를 제공
- 개발 테스트용 엔트리 수준 VM
- 경제적 버스트 가능 VM
- 범용 컴퓨팅
- 메모리 내 애플리케이션
- 컴퓨팅 최적화
- 메모리 및 스토리지
- 스토리지: 컴퓨터, 서버에 데이터를 저장하는 저장소 역할을 수행하는 부품
- 클라우드 스토리지: 데이터를 인터넷 또는 다른 네트워크를 통해 타사에서 유지 관리하는 오프사이트 스토리지 시스템으로 전송하여 저장할 수 있는 서비스
- 스토리지: 컴퓨터, 서버에 데이터를 저장하는 저장소 역할을 수행하는 부품
- 고성능 컴퓨팅 가상 머신
네트워크 보안그룹 (NSG)
Azure 리소스와 주고받는 네트워크 트래픽을 필터링
- 규칙 설정 항목
- 소스(Source)
- 트래픽의 소스 지정: Any, 특정 IP 주소, Service Tag, Application Security Group
- 소스 포트 범위(Source Port Ranges)
- 네트워크 트래픽의 소스 포트를 지정: Any, 특정 포트(예: 8080) 또는 범위 지정
- 목적(Destination)
- 트래픽의 목적지 설정: Any, 특정 IP 주소, Service Tag, Application Security Group
- 목적 포트 범위(Destination Port Ranges)
- 트래픽의 대상 포트를 지정: HTTP, HTTPS, SSH, RDP 등
- 프로토콜(Protocol)
- 통신에 사용되는 프로토콜 지정: TCP, UDP, ICMP, ESP, AH 또는 Any
- 작업(Action)
- 트래픽의 허용 여부를 지정: 허용(Allow) 또는 거부(Deny)
- 우선 순위(Priority)
- NSG 규칙의 처리 우선 순위를 설정
- 낮은 숫자가 높은 우선 순위를 가짐
- 이름(Name)
- 안 규칙의 고유 이름 설정
- 소스(Source)
애플리케이션 보안 그룹 (ASG)
- 네트워크 보안 정책을 간소화하고 관리하기 위한 기능
- 네트워크 보안그룹 규칙을 설정할 때 특정 IP주소, 서브넷 대신 논리적인 그룹 지정 가능
Storage Account
Azure의 다양한 데이터 저장 서비스를 관리하고 액세스하는 기본 단위
주요서비스
- Disk Storage: VM에 연결된 디스크
- File Storage: 클라우드 네트워크 공유디스크
- Blob Storage: 대용량 비정형 데이터 저장
- Queue Storage: 메시지 큐를 통해 애플리케이션 간 비동기 메시징 지원
- Table Storage: 비관계형 데이터 저장
Azure 주요 스토리지 종류
- Azure Disk: Azure 가상 머신(VM)에서 사용되는 고성능 블록 스토리지
- Azure Files: 완전 관리형 파일 공유 서비스로, SMB(Windows) 및 NFS(Linux) 프로토콜 지원
- Blob Storage: 대규모 비정형 데이터(이미지, 동영상, 로그 등)를 저장하는 오브젝트 스토리지 서비스
Azure Disk
Azure Virtual Machines와 함께 사용되는 블록 수준 스토리지 볼륨
사용 가능한 디스크 유형
- Ultra 디스크
- 프리미엄 SSD
- 표준 SSD 및 표준 HDD
Managed Disk 의 이점
- 뛰어난 내구성 및 가용성
- 안정적인 데이터 보호와 높은 가용성 보장
- 확장성, 간편함
- 워크로드에 따라 디스크 크기 및 성능 확장 가능
- Azure Backup 지원
- 데이터 백업 및 복구를 간편하게 수행 가능
- 세부적인 액세스 지원
- 데이터 관리와 보안 설정을 위한 세부적인 제어 제공
Azure files
SMB(서버 메시지 블록) 프로토콜 또는 NFS(네트워크 파일 시스템) 프로토콜을 통해 액세스할 수 있는, 클라우드에서 완전 관리형 파일 공유를 제공
주요 이점
- 공유 액세스
- 여러 클라이언트에서 동시에 파일에 액세스 가능
- 완벽한 관리
- 클라우드에서 자동으로 파일 공유를 관리하여 유지보수 부담 감소
- 스크립팅 및 도구 지원
- Azure CLI, PowerShell 등 다양한 스크립팅 도구와의 호환성 제공
- 복원력
- Azure의 내구성과 안정성을 바탕으로 데이터 보호 및 가용성 보장
- 친숙한 프로그래밍
- 기존 파일 공유 프로토콜과 동일한 방식으로 작업 가능, 학습 곡선이 낮음
Azure Blob Storage
클라우드를 위한 Microsoft의 개체 스토리지 솔루션
설계 목적
- 이미지 및 문서 제공
- 브라우저에 이미지나 문서를 직접 제공
- 파일 저장
- 분산된 사용자를 위한 파일 저장소 역할 수행
- 비디오 및 오디오 스트리밍
- 비디오 및 오디오 콘텐츠의 원활한 스트리밍 지원
- 로그 파일 관리
- 로그 데이터를 저장하고 분석을 위해 쓰기 작업 지원
- 백업 & 복원 및 보관
- 백업/복원, 재해 복구 및 데이터 아카이빙 용도로 적합
- 데이터 저장
- 온프레미스 또는 Azure 호스팅 서비스에서 분석 목적으로 데이터 저장
Azure 고가용성 서비스(로드밸런서, 오토스케일링)
Load Balancer (부하 분산 장치)
- 외부에서 들어오는 트래픽을 특정 알고리즘을 기반으로 다수의 서버로 분산
- 서버 문제를 자동 감지하고 사용 가능한 서버로 전달하여 해당 서버들이 제공하는 서비스 안정성을 높임
Azure Load Balancer OSI 모델의 4계층(L4)에서 작동하는 트래픽 분산 서비스
백엔드 풀 인스턴스
- 가상 머신(VM)
- 가상 머신 스케일 세트(VMSS)의 인스턴스
- VMSS(Virtual Machine Scale Set)
- 부하 분산된 VM의 그룹
- VM 수는 정의된 일정에 따라 자동 확장 및 축소
- VMSS 주요 이점
- 손쉬운 여러 VM 만들기 및 관리
- 고가용성 및 애플리케이션 복원력 제공
- 리소스 수요 변화에 따라 자동으로 애플리케이션 크기 조정
- 대규모 작업
- VMSS(Virtual Machine Scale Set)
유형
- 공용 부하 분산 장치(Public Load Balancer)
- 가상 네트워크 내의 VM에 대해 아웃바운드 연결을 제공
- 공용 IP 주소를 통해 인터넷과 통신 가능
- 내부 부하 분산 장치 (Internal Load Balancer)
- 사설 IP를 사용하는 경우 적합
- 프런트 엔드에서만 사설 IP가 필요한 트래픽 분산 지원
사용 시나리오
- 내/외부 트래픽을 가상머신으로 부하 분산
- 리전 내 리소스에 대한 가용성 상승
- 가상머신에 대한 아웃바운드 연결
- 상태프로브를 사용하여 부하가 분산된 리소스 모니터링
구성요소
프런트 엔드 IP Azure Load Balancer의 IP 주소로, 클라이언트의 접점을 의미
- 공용 IP 주소
- 개인 IP 주소
백 엔드 풀 들어오는 요청을 처리하는 가상 머신(VM) 또는 가상 머신 확장 집합(VMSS) 인스턴스들의 그룹
상태 프로브 백 엔드 풀의 인스턴스 상태를 확인하는 데 사용
부하 분산 장치 규칙 백 엔드 풀 내의 모든 인스턴스에 들어오는 트래픽이 배포되는 방법을 정의
로드밸런서 알고리즘
부하를 백엔드 노드에게 전달하는 규칙
- 알고리즘
- 라운드 로빈: 순차적으로 서버에 트래픽을 할당하여 분산
- 가중치 라운드 로빈: 가중치를 설정하고 가장 높은 가중치가 설정된 서버부터 트래픽 처리
- 최소 연결 방식: 가장 처리를 적게 한 서버에게 우선적으로 할당하여 분산하는 방식
- IP 해시 방식: 클라이언트의 IP 주소를 기반으로 동일한 IP의 트래픽은 항상 동일한 서버로 연결
- URL 스위칭 방식: 특정 하위 URL 들은 특정 서버로 처리하는 방식
- 컨텍스트 스위칭 방식: 특정 리소스 요청에 대해 특정 서버를 연결
- Azure 로드밸런서 알고리즘
- 5-튜플 해시 알고리즘
- 패킷의 정보 5가지를 기반으로 분배하는 방식
- 소스 IP (Source IP): 패킷을 보낸 클라이언트의 IP 주소
- 목적지 IP (Destination IP): 패킷이 도달할 서버의 IP 주소
- 소스 포트 (Source Port): 클라이언트 애플리케이션에서 사용하는 포트 번호
- 목적지 포트 (Destination Port): 서버 애플리케이션에서 사용하는 포트 번호
- 프로토콜 (Protocol): TCP/UDP 같은 전송 프로토콜의 종류
Horizontal & Vertical Scaling
Horizontal Scaling(수평적 크기조정)
- 스케일 아웃: 가상머신을 추가하는 것
- 스케일 아웃 : 가상머신을 제거하는 것
Vertical Scaling(수직적 크기조정)
- 스케일 업 : 메모리, CPU 등 리소스의 용량을 증설
- 스케일 다운 : 리소스 용량을 축소
Docker & Container
History of Deployment
- Bare Metal 방식
- 하드웨어에 OS를 설치하고 애플리케이션을 구성
- 보통 하나의 하드웨어에 하나의 애플리케이션으로 구성
- 추가 애플리케이션 필요시 하드웨어 구입, 파워 및 네트워크 연결 등 구동에 필요한 설정, 애플리케이션 설치 및 구성 단계를 거침
- Virtualized 방식
- 하드웨어에 OS 대신 Hypervisor 를 설치
- Hypervisor: 물리적 리소스를 논리적으로 분리시켜 VM에 할당하여 VM을 생성하는 소프트웨어
- VM(가상머신): 물리적 리소스를 논리적으로 분리시켜 생성한 가상 컴퓨팅 환경 - Hypervisor를 통해 각 VM을 필요한 만큼 생성 - VM에 OS를 설치(Guest OS라고 표현) 하고 필요한 애플리케이션을 구성 - 추가 애플리케이션 필요시 VM을 추가하고 Guest OS 설치 후 애플리케이션 구성
- Containerized 방식
- 하드웨어에 OS를 설치하고, Container Engine 을 설치
- Container Engine : 물리적인 리소스를 논리적으로 분리시켜 컨테이너를 생성하는 소프트웨어
- Container : 논리적인 구획인 컨테이너를 만들고 애플리케이션을 설치하여 서버처럼 사용하는 패키지 - Container Engine을 통해 필요한 애플리케이션을 구동할 Container를 생성 - 추가 애플리케이션 필요시 애플리케이션을 구동할 Container를 생성
Docker
오픈소스 기반 Container Engine (컨테이너를 구동해주는 소프트웨어)
- 사용 가능한 OS
- Linux
- Windows
- Mac
Dockerfile
컨테이너 이미지를 생성하기 위한 레시피 파일
- 이 파일에 이미지 생성과정을 문법에 따라 작성하여 저장
- FROM, WORKDIR, RUN, CMD 등 용도에 따른 명령어 모음
1
2
3
4
5
6
7
8
9
FROM ubuntu:18.04 # 베이스 이미지
RUN apt-get update && apt-get install -y vim apache2 # 패키지 설치
COPY index.html /var/www/html/ # 파일 복사
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"] # 컨테이너 실행 시 명령어
LABEL version="1.0" # 메타데이터 설정
ENV USER=docker # 환경 변수 설정
EXPOSE 80 # 포트 80 노출
USER docker:docker # 실행 사용자 설정
WORKDIR /home/docker # 작업 디렉토리 설정
Docker HUB
수많은 컨테이너 이미지들을 서버에 저장하고 관리
- Rate limit 사항
- 익명 유저: ip 기반으로 6시간동안 100번 제한
- 로그인 유저: 계정을 기반으로 6시간동안 200번 제한
Docker 계정 로그인
1
2
3
4
5
6
# 로그인 상태 확인인
docker info | grep Username
# 도커 로그인 명령
docker login
# 도커 로그아웃 명령
docker logout
Docker 이미지 생성 & 업로드 & 컨테이너 실행
이미지 생성 (빌드)
- 도커 파일(Dockerfile)을 작성
- Dockerfile 이 있는 경로에서 빌드 명령 수행
1
2
3
# 이미지 빌드 명령어
# docker build -t <도커허브 계정명>/<빌드할 이미지명>:<태그명> .
docker build -t aivleaccount/myapp:v5 .
이미지 업로드 (Push)
- 생성한 이미지를 내 계정 도커허브 저장소에 업로드
1
2
3
# 이미지 업로드 명령어
# docker push <도커허브 계정명>/<이미지명>:<태그명>
docker push aivleaccount/myapp:v5
Docker 이미지를 통해 컨테이너 실행
1
2
3
# 컨테이너 실행 명령어
# docker run -d -p <로컬 포트>:<컨테이너 포트> --name <컨테이너 이름> <이미지명>:<태그명>
docker run -d -p 8080:80 --name myapp-container aivleaccount/myapp:v5
Container Image
컨테이너를 실행하는데 필요한 프로그램, 소스코드 등을 묶어 놓은 소프트웨어 패키지
- 하나의 이미지로 여러 컨테이너를 생성 가능
- 이미지는 컨테이너가 삭제되더라도 삭제되지 않음(직접 삭제 필요)
- 이미지 사용
- 이미지는 Dockerfile을 사용하여 생성 (Build cmd)
- 이미지를 사용하여 Container 실행 (Run cmd)
Image Name
- Image Naming 방식:
<Namespace>
/<ImageName>
:<Tag>
- namespace: 이미지가 저장되어 있는 저장소
- Image Name: 이미지 이름
- Tag: 이미지를 관리하는 사용자가 지정한 태그 또는 버전
Private Image
필요에 따라 이미지를 공개하지 않고 임의의 기업, 부서, 개인만 사용하도록 구성
- Public 저장소가 아닌 Private 저장소를 구성하여 사용
- 저장소서버의 주소 및 포트 설정을 하고, Namespace 로 지정
- 이미지를 커스터마이징 가능
ACI & ACR
ACI
- Azure에서 컨테이너를 실행해주는 서비스
- 사용가능한 이미지 크기 : 최대 15GB
- 호환되는 Container Registry : ACR, DockerHub 및 타사 Registry
ACR
- 관리형 레지스트리
- 컨테이너 이미지와 관련 아티팩트를 저장하고 관리
Kubernetes 개요 및 주요 아키텍쳐
Container Orchestration
- 다수의 컨테이너를, 다수의 시스템에서, 각각의 목적에 따라, 배포, 복제, 장애복구 등 총괄적으로 관리
- 수천, 수만개의 컨테이너를 한정된 관리자가 손수 관리하는 것은 사실상 불가
- Container Orchestration을 해주는 도구
- Marathon: Apache Mesos 기반의 오케스트레이션 도구
- Microsoft Azure Service Fabric: 마이크로소프트의 Azure 플랫폼에서 제공하는 컨테이너 오케스트레이션 서비스
- Nomad: HashiCorp에서 제공하는 오케스트레이션 도구로 단순하고 유연한 설계가 특징
- AWS ECS (Elastic Container Service): AWS 클라우드 환경에서 제공하는 컨테이너 관리 및 오케스트레이션 서비스
- Docker Swarm: Docker에서 제공하는 네이티브 오케스트레이션 도구, 컨테이너 배포 및 클러스터 관리에 사용
Kubernetes
컨테이너형 애플리케이션의 배포, 확장, 관리를 자동화하는 오픈 소스 Orchestration 시스템
아키텍쳐
- Cluster
- 컨테이너 형태의 애플리케이션을 관리하는 물리 또는 가상 환경의 노드들의 집합
- Master + Worker Node 집합
- Master Node: 관리를 위한 제어 노드
- kube-api-server
- API Server: Master Node의 중심에서 모든 클라이언트와 구성요소로부터의 요청을 받아 처리
- kube-controller-manager
- Controller Manager: 클러스터의 상태를 조절 하는 컨트롤러들을 생성, 배포
- kube-etcd
- ETCD: 클러스터 내 모든 구성 데이터를 저장하는 저장소
- kube-scheduler
- Scheduler: 파드의 생성요청 시 해당 파드를 위치시킬 노드 선정
- kube-api-server
- Worker Node: 컨테이너가 배포될 물리 또는 가상머신
- kubelet
- 클러스터 내 각 노드에서 실행되는 에이전트
- Pod에서 컨테이너가 확실하게 동작하도록 관리
- kube-proxy
- 클러스터 내 각 노드에서 실행되는 네트워크 프록시
- Service 개념의 구현부
- Container Runtime
- Container 를 배포하고 이미지를 관리
- Docker Engine
- Containerd
- CRIO
- kubelet
- Master Node: 관리를 위한 제어 노드
- Addons
- 추가 설치를 통해 Kubernetes의 기능을 확장 시킬 수 있는 도구들
- Dashboard
- Monitoring
- Logging
- 추가 설치를 통해 Kubernetes의 기능을 확장 시킬 수 있는 도구들
- AKS 클러스터
- Control Plane: Azure가 관리
- Node: 고객이 관리
컨테이너 배포, 통신, 볼륨 관리
Kubernetes Object
Kubernetes 의 상태를 나타내기 위해 사용하는 오브젝트
- 기본 오브젝트
- Pod: 컨테이너를 실행하는 가장 작은 배포 단위
- Service: 네트워크를 통해 Pod를 외부와 연결하는 역할
- Namespace: 클러스터 내 리소스를 격리하고 관리하는 논리적 그룹
- 오브젝트의 두 필드
- Spec: 사용자(운영자)가 원하는 상태를 지정하는 필드
- Status: 클러스터 내 오브젝트의 현재 상태를 출력하는 필드
Kubernetes Controller Object
클러스터의 상태를 관찰하고 필요한 경우에 오브젝트를 생성, 변경을 요청하는 오브젝트
- 컨트롤러는 클러스터의 현재 상태를 정의된 상태에 가깝게 유지하려는 목적
- 컨트롤러 유형
- Deployment: 애플리케이션 배포 및 업데이트를 관리하는 컨트롤러
- Replicaset: Pod의 개수를 관리하여 원하는 복제본 수를 유지
- Daemonset: 각 노드마다 하나의 Pod를 실행하도록 보장
- Job: 일회성 작업을 실행하고 완료되면 종료
- CronJob: 스케줄에 따라 주기적으로 작업을 실행하는 컨트롤러
YAML
Kubernetes 에서 오브젝트를 기술하는 포맷
- json 형식으로도 사용가능
- 필드값
- apiVersion: 해당 오브젝트를 생성하기 위해 사용하고 있는 k8s api version
- kind: 오브젝트의 유형
- metadata: 오브젝트를 구분할 데이터(name, label, namespace 등)
- spec: 오브젝트의 원하는 상태
kubectl
Kubernetes에 명령을 내리는 CLI(Command Line Interface)
- kubectl 명령어 구조
- 오브젝트와 컨트롤러를 생성, 수정, 삭제
- COMMAND: 실행할 명령어 (예: get, create, delete 등)
- TYPE: 대상 오브젝트 유형 (예: pod, service, deployment 등)
- NAME: 오브젝트 이름
- FLAGS: 추가 옵션 (예: -o json, –namespace 등)
1
2
# kubectl 명령 구조
kubectl [COMMAND] [TYPE] [NAME] [FLAGS]
Pod
- Kubernetes의 가장 작은, 최소 단위 Object
- 하나 이상의 컨테이너 그룹
- 네트워크와 볼륨을 공유
Kubectl
1
2
3
4
5
6
7
# yaml 파일을 사용하여 Pod를 생성 하는 명령어
# kubectl create -f <yaml 파일명>
kubectl create -f pod.yaml
# kubectl 명령으로 Pod를 생성하는 명령어
# kubectl run <pod명> --image=<이미지명:버전> --port=<포트번호>
kubectl run pod1 --image=nginx:1.14.0 --port=80
Namespace
단일 물리 클러스터에서 리소스를 논리적으로 격리하여 그룹화하는 오브젝트
k8s 클러스터가 배포되면 기본 Default라는 Namespace 생성
- Namespace를 사용하는 목적
- 사용자들을 그룹화
- 배포레벨에 따라 그룹화
기본 Namespace
- default: 다른 네임스페이스가 없는 오브젝트를 위한 기본 네임스페이스
- kube-system: k8s 시스템에서 생성한 오브젝트를 위한 네임스페이스
- kube-public: 모든 사용자(인증되지 않은 사용자 포함)가 읽기 권한으로 접근 가능 한 네임스페이스
- kube-node-lease: 노드의 HeartBeat 체크를 위한 네임스페이스
Kubectl
1
2
3
4
5
6
7
# yaml 파일을 사용하여 Namespace를 생성 하는 명령어
# kubectl create -f <yaml 파일명>
kubectl create -f ns1.yaml
# kubectl 명령으로 Namespace를 생성하는 명령어
# kubectl create namespace <Namespace 명>
kubectl create namespace ns1
지정하여 명령 수행 - Kubectl
1
2
3
4
5
6
7
# pod.yaml 파일을 사용하여 ns1 이라는 namespace에 pod를 생성 하는 명령어
# kubectl create -f <yaml 파일명> -n <namespace 명>
kubectl create -f pod.yaml -n ns1
# ns1 namespace에 생성된 Pod를 조회하는 명령어
# kubectl get pod -n <namespace 명>
kubectl get pod -n ns1
Kubernetes Controller
ReplicaSet
- ReplicaSet은 Pod의 개수를 유지
- yaml을 작성할 때 replica 개수를 지정하면 그 개수에 따라 유지
Deployment
- Deployment는 ReplicaSet을 관리하며 애플리케이션의 배포를 더욱 세밀하게 관리
- 초기 배포 이후에 버전 업데이트, 이전 버전으로 Rollback도 가능
Deployment Update
- 운영중인 서비스의 업데이트시 재배포를 관리
- 2가지 재배포 방식
- Recreate
- 현재 운영중인 Pod들을 삭제한 후 업데이트 된 Pod들을 생성
- Downtime이 발생하기 때문에 실시간 서비스에는 권장하지 않는 방식
- Rolling Update
- 업데이트 된 Pod를 하나 생성하고 구버전의 Pod를 삭제
- Downtime 없이 업데이트가 가능
- Recreate
Deployment Rollback
- Deployment는 이전버전의 ReplicaSet을 10개까지 저장
- revisionHistoryLimit 속성을 설정하면 개수를 변경 가능
- 저장된 이전 버전의 ReplicaSet을 활용하여 Rollback
Deployment - Kubectl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# yaml 파일을 사용하여 생성 하는 명령어
# kubectl create -f <yaml 파일명>
kubectl create -f deployment.yaml
# kubectl 명령으로 생성하는 명령어
# kubectl create deployment <이름> \
# --image=<이미지명:버전> \
# --replicas=<Pod수>
kubectl create deployment dp \
--image=nginx:1.14.0 \
--replicas=3
# Deployment로 생성된 Pod 수를 조정(Scale)하는 명령어
# kubectl scale deployment/<Deployment명> --replicas=<조정할 Pod 수>
kubectl scale deployment/dp --replicas=3
# ReplicaSet으로 생성된 Pod 수를 조정(Scale)하는 명령어
# kubectl scale rs/<ReplicaSet명> --replicas=<조정할 Pod 수>
kubectl scale rs/rs --replicas=3
Kubernetes Object - Service
- Pod에 접근하기 위해 사용하는 Object
- Kubernetes 외부 또는 내부에서 Pod에 접근할 때 필요
- 고정된 주소를 이용하여 접근이 가능
- Pod에서 실행중인 애플리케이션을 네트워크 서비스로 노출시키는 Object
Service의 구성요소
- Label
- Pod와 같은 Object에 첨부된 키와 값 쌍
- Selector
- 특정 Label 값을 찾아 해당하는 Object만 관리할 수 있게 연결
- annotation
- Object를 식별하고 선택하는 데에는 사용되지 않으나 참조할 만한 내용들을 Label처럼 첨부
Service 유형
- ClusterIP(default)
- Service가 기본적으로 갖고있는 ClusterIP를 활용하는 방식
1 2 3 4 5 6 7 8
# ClusterIP 유형의 Service를 생성하는 명령어 # kubectl create service clusterip <Service명> --tcp=<포트:타켓포트> kubectl create service clusterip clip --tcp=8080:80 # ClusterIP 유형의 Service를 nginx라는 Deployment와 연결하여 생성하는 명령어 kubectl expose deployment nginx \ --port=8080 \ --target-port=80 \ --type=ClusterIP
- Service가 기본적으로 갖고있는 ClusterIP를 활용하는 방식
- NodePort
- 모든 Node에 Port를 할당하여 접근하는 방식
1 2 3 4 5 6 7 8
# NodePort 유형의 Service를 생성하는 명령어 # kubectl create service nodeport <Service명> --tcp=<포트:타켓포트> kubectl create service nodeport np --tcp=8080:80 # NodePort 유형의 Service를 nginx라는 Deployment와 연결하여 생성하는 명령어 kubectl expose deployment nginx \ --port=8080 \ --target-port=80 \ --type=NodePort
- 모든 Node에 Port를 할당하여 접근하는 방식
- Load Balancer
- Load Balancer Plugin 을 설치하여 접근하는 방식
1 2 3 4 5 6 7 8
# LoadBalancer 유형의 Service를 생성하는 명령어 # kubectl create service loadbalancer <Service명> --tcp=<포트:타켓포트> kubectl create service loadbalancer lb --tcp=5678:8080 # LoadBalancer 유형의 Service를 nginx라는 Deployment와 연결하여 생성하는 명령어 kubectl expose deployment nginx \ --port=8080 \ --target-port=80 \ --type=LoadBalancer
- Load Balancer Plugin 을 설치하여 접근하는 방식
Kubernetes DNS
- Kubernets는 Pod와 Service에 DNS 레코드를 생성
- IP 대신 이 DNS를 활용하여 접근 가능
FQDN 구성
리소스 | Namespace | FQDN 구성 |
---|---|---|
Service | ns1 | svc1.ns1.svc.cluster.local |
Pod | ns1 | 10-10-10-10.ns1.pod.cluster.local |
Volume
Kubernetes에서 Volume은 Pod 컨테이너에서 접근할 수 있는 데이터 저장소
- 유형
- EmptyDir
- Pod가 생성될 때 함께 생성되고 Pod가 삭제될 때 함께 삭제되는 임시 Volume
- HostPath
- 호스트 노드의 경로를 Pod에 마운트하여 함께 사용하는 유형의 Volume
- PV/PVC
- PV
- Persistent Volume
- 클러스터 내부에서 Object처럼 관리 가능 (Pod 와는 별도로 관리)
- PV로 사용할 수 있는 Volume 유형: CephFS, csi, FC, hostpath, icsci, local, nfs 등
- PVC
- PersistentVolumeClaim
- PV에 하는 요청: 사용하고 싶은 용량, 읽기/쓰기 모드 설정
- Pod와 PV를 분리시켜 다양한 스토리지를 사용할 수 있게 구현
- PV & PVC의 생명주기
- Provisioning: PV를 생성하는 단계
- Binding: PV와 PVC를 연결하는 단계
- Using: Pod와 PVC가 연결되어 Pod가 볼륨을 사용중인 단계
- Reclaim: 사용이 끝난 PVC를 삭제하고 PV를 초기화
- PV
- EmptyDir
StorageClass
여러가지 스토리지 유형을 표현하는 오브젝트
PV 를 동적으로 프로비저닝할 때 스토리지 지정 필요 오브젝트 필드
- provisioner
- PV 비프로비저닝에 사용되는 플러그인 지정 필드
- Azure의 file 서비스를 비롯하여 다양한 플러그인 사용 가능
- parameters
- 볼륨을 설명하는 속성 값 필드
- 최대 512개의 속성 정의 가능
- parameters의 최대 길이는 256 KiB
- reclaimPolicy
- StorageClass에 의해 동적으로 생성되는 PV의 reclaimPolicy 설정
- 설정 옵션
- Delete : pv가 삭제되면 연결된 플러그인의 스토리지 리소스 또한 함께 삭제
- Retain : pv가 삭제되면 연결된 플러그인의 스토리지 리소스와는 연결 해제, 따라서 수동 삭제 필요
- 생성시 지정하지 않으면 기본값 Delete
- allowVolumeExpansion
- PV의 최초 생성 이후 확장가능 하도록 설정
- 기본값 : true
- 확장 이후에는 축소 불가
- volumeBindingMode
- 볼륨과의 연결과 동적으로 PV를 생성하는 시점 제어 필드
- 설정 옵션
- Immediate: PVC가 생성되면 연결 및 PV 가 즉시 생성
- WaitForFirstConsumer: PVC를 사용하는 Pod가 생성 되면 연결 및 PV 생성
- 설정하지 않으면 기본값 : Immediate
컨테이너 및 노드 오토스케일링
Metric-Server
- 리소스 메트릭을 수집하여 HPA, VPA 에서 사용하기위해 쿠버네티스 API-server에 노출
- 리눅스의 top 명령어를 Kubernetes에서 kubectl을 통해 사용
HPA & VPA
- Horizontal Pod Autoscaler
- 부하 증감에 따라 Pod의 개수를 조절해주는 리소스
- Vertical Pod Autoscaler
- 부하 증감에 따라 Pod의 사양을 조절해주는 리소스
AKS 클러스터 Autoscaling
부하 증감에 따라 Node의 개수를 확장/축소