[Kubernetes in Google Cloud][중급] - Lecture2 . Introduction to Containers and Kubernetes

윰진·2023년 6월 13일
0

빅데이터특화과정

목록 보기
8/8

GOAL

  • 컨테이너란 무엇인지 학습
  • 애플리케이션 배포 시 컨테이너를 사용할 경우 어떤 이점이 있는지 학습
  • 어떤 식으로 구성되고 빌드되는지 학습
  • 쿠버네티스와 같은 컨테이너 관리 솔루션이 어떤 기능을 제공하는지 학습
  • 자체적으로 빌드한 컨테이너 관리 인프라에 비해 어떤 장점이 있는지 학습
  • Cloud Build를 사용해 컨테이너를 만드는 방법과 Container Registry에 저장하는 방법 학습

Lecture 1. Introduction to Containers

GOAL

  • 애플리케이션을 배포할 때 컨테이너를 사용하면 어떤 장점이 있을까?

1 ) 기존 시스템

a ) 실물 컴퓨터에 애플리케이션 배포

  • 물리적 공간, 전력, 냉각 장치, 네트워크 연결 확보
  • 운영체제와 모든 소프트웨어 종속 항목 설치 후 애플리케이션 설치
  • 각 컴퓨터는 하나의 목적으로 사용
    • 리소스 낭비
    • 유지관리, 확장, 이식성에 문제가 됨

{\rightarrow} 컴퓨팅 성능 확보, 보안, 확장을 위해서는 컴퓨터를 더 추가해야 했음

b ) 가상화

  • 여러 가상 머신이 하드웨어 공유
  • 가상 머신을 이미지화할 수 있어 이식성이 좋음
  • 애플리케이션과 종속 목록, 하드웨어가 한 군데 묶여 있다는 문제점이 있음
    • 종속성을 공유하는 애플리케이션 끼리는 독립성이 보장되지 않음
      • 하나의 애플리케이션이 리소스를 많이 사용하면 다른 애플리케이션은 사용할 수 없음
      • 하나의 애플리케이션에 맞춰 종속성을 맞추면 다른 애플리케이션 동작에 영향을 줄 수 있음

2 ) VM 중심적인 방식

  • 각 애플리케이션에 대해 전용 가상 머신을 실행
    • 커널이 격리되어 애플리케이션들이 서로의 성능에 영향을 주지 않음
  • 대규모 시스템에서는 전용 VM을 사용하는 것이 중복이므로 낭비가 될 수 있음
  • 운영체제 전체 부팅이 필요해 느림

3 ) 애플리케이션과 종속 항목 수준에서 추상화 구현

  • 사용자 공간만을 가상화
    • 애플리케이션과 종속 항목이 있는 사용자 공간
      {\rightarrow} 컨테이너
    • 애플리케이션을 구성하는 프로세스만 시작/중지하므로 빠름

{\Rightarrow} 애플리케이션 외의 다른 환경적인 부분을 고려할 필요가 없음

컨테이너 : 가볍고 독립적이며 리소스 효율이 높고 이식성을 갖춘 실행 가능한 패키지

  • 동일한 컨테이너는 어디서든 동작할 수 있음
    • 효율적인 개발
    • 마이크로 서비스 패턴으로 구성된 앱을 쉽게 빌드 할 수 있음
      • 애플리케이션의 구성요소 확장 및 업데이트를 가능하게 해줌

Lecture2. Containers and Container Images

  • 이미지 : 애플리케이션과 종속성이 정의됨
  • 컨테이너 : 이미지의 인스턴스
    ✨ 컨테이너 이미지로 소프트웨어를 빌드하면 외부 환경을 고려하지 않아도 쉽게 패키지와 빌드가 가능

1 ) Docker

🐳 Container에서 애플리케이션을 생성하고 실행하게 해주는 오픈소스

  • 단, 애플리케이션들의 orchestrate를 지원하지 않음

a ) Container

구성

  • Linux Process
    • 고유의 가상 메모리 주소 공간
    • 구분된 공간
    • 빠르게 생성되고 파괴됨
  • Linux namespaces
    • Process ID number, directory trees, IP address 등등을 관리
  • cgroups
    • 애플리케이션이 사용할 수 있는 최대 사용 가능한 CPU time, memory, I/O bandwidth 그리고 다른 자원들을 관리
  • Union file systems
    • 애플리케이션을 효율적으로 캡슐화

구조

  • container manifest 파일을 이용하여 구성할 수 있음
    • Docker-formatted container images의 경우 Dockerfile을 사용
    • 각각의 layer를 정리 (read-only)
      • 컨테이너가 실행되면 쓰기 권한이 있는 최상위 레이어가 있음

예시

실제로 사용하는 것 보다 단순한 예제

  • FROM public repository에서 가져와 base layer 생성
  • COPY 새로운 레이어 추가, build tool의 현재 디렉토리로부터 파일 복사
  • RUN make command로 애플리케이션을 빌드하고 세번째 레이어에 빌드 결과를 추가
  • 마지막 레이어에는 컨테이너 내에서 어떤 명령어가 실행될지 정의됨

✨ 요즘의 애플리케이션 패키징은 multi-stage build process에 의존

  • 하나의 컨테이너는 마지막 실행가능한 이미지이고 애플리케이션이 필요한 것들을 모두 포함하는 이미지를 분리

{\rightarrow} 이미지로부터 새로운 컨테이너를 실행하면 컨테이너는 실시간으로 쓰기 가능한 레이어를 추가

Lab. Working with Cloud Build

✨ 제공된 Dockerfile과 Source Code를 활용하여 1 ) Cloud Build를 사용해 Docker 컨테이너 이미지를 빌드하고 2 ) 컨테이너를 Container Registry에 업로드 해보자.

1 ) Task 1. Confirm that needed APIs are enabled

Cloud Build API 활성화

2 ) Task 2. Building containers with DockerFile and Cloud Build

✨ Build File에는 종속성, 유닛 테스트, 분석 등을 정의해서 수행할 수 있음

  • DockerFile을 만들고 Cloud Build로 build하는 과제 수행하기

quickstart.sh

nano quickstart.sh

#!/bin/sh
echo "Hello, world! The time is $(date)."

Dockerfile

nano Dockerfile

FROM alpine
COPY quickstart.sh /
CMD ["/quickstart.sh"]

실행 권한 부여

chmod +x quickstart.sh

Cloud Build에서 Docker container image를 bulid하기 위한 명령어 실행

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/quickstart-image .

참고

  • 가장 끝에 붙는 .은 빌드 시간에 소스 코드가 현재 working directory에 있음을 나타냄

Container Registry에서 이미지 확인
빌드가 완료되면 Docker image가 빌드되고 Container Registry에 올라감

3 ) Task 3. Building containers with a build configuration file and Cloud Build

✨ Cloud Build로 YAML 형식의 custom build file을 사용하여 기존 Docker 컨테이너에 통합해보기

소스코드 받기

git clone https://github.com/GoogleCloudPlatform/training-data-analyst

working director에 연결되는 soft link 생성

ln -s ~/training-data-analyst/courses/ak8s/v1.1 ~/ak8s

cd ~/ak8s/Cloud_Build/a

Custom Cloud Build Configuration File 확인

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/quickstart-image', '.' ]
images:
- 'gcr.io/$PROJECT_ID/quickstart-image'

cloudbuild.yaml 파일을 이용하여 빌드 시작

gcloud builds submit --config cloudbuild.yaml .

빌드가 완료되면 새 버전의 이미지가 Container Registry의 Images 리스트에 올라감

Build History

4 ) Task 4. Building and testing containers with a build configuration file and Cloud Build

✨ Custom Build Configuration File은 간단히 빌드된 컨테이너에 추가로 (병렬/순차적으로) 다른 행동을 수행할 때 빛을 발한다!

  • 빌드된 컨테이너를 테스트하고 결과를 리포트하는 build configuration file 예제
cd ~/ak8s/Cloud_Build/b

cloudbuild.yaml 확인

  • args 로 fail을 넘겨주어 실패 상황을 가정
  • 이전에 build 한 container image를 사용
steps:
- name: 'gcr.io/cloud-builders/docker'
  args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/quickstart-image', '.' ]
- name: 'gcr.io/$PROJECT_ID/quickstart-image'
  args: ['fail']
images:
- 'gcr.io/$PROJECT_ID/quickstart-image'

cloudbuild.yaml 을 사용하여 gcloud build 시작

gcloud builds submit --config cloudbuild.yaml .

echo $?

출력 : 1 (non-zero)

Lecture3. Introduction to Kubernetes

✨ 쿠버네티스는 컨테이너 관리 및 조정 솔루션으로 부하 분산, 로깅, 모니터링 그리고 기타 관리 기능을 자동화

쿠버네티스

  • 오픈소스
  • 자동화
  • 컨테이너 관리
  • 선언적 구성 (Declarative Configuration)
    • 배포된 시스템이 원하는 상태와 일치하게 만들고 장애가 나더라도 그 상태를 유지될 수 있도록 함
  • 명령적 구성 (Imperative Configuration)
    • 시스템 상태를 변경하기 위해 사용
    • 일반적으로 빠르고 일시적인 해결책으로만 사용하거나 선언적 구성을 빌드하기 위한 도구로 사용

쿠버네티스의 특징

  • stateful과 stateless 애플리케이션을 모두 지원
  • Autoscaling
    • 자원 사용량에 따라 컨테이너를 확장/축소
  • Resource Limits
    • 리소스 요청 수준과 한도를 지정할 수 있음
    • 클러스터 내에서 전반적인 워크로드의 성능을 개선할 수 있음
  • 확장성
    • 플러그인, 생태계가 풍부
    • 온프레미스 환경 뿐만 아니라 다른 클라우드 서비스 제공업체 전반에서 이식성이 좋음

Lecture4. Introduction to Google Kubernetes Engine

✨ 컨테이너들을 관리, 확장, 배포를 도와주는 GKE는 어떤 장점이 있을까 ?

특징

  • 완전 관리형
    • 리소스를 관리하지 않아도 됨
  • 컨테이너에 최적화된 OS
    • 최소한의 리소스로 빠르게 확장할 수 있도록 최적화됨
  • Auto Upgrade
    • 항상 안정적인 최신 쿠버네티스 버전으로 클러스터가 자동 업그레이드 됨
  • Auto Repair
    • 비정상 노드(GKE 내의 컨테이너) 자동 복구
  • Cluster Scaling
  • Seamless Integration
    • 비공개 컨테이너 이미지로 배포 자동화 지원
  • Identity and access management
    • IAM으로 접근 권한 관리
  • Stackdriver로 애플리케이션의 성능을 관리할 수 있음
  • Integrated networking
  • Cloud Console
  • 쿠버네티스가 제공하는 것 보다 강력한 대시보드를 안전하게 관리할 수 있음

Lecture5. Computing Options

✨ Computing Option (Compute Engine, GKE, App Engine 등등)에 대해 더 알아보자!


0개의 댓글