1. Kubernetes 란
1) Kubernetes 란
구글 내부에서 배포 시스템 borg를 기반으로 재작성하여 2014년 오픈소스로 공개
가장 대표적인 컨테이너 오케스트레이션 시스템
CNCF 재단에서 관리
2) 컨테이너 오케스트레이션 시스템이란?
컨테이너의 배포, 관리, 확장, 네트워킹을 자동화 하는 기술
여러대의 머신 → 클러스터 상태에서 관리 (* Docker, Docker-compose : 한대의 머신에서 컨테이너를 관리)
- Scheduling
- Load balancing
- Self Healing
- Resource Allocation
- Scaling
- Rollback / Rollout
- Service Discovery
- Configuration Management
- Storage Orchestration
운영체제는 하나의 머신에서 프로세스를 효율적으로 관리하기 위한 프로세스 오케스트레이션 시스템이라면
컨테이너 오케스트레이션 시스템은 여러머신에서 구성된 클러스터 상에서 컨테이너를 효율적으로 관리하기 위한 시스템
다양한 오케스트레이션 시스템
- Docker swarm
- Nomad (Hashicorp)
- Rancher
- Mesos
3) 왜 쿠버네티스인가?
Planet scale
- 구글에서 수십억개의 컨테이너를 운영할 수 있게 한 원칙 유지
- 행성 규모를 확장할 수 있는 스케일
Never Outgrow
- 다양한 요구사항을 만족할 수 있는 유연함
- 테스트용 로컬 규모부터 글로벌 서비스 규모까지 유연하게 크기 조정 가능
- 필요한 기능이 없을 경우 CRD를 통한 기능 확장
Run Anywhere
- 온프레미스 / 퍼블릭 클라우드 / 하이브리드 환경 어디서나 동작
- 대부분의 리눅스 환경에서 동작하기 때문에 환경 이동에 제약이 없음
4) 주의 사항
복잡한 클러스터 구성
- 쿠버네티스 자체가 여러 컴포넌트로 구성된 분산시스템
- 각 컴포넌트에 대한 이해 필요
방대한 학습량
- 다른 컨테이너 오케스트레이션 시스템보다 다양한 지식이 필요
- 더 많은 요구사항을 만족하는 만큼, 익혀야 하는 기능도 많음
오버 엔지니어링
- 운영해야 하는 서비스에 적합한가?
- 쿠버네티스 운영 및 관리에 필요한 인력과 비용이 충분한가?
2. 쿠버네티스 배포판 종류
1) 다양한 쿠버네티스 배포판
로컬 쿠버네티스 배포판
단일 노드에 빠르게 쿠버네티스 테스트가 가능
일부 기능 제한
- 클라우드 플랫폼에서만 사용 가능한 기능
- ALB, NLB, EBS in AWS
- 여러 노드 환경에서 사용 가능한 리소스
- DaemonSet, Affinity / Taint / Toleration
운영 쿠버네티스 배포판
3. 쿠버네티스 클러스터 구성요소
1) 클러스터 구성
Control Plane (Master Node)
- 클러스터의 관리하는 역할 담당
- 상태 관리 및 명령어 처리
Node (Workder Node) - Data Plane
- 어플리케이션 컨테이너 실행
2) 제어 영역(Control Plane)
API Server
- 쿠버네티스 리소스와 클러스터를 관리를 위한 API 제공
- etcd를 데이터 저장소로 사용
Scheduler
- 노드의 자원 사용 상태를 관리하며, 새로운 워크로드를 어디에 배포할지 관리
Controller Manager
- 여러 컨트롤러 프로세스를 관리.
- 각 컨트롤러는 클러스터로부터 특정 리소스 상태의 변화를 감지하여 클러스터에 반영하는 reconcile 과정을 반복 수행
Etcd (데이터베이스)
- 분산 Key - Value 저장소로 클러스터 상태를 체크
- 백업 / 복구
3) 노드(Node)
kubelet
- 컨테이너 런타임(Container Runtime)과 통신하며 컨테이너 라이프사이클 관리
- API 서버와 통신하며 노드의 리소스 관리
CRI(Container Runtime Interface)
- kubelet이 컨테이너 런타임과 통신할 때 사용되는 인터페이스
- 쿠버네티스는 Docker, containered, cri-o 컨테이너 런타임 지원
kube-proxy
- 오버레이 네트워크 구성
- 네트워크 프록시 및 내부 로드밸런서 역할 수행
4. API 리소스
1) API 리소스와 오브젝트
API 리소스
- 쿠버네티스가 관리할 수 있는 오브젝트의 종류
- Pod, Service, ConfigMap, Secret
- Node, ServiceAccount, Role
오브젝트(Object)
- API 리소스를 인스턴스화 한 것
현재 쿠버네티스 클러스터가 지원하는 API 리소스 목록 출력
$ kubectl api-resources
NAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
events ev v1 true Event
limitranges limits v1 true LimitRange
namespaces ns v1 false Namespace
nodes no v1 false Node
persistentvolumeclaims pvc v1 true PersistentVolumeClaim
persistentvolumes pv v1 false PersistentVolume
pods po v1 true Pod
podtemplates v1 true PodTemplate
replicationcontrollers rc v1 true ReplicationController
resourcequotas quota v1 true ResourceQuota
secrets v1 true Secret
serviceaccounts sa v1 true ServiceAccount
services svc v1 true Service
mutatingwebhookconfigurations admissionregistration.k8s.io/v1 false MutatingWebhookConfiguration
validatingwebhookconfigurations admissionregistration.k8s.io/v1 false ValidatingWebhookConfiguration
customresourcedefinitions crd,crds apiextensions.k8s.io/v1 false CustomResourceDefinition
apiservices apiregistration.k8s.io/v1 false APIService
controllerrevisions apps/v1 true ControllerRevision
daemonsets ds apps/v1 true DaemonSet
deployments deploy apps/v1 true Deployment
replicasets rs apps/v1 true ReplicaSet
statefulsets sts apps/v1 true StatefulSet
tokenreviews authentication.k8s.io/v1 false TokenReview
localsubjectaccessreviews authorization.k8s.io/v1 true LocalSubjectAccessReview
selfsubjectaccessreviews authorization.k8s.io/v1 false SelfSubjectAccessReview
selfsubjectrulesreviews authorization.k8s.io/v1 false SelfSubjectRulesReview
subjectaccessreviews authorization.k8s.io/v1 false SubjectAccessReview
horizontalpodautoscalers hpa autoscaling/v2 true HorizontalPodAutoscaler
cronjobs cj batch/v1 true CronJob
jobs batch/v1 true Job
certificatesigningrequests csr certificates.k8s.io/v1 false CertificateSigningRequest
leases coordination.k8s.io/v1 true Lease
endpointslices discovery.k8s.io/v1 true EndpointSlice
events ev events.k8s.io/v1 true Event
flowschemas flowcontrol.apiserver.k8s.io/v1beta3 false FlowSchema
prioritylevelconfigurations flowcontrol.apiserver.k8s.io/v1beta3 false PriorityLevelConfiguration
ingressclasses networking.k8s.io/v1 false IngressClass
ingresses ing networking.k8s.io/v1 true Ingress
networkpolicies netpol networking.k8s.io/v1 true NetworkPolicy
runtimeclasses node.k8s.io/v1 false RuntimeClass
poddisruptionbudgets pdb policy/v1 true PodDisruptionBudget
clusterrolebindings rbac.authorization.k8s.io/v1 false ClusterRoleBinding
clusterroles rbac.authorization.k8s.io/v1 false ClusterRole
rolebindings rbac.authorization.k8s.io/v1 true RoleBinding
roles rbac.authorization.k8s.io/v1 true Role
priorityclasses pc scheduling.k8s.io/v1 false PriorityClass
csidrivers storage.k8s.io/v1 false CSIDriver
csinodes storage.k8s.io/v1 false CSINode
csistoragecapacities storage.k8s.io/v1 true CSIStorageCapacity
storageclasses sc storage.k8s.io/v1 false StorageClass
volumeattachments storage.k8s.io/v1 false VolumeAttachment
특정 API 리소스에 대해 간단한 설명 확인
$ kubectl explain pod
KIND: Pod
VERSION: v1
DESCRIPTION:
Pod is a collection of containers that can run on a host. This resource is
created by clients and scheduled onto hosts.
FIELDS:
apiVersion <string>
APIVersion defines the versioned schema of this representation of an
object. Servers should convert recognized schemas to the latest internal
value, and may reject unrecognized values. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
kind <string>
Kind is a string value representing the REST resource this object
represents. Servers may infer this from the endpoint the client submits
requests to. Cannot be updated. In CamelCase. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
metadata <Object>
Standard object's metadata. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
spec <Object>
Specification of the desired behavior of the pod. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
status <Object>
Most recently observed status of the pod. This data may not be up to date.
Populated by the system. Read-only. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
2) 매니페스트 파일
쿠버네티스는 오브젝트를 YAML 기반 매니페스트 파일로 관리.
apiVersion, kind, metadata : 필수 지정
apiVersion : 오브젝트가 어떤 API 그룹에 속하고 API 버전이 몇인가?
kind : 오브젝트가 어떤 API 리소스인가?
metadata : 오브젝트를 식별하기 위한 정보(이름, 네임스페이스, 레이블 등)?
spec : 오브젝트가 가지고자 하는 데이터는?
→ API 리소스에 따라 spec 대신 data, rules, subjects 등 다른 속성 사용
3) Labels 와 Annotations
모든 쿠버네티스 오브젝트는 Labels과 Annotations 메타데이터를 가질 수 있음
둘 모두 문자열(String) 형식의 Key - Value 데이터를 기록
Labels
- 오브젝트를 식별하기 위한 목적
- 검색 / 분류 / 필터링 등의 목적으로 사용
- 쿠버네티스 내부 여러 기능에서 Label Selector 기능 제공
Annotations
- 식별이 아닌 다른 목적으로 사용
- 보통 쿠버네티스의 애드온이 해당 오브젝트를 어떻게 처리할지 결정하기 위한 설정 용도로 사용
5. Kubectl 사용
1) 명령형 vs 선언형
명령형(Imperative)
- 수행하고자 하는 액션을 지시
- 적은 리소스에 대해서 빠르게 처리 가능
- 여러 명령어를 알아야 함
선언형(Declarative)
- 도달하고자 하는 상태(Desired State)를 선언
- 코드로 관리 가능 → GitOps 활용 가능
- 변경사항에 대한 감사(Audit) 용이
- 코드 리뷰를 통한 협업
- 멱등성 보장(apply)
- 많은 리소스에 대해서도 매니페스트 관리 방법에 따라 빠르게 처리 가능
- 알아야 할 명령어 수가 적음
2) Kubectl 명령형 명령어
ubuntu:focal 이미지로 ubuntu 파드 생성
$ kubectl run -it ubuntu --image=ubuntu:focal bash
grafana Deployment 오브젝트에 대해 NodePort 타입의 Service 오브젝트 생성(노드에 포트 개방)
$ kubectl expose deployment grafana --type=Nodeport --port=80 --target-port=3000
frontend Deployment 의 www 컨테이너 이미지를 image:v2로 변경
$ kubectl set image deployment/frontend www=image:v2
frontend Deployment를 리비전 2로 롤백
$ kubectl rollout undo deployment/frontend --to-revision=2
3) kubectl 선언형 명령어
deployment.yaml에 정의된 쿠버네티스 오브젝트 클러스터에 반영
$ kubectl apply -f deployment.yaml
deployment.yaml에 정의된 쿠버네티스 오브젝트 제거
$ kubectl delete -f deployment.yaml
현재 디렉토리 kustomization.yaml 파일을 쿠버네티스 오브젝트 클러스터에 반영
$ kubectl apply -k ./