미식가의 개발 일기

[KT 에이블스쿨(6기, AI)] 14주차, 가상화 클라우드 본문

KT 에이블스쿨(6기, AI)

[KT 에이블스쿨(6기, AI)] 14주차, 가상화 클라우드

대체불가 핫걸 2024. 12. 10. 12:22

<14주차 후기>

  • 총 3일에 거쳐 가상화 클라우드에 대해 배웠어요!
  • 격리가 중요할 때 사용하는 가상화 기법(Virtualized)경량화와 빠른 배포가 필요할 때 사용하는 컨테이너 기법(Containerized)에 대해 배웠는데 Microsoft Azure와 Docker, Kubernetes 사용해 실습 진행했습니다!
  • 가상화 기법이다 보니 이론으로 들었을 땐 와닿지 않았는데 실습을 하면서 아 이렇게 하는구나~~ 하면서 이해가 쏙쏙 되더라고요.. 역시 백문이 불여일견..!😶 
  • 또 개념과 구조 모두 생소한 개념이라 헷갈리기도 했는데 '컨테이너가 요리라면 도커 이미지는 요리 레시피이고, 도커 허브는 도커 이미지들을 저장해놓은 저장소이다.' 이렇게 나만의 언어로 바꿔 생각하니까 확실히 이해가 쉬웠습니다! 강사님의 꿀팁 앞으로도 잘 써먹을 것 같습니다. ㅎㅎ 중간중간 배웠던 용어를 화면에 띄워주시면서 초등학생에게 설명하는 것처럼 설명해 보고 나만의 언어로 바꿔보는 시간을 가졌는데 수업 따라가는데 많은 도움이 됐던 것 같아요. 😊
  • 무엇보다 클라우드 플랫폼에서 개인적으로 실습을 하기가 쉽지 않은데 비용 걱정, 환경 세팅 걱정 없이 실습에만 집중할 수 있었던 게 너무 좋았습니다! 

 

 

1️⃣ Azure 

Microsoft가 제공하는 퍼블릭 클라우드 플랫폼

  • Microsoft Azure 프로그램을 활용하여 여러 실습을 진행했습니다!

 

📣 기본 서비스

가상 네트워크, 가상 머신, 스토리지

 

💡 가상 네트워크(Virtual Network, VNet) 

Azure 리소스가 인터넷 및 특정 온-프레미스 네트워크와 통신
  • 가상 네트워크 생성 서브넷 추가 

 

💡 가상 머신(Virtual Machine, VM)

컴퓨터 시스템을 소프트웨어로 가상화한 환경, 가상 운영체제 컴퓨터 
  • Azure에서 가상 머신 생성.pem 파일을 저장하고, apache2 를 실행 하여 웹 서버 구동

  • 가상 머신의 공용 IP로 접속 테스트

 

 

💡 스토리지(Storage) 

Azure Bolb: Azure에서 제공하는 Binary Large Object Storage, 대규모 비정형 데이터 저장 및 관리
  • 스토리지 계정 생성 index.html 파일 업로드

  • 제공받은 primary endpoint로 접속

 

📣 고가용성 서비스

부하 분산, 자동 스케일링

💡 부하 분산(Load balancers)

여러 서버나 리소스 간에 네트워크 트래픽(부하)을 고르게 분산하여 시스템의 성능과 가용성을 향상시키는 장치
  • 가상 머신 2개 생성

 

  • 프론트엔드 IP새로운 public IP 추가 후 백엔드 풀에 생성해 놓은 가상 네트워크와 가상 머신 등록

 

 

  • 부하분산 규칙 추가 후 load balancer 생성

 

 

  • 트래픽이 고르게 분산되는 것을 확인(처음 접속 server1, 1~2분 후 server2)

 

 

 

💡 자동 스케일링(VMSS:Virtual Machine Scale Set)

가상 머신을 관리하고 일정에 따라 자동 확장 및 축소 → 트래픽 증가 시 서버 증가 트래픽 감소 시 서버 감소

 

* 자동 스케일링 생성 후 부하 테스트

1. 자동 크기 조정 기준 설정 후 VMSS 생성

2. PowerShell 실행 후 가상 머신 접속

3. 부하 생성을 위한 stress 패키지 설치 

4. CPU 부하 생성 

5. CPU 사용률 증가 확인 

 

 

2️⃣ Docker

애플리케이션을 컨테이너로 묶어 어디서나 실행할 수 있게 해주는 경량 오픈소스 플랫폼

💡서버 환경의 진화 

출처: https://adityagoel123.medium.com/introduction-to-containers-8afbb3e89442

 

📣 Bare Metal

성능이 중요할 때 
  • 정의: 물리 하드웨어운영 체제 직접 설치 
  • 구조: 하드웨어 → 운영 체제 → 애플리케이션
  • 특징: 고성능, 직접 접근, 관리 복잡 

 

📣 Virtualized(가상화 환경)

격리가 중요할 때 
  • 정의: 물리 하드웨어 위 하이퍼바이저를 사용해 여러 가상 머신(VMs)을 운영하며 가상 머신은 각각 독립된 운영 체제 가짐 
  • 구조: 하드웨어 → 운영 체제  하이퍼바이저  가상 머신   독립된 운영 체제 → 애플리케이션 
  • 특징: 리소스 효율성, 유연성, 오버헤드 존재(하이퍼바이저 계층으로 손실 발생), 격리성

 

📣 Containerized(컨테이너 환경) 

경량화와 빠른 배포가 필요할 때 
  • 정의: 운영 체제의 커널을 공유하면서 애플리케이션과 그 종속성을 격리하는 가벼운 환경 
  • 구조: 하드웨어 → 운영 체제 → 컨테이너 엔진(예: Docker, Kubernetes) 컨테이너 애플리케이션 
  • 특징: 경량화, 효율성, 이식성 

 

 

💡 Docker Hub

도커 이미지를 공유하는 중앙 저장소
(도커 이미지: 컨테이너를 실행하기 위한 읽기 전용 템플릿, 컨테이너가 요리라면 도커 이미지는 요리 레시피!
(도커 파일: 도커 이미지를 자동으로 생성하기 위한 설정 파일) 

 

<실행 과정> 

0. index.html 파일 생성 후 도커 파일에 복사 

FROM nginx:latest
COPY index.html /usr/share/nginx/html/index.html

 

1. 이미지 생성: 도커 파일 작성 후 build

docker build -t <도커허브 계정명>/<이미지명>:<태그명>

 

 

2. 이미지 업로드(Push)

docker push <도커허브 계정명>/<이미지명>:<태그명>


3. 도커 컨테이너 실행: 로컬 포트를 컨테이너 포트에 매핑하고 백그라운드에서 실행 

docker run -d -p <로컬 포트>:<컨테이너 포트> --name <컨테이너명>

 

4. Azure 가상 머신의 인바운드 포트 설정: 대상 포트 범위에 설정한 로컬 포트 추가

공용 IP 주소와 8080 포트를 통해 가상 머신의 웹 서버에 접근하여 index.html 파일 실행

 

5. 도커 허브에서 레포지토리 생성이미지 태그 지정

docker tag my-webserver <계정명>/my-webserver:v1

 

6. 도커 허브로 업로드

docker push <계정명>/my-webserver:v1

도커 허브 업로드 확인

 

 

7. Azure Container Registry 생성, ACR 레지스트리에 이미지 태그 지정 및 Push

도커 이미지를 Azure 클라우드에서 직접 관리하고 배포할 수 있음 
  • 로그인
az login // Azure CLI 로그인
az acr login --name <ACR 이름> // Azure Container Registry 로그인
  • 태그 지정 및 Push
docker tag <이미지명>:<태그> <ACR 이름>.azurecr.io/<이미지명>:<태그명> // 태그 지정
docker push <ACR 이름>.azurecr.io/<이미지명>:<태그명> // Push

Push 작업 결과 확인 가능

 

 

3️⃣ Kubernetes 

컨테이너화된 애플리케이션 자동으로 배포, 확장, 관리할 수 있게 해주는 오픈 소스 플랫폼
- AKS (Azure Kubernetes Service): Microsoft Azure에서 제공하는 관리형 Kubernetes 서비스

💡주요 개념

  • Pod: 하나 이상의 컨테이너를 포함하는 가장 작은 배포 단위 
  • Node: 애플리케이션을 실행하는 서버(하나 이상의 Pod를 실행)
  • Cluster: 애플리케이션을 실행하는 환경으로 전체 시스템을 관리하는 마스터 노드와 애플리케이션을 실행하는 워커 노드로 구성
  • Namespace: Cluster 를 논리적으로 분리하여 리소스를 격리
  • Object: Cluster의 상태를 나타냄 
  • Kubectl: Cluster와 상호작용 하기 위한 CLI(Command Line Interface)
  • yaml: Object의 구성과 목표 상태를 정의(json도 가능하지만 yaml이 더 일반적)
apiVersion: <API 버전>       # API 그룹과 버전 (예: apps/v1, v1)
kind: <리소스 유형>          # 오브젝트 유형 (예: Pod, Deployment)
metadata:                   # 메타데이터 (이름, 네임스페이스, 레이블 등)
  name: <오브젝트 이름>
  namespace: <네임스페이스 이름> # 생략 시 default 네임스페이스
spec:                       # 오브젝트의 원하는 상태
  containers: # Pod에 포함된 컨테이너 리스트
    - name: nginx-container
      image: nginx:1.21
      ports:
        - containerPort: 80

 

 

💡 Controller 

클러스터의 상태를 관찰하고 오브젝트의 생성, 변경을 요청하는 오브젝트 
  • AKS Cluster 배포 후 Node 확인 

ReplicaSet
  • 특정 수의 Pod가 항상 실행되도록 보장 (yaml 파일에 지정)
Deployment 
  • ReplicaSet을 생성하고 관리하며, 애플리케이션 배포 및 업데이트를 처리

 

💡 Service

ClusterIP 
  • 클러스터 내부에서만 접근 가능한 네트워크 서비스를 제공
NodePort
  • 클러스터 외부에서 노드의 특정 포트를 통해 접근 가능
LoadBalancer
  • 클라우드 공급자의 로드 밸런서를 사용해 외부에 서비스 노출, 외부 트래픽클러스터 내의 Pod들로 분산
ExternalName
  •  클러스터 외부의 서비스DNS 이름으로 참조
    * DNS(Domain Name System): 도메인 이름(www.example.com) → IP 주소 변환 

 

 

💡 Volume

Pod 컨테이너에서 접근할 수 있는 데이터 저장소
emptyDir
  • Pod가 생성되면 빈 디렉토리를 생성하고, Pod가 종료되면 사라지는 임시 저장소 
hostPath
  • Cluster의 특정 노드에서 데이터를 저장, 노드가 바뀌면 데이터 사용 X 
PV(persistent Volume)
  • Cluster 내에서 Pod와는 별도로 관리되는 영구적인 저장소
PVC(Persistent Volume Claim) 
  • Pod에 필요한 저장소를 명시하는 요청서

 

 

💡 Autoscaling

HPA(Horizontal Pod Autoscale)
  • 부하 증감에 따라 Pod의 개수를 조절
VPA(Vertical Pod Autoscaler)
  • 부하 증감에 따라 Pod의 사양을 조절

 

728x90
반응형
LIST