[구름 k8s] TIL 3-1-3

Peppie·2022년 10월 6일
0

1. Kubernetes 개요

Application 배포 방법

Traditional Deployment

  • Application 구성
    • Application Binary (bin)
    • Application이 의존하는 Library (lib)
  • Application을 배포 받아 실행 가능한 여러 요소를 개별 computer에 배포

Virtualized Deployment

Hypervisor 기반의 가상 머신을 통해 Application 생성 및 배포

Container Deployment

application이 격리된 프로세스에서 동작할 수 있도록 하는 image 배포 방식

Application Architecture

Application을 구성하는 방법

Monolithic Architecture

어플리케이션 전체가 하나의 운영체제 프로세스로 실행

  • 하나의 객체로 개발, 배포, 관리
  • 하나의 변경사항을 적용하기 위해 전체를 다시 빌드/테스트/배포
  • application 확장 어려움

Microservice Architecture

각 micro service는 독립적인 프로세스로 실행,
API (Application Programming Interface)로 또 다른 micro service와 통신

  • 새로 추가되거나 변경사항이 발생하면 해당 서비스만 빠르게 빌드/테스트/배포 가능
  • resource가 더 필요한 서비스만 별도로 확장 가능

Microservice Architecture의 구성요소는 독립적인 방식으로 개발

단점

각각의 기능을 micro serive 단위로 나눠서 개발/테스트/개발
=> 구성 요소의 수 증가, 각각의 micro service 간의 종속성 관리 어려움

Application 개발 과정

  • 개발 : 개발 환경
  • 테스트 : 테스트 환경
  • 통합 -> monolithic architecture
  • 배포 : 운영 환경
  • 유지보수

개발, 프로덕션 환경에 대한 일관된 환경 구성

개발/배포하는 구성 요소와 상관없이 개발자/운영자가 해결해야 하는 문제는
application 실행 환경이 매번 다른 환경이라는 점

↑ 위 문제를 줄이기 위해 프로덕션 환경에서는 application 개발과 프로덕션이 정확히 동일한 환경에서 되도록 구성

개발자와 운영자 간 다른 생각

개발자

새로운 기능을 만들고 사용자 경험 향상 중시

운영자

개발자에게 우선순위가 낮은 시스템 보안, 사용률과 같은 측면 중시

Kubernetes 필요성

개발자는 기능 개발을, 시스템 관리자 (운영자)는 보안/사용률과 같은 측면에 중요도 부여

Kubernetes를 사용하면

  • 개발자는 특정 인프라 관련 서비스를 application에 구현하지 않아도 되고 실제 기능 개발에 집중
  • 시스템 관리자 (운영자)는 Kubernetes가 application 재배치하고 조합
    -> 리소스를 훨씬 효율적으로 관리 가능, 장애 발생해도 자동으로 처리
  • Kubernetes는 container화된 application을 쉽게 배포 관리 가능한 orchestration 도구

마스터 노드 (Control Plane)

전체 Kubuernetes 시스템을 제어/관리하는 Kubernetes control plane 실행

워커 노드

실제 배포되는 container application이 실행됨

클러스터

마스터 노드와 워커 노드의 집합

2. Kubernetes 구성 요소

Kubernetes (k8s)

container화된 application을 쉽게 배포/관리 가능한 orchestration 도구 (참고)

  • 구글이 내부적으로 사용하던 container 관리 도구를 오픈소스화하여 공개
  • 현재는 CNCF 재단에서 관리 운영

Kubernetes 구성 요소

마스터 노드 (Control Plane) - 서버 역할

클러스터 제어가 주목적 : 워커 노드 관리

구성 요소

  • kube-apiserver
    • 사용자 상호 작용 수행
    • Kubernetes 제어 명령 수신
    • API 명령 수신
  • kube-scheduler
    • 새로운 POD (container) 생성 감지
    • 실행시킬 워커 노드 선택
  • etcd
    • 클러스터의 모든 데이터 보관
    • 고가용성을 보장하는 Key-Value 저장소
    • 어떤 노드가 존재하고 클러스터에 어떤 리소스가 있는지 등의 정보 저장
  • kube-controller-manager
    • deployment 같은 리소스 컨트롤 관리
    • API 서버를 통해 클러스터 공유 상태 감지
    • 현재 상태를 원하는 상태로 이행하는 컨트롤 루프 관리
  • cloud-controller-manager
    • public cloud와 연동하여 로드 밸런서나 디스크 볼륨 등의 자원 관리

워커 노드

컨테이너화된 application 실행

구성 요소

  • kubelet
    • 각 노드에서 실행되는 에이전트
    • container run-time 관리 및 상태 모니터링
    • POD에서 container가 확실하게 동작하도록 관리
  • kube-proxy
    • 각 노드에서 실행되는 네트워크 프록시
    • Service 개념 구현부
    • 서로 다른 노드에 있는 POD 간 통신이나 POD와 인터넷 간 트래픽 라우팅
  • container run-time
    • container 제어 기능 (실행-중지-삭제)
    • CRI (Container Run-time Initiative) : 공통 container run-time 규격

Kubernetes를 사용하기 위한 기본 환경 구성은 클러스터 생성 의미, 클러스터는 여러개 생성 가능

3. Kubernetes 환경 구성

Kubernetes 환경 구성 == Kubernetes 클러스터 구성

Kubernetes 환경 구성 요소

Kubernetes 환경 구성 필수 요소

  • CRI (Container Run-time Initiative)
  • Kubeadm
  • Kubectl
  • Kubelet
  • CNI (Container Network Interface)

마스터 노드

  • CRI (Container Run-time Initiative)
  • Kubedam
  • Kubectl
  • Kubelet
  • CNI (Container Network Interface)

워커 노드

  • CRI (Container Run-time Initiative)
  • Kubeadm
  • Kubectl
  • Kubelet

Kubernetes 환경 구성 종류

KubeAdm

Kubernetes에서 제공하는 클러스터 생성/관리 도구

KubeSpray

Kubernetes 클러스터를 배포하는 오픈 소스 프로젝트

  • 다양한 형식으로 Kubernetes 클러스터 구성 가능
  • 온프레미스에서 상용 서비스 클러스터 운영시 유용
  • 다양한 CNI 제공

MiniKube

  • 로컬 시스템에 설치 가능
  • 설치가 간단하면서 Kubernetes가 제공하는 기능 활용 가능
  • 개발 도구와 MiniKube 연계 가능
  • 단일 노드(워커 노드) 형태로 동작
  • 노드를 가상화 형태로 생성 => Docker, VirtualBox 등의 가상화 도구가 추가로 필요
  • 학습/개발용으로 많이 사용

Docker Desktop

Linux / Windows / MacOS

Docker Desktop의 설정에서 Kubernetes를 활성화하면 MiniKube와 유사하게 Kubernetes 사용 가능

k3s

경량 Kubernetes 배포판

  • CNCF에서 육성하는 프로젝트, Rancher Labs에서 제작
  • k3s 실행 파일을 통해 서버와 에이전트만 구동하면 Kubernetes 각 구성 요소가 간편하게 설치 및 Kubernetes 클러스터 구성됨
  • 마스터 노드의 etcd를 파일형 DBMS sqlite 사용
  • IoT, 학습용 초소형 컴퓨터 (라즈베리 파이 등)에도 사용 가능

rancher

Kubernetes 클러스터 뿐만 아니라 운영에 필요한 모니터링, 보안 관련 기능을 쉽게 설치 가능

  • rancher의 관리 도구를 사용해서 새로운 Kubernetes 클러스터를 쉽게 생성하고 여러 클러스터를 한 곳에서 관리
  • 대규모 시스템 관리를 고려하여 많은 도구 제공

CRI (Container Run-time Initiative)

Docker 기반 Kubernetes 구조


Kubelet이 명령을 받으면 Docker runtime을 통해 container 생성/삭제 생명주기 관리 구조

Docker 이외 다양한 container 기술 적용 Kubernetes 구조


Docker 이외 다양한 container 기술이 생기면서 Kuberneters에서 다양한 container runtime을 지원하게 되었고, 그 때마다 Kubelet의 코드를 수정하는 문제 발생

Kubelet 수정 없이 다양한 container 지원 Kubernetes 구조


CRI (Container Runtime Interface)
: Kubelet 수정 없이 다양한 container runtime을 지원하기 위한 통일된 인터페이스 스펙

  • container runtime이 CRI 스펙에 맞춰 구현되면 Kubelet 수정 없이 새로운 runtime을 플러그인 구조로 추가하여 사용가능한 구조 제공

OCI (Open Conatiner Initiative)

  • 새로운 container runtime이 생길 때마다 CRI를 수정하는 문제 발생
    -> container runtime을 표준화하고자 하는 결과물
  • OCI 스펙에 맞춰서 구현된 container runtime은 별도의 CRI 구현 없이 OCI 구현체 관리 가능
  • OCI 스펙에 따른 container runtime 관리하는 CRI 컴포넌트를 CRI-O라는 컴포넌트로 구현
  • OCI 스펙을 준수한다면 CRI-O를 통해서 Kubelet으로부터 명령 받을 수 있음

  • 참고

CNI (Container Network Interface)

CNCF 프로젝트, container 간의 네트워킹 제어 가능한 플러그인 방식으로 만든 표준

  • 다양한 형태의 container runtime과 orchestration 사이의 네트워크 계층 구현 방식

  • Kubernetes에서는 POD (container) 간 통신을 위해서 CNI 사용

  • Calico, Weavenet, AWS CNI 등 다양한 종류

KubeAdm을 이용한 Kubernetes 환경 구성

  1. Master node (Control plane), Worker node에 해당하는 서버 생성 (준비)
    : Kubernetes 설치 가능 최소 사양 이상으로 구성 (필수 포트 번호 확인해서 포트 개방)
    스왑의 비활성화 : kubelet이 제대로 작동하게 하려면 반드시 스왑 사용 X 설정

    sudo swapoff -a : swap 기능 off
    echo 0 > /proc/sys/vm/swappiness : 커널 속성의 swap disable, root 사용자로 전환 후 수행
    sed -e '/swap/ s/^#*/#/' -i /etc/fstab : swap을 하는 파일시스템을 찾아 삭제

  2. Master node (Control plane), Worker node에 container runtime 환경 구성
    : Docker 설치

  3. kubeAdm, kubectl, kubelet 설치

  • kubeadm : 클러스터를 부트스트랩하는 명령
  • kubectl : 클러스터와 통신하기 위한 CLI, 클
  • kubelet : 클러스터의 모든 머신에서 실행되는 Pod와 Container 시작 등의 작업을 수행하는 컴포넌트
  1. Master node / worker node 구성

  2. CNI 구성

  3. Kubernetes 환경 구성 확인

0개의 댓글