Kubernetes 등장 배경
배포 환경의 변천사
- 기존의 배포환경: 물리 서버 한대에 여러 App 들을 설치하여 배포하였다.
- 한계점: 각 App 들을 격리시키지 못해 하나의 App 이 너무나 많은 리소스를 점유하는 등의 문제가 발생한다.
- 가상화 배포환경: 물리서버 한대에 여러 가상머신 (Virtual Machine, VM) 을 생성해 각 App 들을 격리시켰다.
- 한계점: 가상머신은 가상화를 위한 Hypervisor 가 필요하고 가상머신 내에도 OS 가 설치되기에 다소 무겁고 리소스 사용량이 많다는 문제가 있다.
- 컨테이너 배포환경: 물리서버 한대에 여러 컨테이너를 생성해 각 App 들을 격리시켰다.
- 컨테이너는 호스트 머신과 커널을 공유하기 때문에, 추가적인 OS 가 필요 없어 가상화 배포환경보다 가벼운 격리 배포환경을 구축할 수 있다.
Kubernetes 배포 환경
- Kubernetes 에서는 이러한 컨테이너 배포환경에 더 높은 추상화를 제공해 컨테이너 형태의 App 들을 훨씬 쉽고 효율적으로 관리할 수 있게 해준다.
Kubernetes 구성요소
출처: https://kubernetes.io/docs/concepts/overview/components/
- API Server
- 클러스터를 관리하는 ReST API 를 제공하는 컨테이너이다.
- Cloud-controller manager
- 쿠버네티스가 클라우드 상에서 작동한다면, 해당 클라우드 프로바이더의 API 와 연동하여 클라우드의 리소스를 제어하는 컨테이너이다.
- EKS 를 예시로 들자면, 쿠버네티스에 LB type service 가 생성되면 AWS ALB 를 자동으로 생성 & 설정해주는 등
- 클라우드상에서 작동하지 않는다면, 설치하지 않아도 되는 구성요소이다.
- 쿠버네티스가 클라우드 상에서 작동한다면, 해당 클라우드 프로바이더의 API 와 연동하여 클라우드의 리소스를 제어하는 컨테이너이다.
- Controller manager
- 생성된 리소스가 바람직한 상태를 유지하도록 하는 컨테이너이다.
- ETCD
- 클러스터의 모든 정보가 저장되는 키-벨류 기반의 데이터베이스 컨테이너이다.
- 클러스터의 모든 정보가 저장되기에, ETCD 의 데이터가 깨지게 되면 클러스터 전체가 망가지게 된다.
- Kubelet
- 쿠버네티스 클러스터를 구성하는 물리 머신에 설치되는 시스템 데몬(Systemd service)으로, API Server 와 컨테이너 런타임과 통신하며 컨테이너들을 관리한다.
- Kube-proxy
- 노드 내외부의 통신을 담당하는 컨테이너이다.
- Scheduler
- 새로운 파드가 생성되었을때, 해당 파드를 어느 노드에 실행시킬지 선택하는 컨테이너이다.
Kubernetes 의 기본적인 작동 원리
“상태”
- 바람직한 상태: 사용자가
kubectl
등을 통해 지정해준 사용자가 원하는 리소스의 형태 - 현재 상태: 실제 쿠버네티스 클러스터에의 리소스의 형태
- 상태를 일치시키기 위해 노력하는 것: 컨트롤러
- 이렇게 사용자는 원하는 상태를 클러스터에 알려주는 형식으로 리소스를 생성한다 → 선언적 (Declarative) 아키텍처
Spec, Status
- 바람직한 상태와 현재 상태는 모두 리소스의 YAML 에 저장된다.
- 바람직한 상태는
spec
에 명시 - 현재 상태는
status
에 명시
- 바람직한 상태는
kubectl get deployment ... -o yaml
로spec
과status
를 확인해보자.
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2023-01-25T06:17:49Z"
generation: 1
labels:
app: nginx
name: nginx
namespace: default
resourceVersion: "66785"
uid: e6fbe72b-9198-4928-8ead-0cd515449835
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:stable
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 1
conditions:
- lastTransitionTime: "2023-01-25T06:17:50Z"
lastUpdateTime: "2023-01-25T06:17:50Z"
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
- lastTransitionTime: "2023-01-25T06:17:49Z"
lastUpdateTime: "2023-01-25T06:17:50Z"
message: ReplicaSet "nginx-76769d88f7" has successfully progressed.
reason: NewReplicaSetAvailable
status: "True"
type: Progressing
observedGeneration: 1
readyReplicas: 1
replicas: 1
updatedReplicas: 1