YUMSERV
article thumbnail
Published 2022. 7. 17. 20:45
[Kubernetes] Kubernetes 정의 Kubernetes
반응형

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 ./

 

 

 

반응형
profile

YUMSERV

@lena04301

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!