머준
기억보단 기록하는 Devlog
머준
전체 방문자
오늘
어제
  • IT Devlog (49)
    • KT AIVLE (30)
      • AI Track(교육) (30)
    • 패스트캠퍼스 (0)
      • 데일리 미션 (0)
    • 대외활동 (2)
      • 공모전 (2)
      • 미래 내일 일 경험 (0)
      • 기타 (0)
    • News (4)
      • AI 뉴스 (4)
      • 경제 뉴스 (0)
    • Coding Study (10)
      • BOJ (0)
      • Programmers (10)
    • 기타 (3)

인기 글

최근 글

hELLO · Designed By 정상우.
글쓰기 / 관리자
머준

기억보단 기록하는 Devlog

[AI] KT AIVLE(KT 에이블스쿨) 3기 AI 개발자 트랙 가상화 클라우드(2) -14주차-
KT AIVLE/AI Track(교육)

[AI] KT AIVLE(KT 에이블스쿨) 3기 AI 개발자 트랙 가상화 클라우드(2) -14주차-

2023. 5. 16. 16:04

- 컨테이너

: OS 가상화 기술 / 프로세스 격리 / 리눅스 커널 공유

 

구분 가상머신 컨테이너
게스트 OS Windows, Linux 등 X
시작시간 길다 (분) 짧다 (초)
이미지 사이즈 큼 (GB) 작다(MB)
환경관리 각 VM다 OS 패치 필요 호스트 OS만 패치
데이터 관리 VM 내부 또는 연결된 스토리지 컨테이너 내부의 데이터는 컨테이너 종료 시 소멸

 

 

- Monolithic Architecture

: 고용량 고성능의 단일 서버로 구성

 

 

- MicroService Architecture

: Monolithic Architecture 와 비교하여 작은 서버들의 집합체로 구성

  ex) 네이버의 메일, MyBox, 지도 등 단독적인 컨테이너로 구성

 

 

- Docker

: 컨테이너 엔진 (컨테이너를 실행하고 관리하는 도구)

  도커는 도커허브라는 공개된 저장소 서버를 통해, 컨테이너 자료들을 관리

   Dockerfile --(build)--> Image --(run)--> Container

 

   (1) Dockerfile

      : 컨테이너 이미지 생성하기 위한 레시피 파일

        이미지 생성 과정을 코드로 가지고 있음

   (2) Docker Image

      : 서비스 운영에 필요한 프로그램, 소스코드, 라이브러리 등을 묶는 형태

       도커 이미지는 url 방식으로 관리하고 태그를 붙일 수 있음

       <Namespace>/<ImageName>:<Tag>

       docker.io/library/nginx:latest

       도커 허브에 저장되어 있는 이미지들 중 nginx 이미지 중 최근 버전의 이미지

        private:10000/mynginx:latest

        Private 한 이미지저장소를 구축하여 이미지를 관리한다면, <Namespace>부분을 해당 서버주소 및 포트번호 등으로 사용가능

 

 

- Docker HUB

: 컨테이너 이미지들을 서버에 저장하고 관리

 

- 컨테이너 오케스트레이션(orchestration)

: 다수의 컨테이너를 배포/복제/장애복구 등 총괄 관리를 자동화하는 것

   => 종류 중 쿠버네티스(Kubernestes) 가장 많이 사용

 

- 쿠버네티스

: 컨테이너형 애플리케이션의 배포, 확장, 관리를 자동화하는 오픈소스 시스템

   높은 확장성, 원활한 이동성(이식성)

   퍼블릭/프라이빗/하이브리드/멀티클라우드, 로컬 또는 원격, 가상머신, 베어메탈 등 여러 환경에서 구축 가능

   오픈 소스 도구의 장점

   플로그가 가능한 모듈 형식

 

- 쿠버네티스 아키텍쳐

: Master Node + Worker Node = Cluster

  (1) Master Node (control plane)

        - API Server

          : API를 사용하게 해주는 프로세스

        - Scheduler

           : Pod의 생성 명령이 있을 경우 어떤 Node에 배포할지 결정(배치 위치 결정)

             *pod => 컨테이너 담는 통

        - Controller Managers

           : 클러스터의 상태를 조절하는 컨트롤러들을 생성, 배포

        - etcd

           : 모든 클러스터의 구성 데이터를 저장하는 저장소

 

   (2) Worker Node

        - Container Runtime

           : 컨테이너를 실행하고 노드에서 컨테이너 이미지를 관리

             도커, CRI-O, containerd, rkt, rktlet 지원

        - Kubelet (큐블릿)

           : 컨테이너가 잘 작동하고 있는지 관리

        - kube-proxy

           : 쿠버네티스 클러스터의 각 노드마다 실행되고 있으면서, 각 노드 간의 통신 담당

 

 

- kubernetes 배포 유형

(1) All-in-One Single-Node Installation

: test를 하거나 학습을 할 때 사용

(2) Single-Node etcd, Single-Master and Multi-Worker Installation

: master node 1개 + worker node 여러 개

(3) Single-Node etcd, Multi-Master and Multi-Worker Installation

: master node 여러 개 + worker node 여러 개

(4) Multi-Node etcd, Multi-Master and Multi-Worker Installation

: master node (+ etcd) 여러 개 + worker node 여러 개

 

 

[쿠버네티스 컨테이너 배포, 통신, 볼륨 관리]

 

- kubernetes Object

 

- kubernetes Controller

: 클러스터 상태 관찰, 필요 시, object 생성, 변경 요청 역할

  현재 상태를 정의된 상태에 가깝게 유지하려는 특징

   (1) Auto Healing (자동 복구)

     : 노드가 삭제되거나, 노드 간 연결이 끊어졌을 때 노드 추가, 연결해줌

   (2) Auto Scaling

     : 리소스 부하가 늘어나면 pod 개수 늘려주고 줄어들면 pod 개수 줄여줌

   (3) Update & Rollback

     : 수정하고 되돌리기 기능

   (4) Job

     : 작업 실행 후 종료되는 작업(계산, 메일, 백업 등)

 

- YAML

: kubernetes object 관리

    - apiVersion : 연결할 API server의 버전

    - kind : 리소스의 유형

    - metadata : 리소스가 기본 정보를 갖고 있는 필드

                         name, label, namespace 등

    - spec : 배포되는 리소스의 원하는 상태

 

- kubectl

: Kubernetes에 명령을 내리는 CLI(Command Line Interface)

   kubectl [COMMAND] [TYPE] [NAME] [FLAGS] 형태임

    command -> get, create, apply , delete

 

 

- Pod

: Kubernetes의 가장 작은 최소 단위 Object

  Pod를 만들어서 Object를 저장함

  컨트롤러가 pod를 관리해줌

     - yaml 파일로 Pod 생성하는 명령어 => 관리, 안정성 따지면 이 방법이 좋음

       kubectl create -f <yaml 파일명>

     - kubectl 명령어로 Pod 생성하는 명령어

       kubectl run <pod명> --image=<이미지명:버전> --port=<포트번호>

 

 

- Namesapce

: Kubernetes 단일 클러스터 내 다른 리소스들을 그룹화하는 데 사용되며, 이를 통해 각 리소스에 대한 액세스 권한을 제한하거나 리소스 간의 충돌을 방지할 수 있습니다

   - yaml 을 활용한 namespace 생성

        kubectl create –f <yaml 파일명>

   - 특정 namespace 안에 pod 생성

        kubectl create -f pod.yaml –n <특정 ns 이름>

   - create, run 명령으로 namespace 와 pod 생성

        kubectl create ns <ns이름>

        kubectl run <pod이름> --image=<image이름> --port=<포트번호> –n <ns이름>

 

 

- Kubernetes Controller – ReplicaSet

: Pod의 개수를 유지

 

 

- Kubernetes Controller – Deployment

: ReplicaSet을 관리

  Deployment는 이전버전의 ReplicaSet을 10개까지 저장

    -> revisionHistoryLimit : n

   저장된 이전 버전의 ReplicaSet을 활용하여 Rollback

 

  (1) Recreate

   : 현재 운영 중인 구버전의 Pod들을 삭제하고, 업데이트 된 새 버전의 Pod들을 생성

     Downtime이 발생하기 때문에 실시간으로 사용하기엔 어려움

  (2) Rolling Update

   : 먼저 업데이트 된 Pod를 하나 생성하고, 구버전의 Pod를 삭제

     Downtime 발생하는 문제점 해결

    기존 replicaSet은 남아 있어서 rollback에 사용

 

- Deployment 생성 명령어

kubectl create deployment dp --image=nginx:1.14.0 --replicas=3

 

 

- Template

: Pod를 생성하기 위한 명세

  Deployment, ReplicaSet과 같은 Controller의 yaml 내용에 포함

  Template에는 Pod 세부사항을 결정

 

 

- Pod Scale

: replicas를 늘리거나 줄여서 pod 개수를 늘리고 줄일 수 있음

   (1) Deployment로 생성된 Pod 수를 조정(Scale)하는 명령

           kubectl scale deployment/<Deployment명> --replicas=<조정할 Pod 수>

   (2) ReplicaSet으로 생성된 Pod 수를 조정(Scale)하는 명령어

          kubectl scale rs/<ReplicaSet명> --replicas=<조정할 Pod 수>

 

 

- Kubernetes Object – Service

 : Pod에 접근하기 위해 사용하는 Object

   pod가 어떠한 이유로 재배포 되었을 때 재배포된 pod로 자동으로 접근할 수 있게 해줌

   (1) Label

     : Pod와 같은 Object에 첨부된 key와 value로 되어있음

   (2) Selector

     : Pod에 있는 Label 값을 찾아 해당하는 Object만 관리할 수 있게 연결

   (3) Annotation

     : Object를 식별하는데 사용되어지지는 않지만 참조할만한 내용들을 Lavel처럼 첨부

 

 

- Service 유형

 (1) ClusterIP (default)

    : Service가 기본적으로 갖고 있는 ClusterIP를 활용하는 방식

      같은 클러스터 내에서만 접근 가능

     - ClusterIP 유형의 Service를 생성하는 명령어

          kubectl create service clusterip <Service명> --tcp=<포트:타켓포트>

     - ClusterIP 유형의 Service를 nginx라는 Deployment와 연결하여 생성하는 명령어

          kubectl expose <연결할오브젝트(deployment)> <오브젝트명(nginx)> \

          --port=<포트> \

          --target-port=<타겟포트> \

          --type=ClusterIP

 

 

 (2) NodePort

   : 모든 Node에 Port를 할당하여 접근

    외부에서도 접근 가능

    ClusterIP에서 nodePort 지정(기능추가 느낌) -> NodePort 만들면 ClusterIP 생성됨

  - NodePort 유형의 Service를 생성하는 명령어

      kubectl create service nodeport <Service명> --tcp=<포트:타켓포트>

  - NodePort 유형의 Service를 nginx라는 Deployment와 연결하여 생성하는 명령어

      kubectl expose <연결할오브젝트(deployment)> <오브젝트명(nginx)> \

      --port=<포트> \

      --target-port=<타겟포트> \

      --type=NodePort

 

 

 (3) Load Balancer

   : Load Balancer Plugin을 설치하여 접근

     Load Balancer 생성하면 ClusterIP, NodePort 생성됨

     추가 플로그인 설치가 필요하고, 로드밸런서를 지원해주는 클라우드 환경에서 사용가능

  - LoadBalancer 유형의 Service를 생성하는 명령어

      kubectl create service loadbalancer <Service명> --tcp=<포트:타켓포트>

  - LoadBalancer 유형의 Service를 nginx라는 Deployment와 연결하여 생성하는 명령어

      kubectl expose <연결할오브젝트> <오브젝트명> \

      --port=<포트> \

      --target-port=<타겟포트> \

      --type=LoadBalancer

Kubernetes DNS

: Kubernets는 Pod와 Service에 DNS 레코드를 생성

IP 대신, 이 DNS를 활용하여 접근 가능

 

 

- Volume

: Pod 컨테이너에서 접근할 수 있는 디렉터리

Volume은 연결된 pod끼리의 공용 폴더

 

  (1) Emptydir

      : Pod가 생성할 때 함께 생성되고 Pod가 삭제될 때 함께 삭제되는 임시 Volume

 

  (2) HostPath

      : 호스트 노드의 경로를 Pod에 마운트하여 함께 사용하는 유형의 Volume

 

   (3) PV/PVC

        - PV (Persistent Volume) - 영구 볼륨

          : 클러스터 내부에서 Object처럼 관리 가능

            Pod와는 별도로 관리

            Pod에 직접 연결하지 않고 PVC를 통해서 사용

 

- PVC (PersistentVolumeClaim)

: 사용자가 PV에 하는 요청 / Pod와 PV의 중간 다리 역할

 

 

 

    'KT AIVLE/AI Track(교육)' 카테고리의 다른 글
    • [AI] KT AIVLE(KT 에이블스쿨) 3기 AI 개발자 트랙 Django APP만들기, ORM, Model -15주차-
    • [AI] KT AIVLE(KT 에이블스쿨) 3기 AI 개발자 트랙 Django -15주차-
    • [AI] KT AIVLE(KT 에이블스쿨) 3기 AI 개발자 트랙 가상화 클라우드(1) -14주차-
    • [AI] KT AIVLE(KT 에이블스쿨) 3기 AI 개발자 트랙 WAS -13주차-
    머준
    머준

    티스토리툴바