본문 바로가기

Computer Science/Kubernetes 정리

Kubernetes 정리 1 : Kubernetes용어정리

1. 쿠버네티스

  • 여러 서버(노드)에 컨테이너를 분산해서 배치하거나, 문제가 생긴 컨테이너를 교체하거나, 컨테이너가 사용할 비밀 번호나 환경설정을 관리하고 주입해주는 역할을 한다.
  • 목적: 사용자의 응용 프로그램을 컨테이너 형식으로 자동화된 방식으로 호스팅하는 것 -> 응용 프로그램 내 다양한 서비스 간 통신이 쉽게한다.
  •  ETCD는 키 값 형식으로 정보를 저장하는 DB
용어
컨테이너 앱이 구동되는 환경까지 감싸서 실행할 수 있도록 하는 격리 기술
- 각종 설정 과장이 줄어 좀 더 편하게 프로그램을 실행할 수 있다.
컨테이너 런타임 컨테이너 실행을 담당하는 소프트웨어
- 쿠버네티스는 containerd, CRI-O와 같은 컨테이너 런타임 및 모든 Kubernetes CRI (컨테이너 런타임 인터페이스) 구현체를 지원한다
도커 컨테이너를 다루는 도구 중 가장 유명한 것
-컨테이너를 실행하고 관리할 수 있도록 도와주는 도구
쿠버네티스 컨테이너 런타임을 통해 컨테이너를 오케스트레이션 하는 도구
 컨테이너를 분산 배치, 상태 관리 및 컨테이너의 구동 환경까지 관리해 주는 도구
오케스트레이션 여러 서버에 걸친 컨테이너 및 사용하는 환경 설정을 관리하는 행위
-  "컴퓨터 자원과 어플리케이션, 서비스에 대한 자동화된 설정, 관리 및 제어 체계"
아래 4가지 이슈에 대한 해답을 찾아야한다.
   a. 배포 관리
 어떤 컨테이너를 어느 호스트에 배치하여 구동시킬 것인가? 각 호스트가 가진 한정된 리소스에 맞춰 어떻게 최적의 스케줄링을 구현할 것인가? 어떻게 하면 이러한 배포 상태를 최소한의 노력으로 유지 관리할 수 있을 것인가?
   b. 제어 및 모니터링
 구동 중인 각 컨테이너들의 상태를 어떻게 추적하고 관리할 것인가?
   c. 스케일링
 수시로 변화하는 운영 상황과 사용량 규모에 어떻게 대응할 것인가?
   d. 네트워킹
 이렇게 운영되는 인스턴스 및 컨테이너들을 어떻게 상호 연결할 것인가?

- 위 네가지 이슈를 해결하기 위한 것이 컨테이너 오케스트레이션!

 

2. ETCD 

1. ETCD: Key : Value 형태의 데이터를 저장하는 스토리지.(안전, 신속)

-  Key : Value 형태란?

Key Value
K1 AAA,BBB,CCC
K2 AAA,BBB
K3 AAA,2,2014/2/4
K4 3,ZZZZ,5442

- 저장할 때도 간단하고, 사용할 때도 Key를 조회해서 Value를 가져와 쉽게 사용할 수 있다.

- 작은 규모의 데이터를 저장하고 꺼낼 때 사용되는 저장소로 주로 빠르게 읽고 써야하는 설정값등을 위해 사용할 때가 많다.

- Key:value 저장소는 문서나 페이지의 형태로 정보를 각각의 파일에 저장한다. 따라서 이런 파일은 어떤 형식이나 구조로든 될 수 있고 하나의 파일의 변화는 다른 파일에 영향을 주지 않는다.
, 추가적인 세부사항을 Null값 없이 저장가능하다.

- 복잡해지면 JSON이나 YANO같은 데이터 포맷을 갖는다.
EX)
학생은 학점 관련 페이지만, 근로자는 연봉 관련 페이지만 갖는다.

cf) 비교: 전통적인 DB: RDBMS
컬럼 하나를 추가하고 싶다면 테이블 전체가 영향을 받는다. 그런데 그 컬럼이 Primary키가 아니거나 무결성이 없다면 Null값이 많이 생기게 되고 테이블 전체가 영향을 받는다.

 cf) 클러스터란?

- 컨테이너 형태의 애플리케이션을 호스팅하는 물리/가상 환경의 노드들로 이루어진 집합

- 각기 다른 서버들을 하나로 묶어서 하나의 시스템같이 동작하게 함으로써 클라이언트들에게 고가용성의 서비스를 제공하는 것

cf) 노드란?

-       클러스터 내 가상 서버, 즉 컴퓨팅 엔진 단위

A. 마스터 노드 : 전체 쿠버네티스 시스템을 관리 및 통제하는 쿠버네티스 컨트롤 플레인 관장
마스터 노드가 죽으면 클러스터를 관리할 노드가 없어져, 일반적으로 3개 정도의 마스터 노드를 띄워 관리
(
예시:  올바른 선박 식별, 정보 저장, 컨테이너 위치 모니터링, 어디로 갈지 계획, 노드와 컨테이너 모니터링
-> Control playing components)

B. 워커 노드: 배포하고자 하는 애플리케이션의 실제 실행을 수행
(
예시: 화물선 선박)

3.  ETCD 설치하기

순서 = 1) Download Binaries      2) 압축 풀기      3) 실행

1) Download Binaries

Github 릴리스 페이지에서 운영 체제에 맞는 관련 바이너리를 다운로드한다.

2) 압축 풀기

3) ETCD 실행

a. ETCD 실행: 2379번 포트에서 대기하던 서비스가 시작됨(디폴트 포트 2379)

-       [./etcdctl set key1 value1] : 명령어를 사용해 데이터베이스에 Key : Value 값 저장 및 회수
set
Version 2의 방법

-       [./etcdctl get key1] : 저장된 데이터 검색 명령어

-       [./etcdctl] : 더 많은 옵션검색 기능 명령어

 

b. ETCDCTL 버전 맞추기 à Version 2 또는 Version 3

-       [./etcdctl –version]: 현재 버전 나타내는 명령어

-       [ETCDCTL_API=3 ./etcdctl version]: Version 3으로 변경하는 명령어

-       Version 3에서는 값을 설정하는 명령어는 put, 획득하는 명령어는 get
ex) [./etcdctl put key1 value1]             [[./etcdctl get key1]

 

4. ETCD in Kubernetes

< 쿠버네티스 클러스터 아키텍처>

- 쿠버네티스의 클러스터는 일련의 노드로 구성된다.
-
이 노드는 물리적일 수도, 가상일 수도 있다. 온프레미스거나 클라우드일 수도 있다.
-
노드들은 컨테이너 형태로 애플리케이션을 호스팅한다.

  • 쿠버네티스를 배포하면 클러스터를 얻는다.
  • 쿠버네티스 클러스터는 컨테이너화된 애플리케이션을 실행하는 노드라고 하는 워커 머신의 집합. 모든 클러스터는 최소 한 개의 워커 노드를 가진다.
  • 워커 노드는 애플리케이션의 구성요소인 파드를 호스트한다. 컨트롤 플레인은 워커 노드와 클러스터 내 파드를 관리한다. 프로덕션 환경에서는 일반적으로 컨트롤 플레인이 여러 컴퓨터에 걸쳐 실행되고, 클러스터는 일반적으로 여러 노드를 실행하므로 내결함성과 고가용성이 제공된다.

<쿠버네티스 컴포넌트>

1. 컨트롤 컴포넌트

1) kube-apiserver

API 서버는 쿠버네티스 API를 노출하는 쿠버네티스 컨트롤 플레인 컴포넌트이다. API 서버는 쿠버네티스 컨트롤 플레인의 프론트 엔드이다.

쿠버네티스 API 서버의 주요 구현은 kube-apiserver 이다. kube-apiserver는 수평으로 확장되도록 디자인되었다. , 더 많은 인스턴스를 배포해서 확장할 수 있다. 여러 kube-apiserver 인스턴스를 실행하고, 인스턴스간의 트래픽을 균형있게 조절할 수 있다.

2) Master nodes(제어 선박)

- Worker Node는 컨테이너를 실을 수 있는 선박.
-
누군가가 이 컨테이너를 싣고, 싣는 방법을 계획하고, 컨테이너 품질검사, 선박 정보 저장, 모니터링 등 전체 선적 프로세스를 관리하는 역할이 필요하다. 이것을 수행하는 것이 Master Node.
- Master Node
의 역할은 쿠버네티스 클러스터를 관리하고, 다른 노드에 대한 정보를 저장하고, 모니터링을 한다.
- Master Node
는 이작업들을 Control Playing Components라고 알려진 컴포넌트들의 집합을 사용해 수행한다.

3) ETCD Cluster(Stock)

- 컨테이너가 어떤 선박에 있는 지, 적재된 시간 등 모든 정보에 대해 유지관리 되어야한다.

- 이러한 정보든은 ETCDfKey : Value 저장소에 있다.

- ETCD는 정보를 키 : 값 형식으로 저장하는 데이터베이스

4) Kube-scheduler(크레인 역할)

- 노드가 배정되지 않은 새로 생성된 파드 를 감지하고, 실행할 노드를 선택하는 컨트롤 플레인 컴포넌트.

- 스케줄링 결정을 위해서 고려되는 요소는 리소스에 대한 개별 및 총체적 요구 사항, 하드웨어/소프트웨어/정책적 제약, 어피니티(affinity) 및 안티-어피니티(anti-affinity) 명세, 데이터 지역성, 워크로드-간 간섭, 데드라인을 포함한다.

  • 선박이 도착하면 크레인을 사용해 배에 실어야할 컨테이너를 골라낸다.
  • 스케쥴러는 워커 노드의 용량, Taints와 같은 기타 Policy나 제약조건, 허용조건, 노드 우선순위, 컨테이너 리소스 요구사항, 노드 우선순위 규칙 등을 참고해 컨테이너를 배치할 노드를 골라낸다.

Ex) CPI:10 요구

스케쥴러 작동방법: 2단계

1. Filter Node pod에 가장 적합한 노드를 식별하여 (pod에 맞지 않는/충분하지 않은 node) 필터링 시도

2. 노드의 순위 매김 (노드의 프리한 리소스 양을 계산하고, pod free 리소스가 더 많은 노드에 배치)

 

5) Kube-Controller Manager

- 컨트롤러 프로세스를 실행하는 컨트롤 플레인 컴포넌트.

- 논리적으로, 각 컨트롤러는 분리된 프로세스이지만, 복잡성을 낮추기 위해 모두 단일 바이너리로 컴파일되고 단일 프로세스 내에서 실행된다. 컨트롤러는 다음을 포함한다.

  • 노드 컨트롤러: 노드가 다운되었을 때 통지와 대응에 관한 책임을 가진다.
  • 잡 컨트롤러: 일회성 작업을 나타내는 잡 오브젝트를 감시한 다음, 해당 작업을 완료할 때까지 동작하는 파드를 생성한다.
  • 엔드포인트 컨트롤러: 엔드포인트 오브젝트를 채운다(즉, 서비스와 파드를 연결시킨다.)
  • 서비스 어카운트 & 토큰 컨트롤러: 새로운 네임스페이스에 대한 기본 계정과 API 접근 토큰을 생성한다.

6) cloud-controller-manager

클라우드별 컨트롤 로직을 포함하는 쿠버네티스 컨트롤 플레인 컴포넌트이다. 클라우드 컨트롤러 매니저를 통해 클러스터를 클라우드 공급자의 API에 연결하고, 해당 클라우드 플랫폼과 상호 작용하는 컴포넌트와 클러스터와만 상호 작용하는 컴포넌트를 구분할 수 있게 해 준다.

cloud-controller-manager는 클라우드 제공자 전용 컨트롤러만 실행한다. 자신의 사내 또는 PC 내부의 학습 환경에서 쿠버네티스를 실행 중인 경우 클러스터에는 클라우드 컨트롤러 매니저가 없다.

kube-controller-manager와 마찬가지로 cloud-controller-manager는 논리적으로 독립적인 여러 컨트롤 루프를 단일 프로세스로 실행하는 단일 바이너리로 결합한다. 수평으로 확장(두 개 이상의 복제 실행)해서 성능을 향상시키거나 장애를 견딜 수 있다.

 

5. 노드 컴포넌트

1) kubelet

클러스터의 각 노드에서 실행되는 에이전트. Kubelet은 파드에서 컨테이너가 확실하게 동작하도록 관리한다.

2) kube-proxy

kube-proxy는 클러스터의 각 노드에서 실행되는 네트워크 프록시로, 쿠버네티스의 서비스 개념의 구현부이다.

kube-proxy는 노드의 네트워크 규칙을 유지 관리한다. 이 네트워크 규칙이 내부 네트워크 세션이나 클러스터 바깥에서 파드로 네트워크 통신을 할 수 있도록 해준다.

3) 컨테이너 런타임.

컨테이너 런타임은 컨테이너 실행을 담당하는 소프트웨어이다.

쿠버네티스는 containerd, CRI-O와 같은 컨테이너 런타임 및 모든 Kubernetes CRI (컨테이너 런타임 인터페이스) 구현체를 지원한다

6. Setup – Manual

- 클러스터를 어떻게 설정하느냐에 따라 ETCD를 다르게 배포한다.

  • 첫 번째 방법: Scratch로부터 배포
  • 두 번째 방법: kubeadm툴을 사용하여 배포

1) Scratch로 설정하는 경우: ETCD바이너리를 직접 다운로드 하여 ETCD를 배포하고, 바이너리를 설치해 ETCD를 직접 마스터 노드에서 서비스로 구성한다.

wget -q –https-only “https://github.com/etcd-io/etcd/release/download/v3.3.11/etcd-v3.3.11-linux-amd64.tar.gz”

-> Advertise-client-urls 2379 포트가 디폴트인 ETCD가 대기하고 있는 주소
URL KubeAPI서버에서 ETCD서버에 접근하려고 할 때 구성되어 있어야한다.

2) kubeadm툴을 사용하여 배포하는 경우:

 

Kubectl get pods -n kube-system

- KUBE 시스템 네임스페이스 안의 POD로 배포

 

7. Explore ETCD

POD 내에서 ETCD Control Utility를 사용해 DB 탐색 가능하다.

Kubernetes에 저장된 모든 키를 나열하려면 아래 etcd control get 명령을 수행하라.

etcdctl get / --prefix -keys-only

 

쿠버네티스는 특정 디렉토리 구조로 데이터 저장한다.
-       루트 디렉토리는 registry이며 그 하위에 minions, pods replicasets, deployments, roles, secrets 등 다영한 쿠버네티스 구성이 있다.

 

8. ETCD 고가용성

  •   클러스터 안에 여러 Master node가 있음à 마스터 노드들에 분산된 여러 ETCD인스턴스를 가짐.
  •   이때, etcd 서비스 구성에서 파라미터를 잘 설정하면, etcd 인스턴스가 서로에 대해 알게 됨.
  •  --initial -cluster 옵션에 etcd 서비스의 다른 인스턴스를 지정하면 된다.