study/클라우드&쿠버네티스

쿠버네티스 (오브젝트, 컨트롤러)

dddzr 2023. 10. 4. 13:15

쿠버네티스 오브젝트 (Kubernetes Objects)

쿠버네티스는 상태를 관리하기 위한 대상을 오브젝트로 정의합니다.

쿠버네티스 오브젝트는 영속성을 가지는 개체이며 쿠버네티스는 클러스터의 상태를 나타내기 위해 이 개체를 이용합니다.

  • 어떤 컨테이너화된 애플리케이션이 동작 중인지 (그리고 어느 노드에서 동작 중인지)
  • 애플리케이션이 이용할 수 있는 리소스
  • 애플리케이션이 어떻게 재구동 정책, 업그레이드, 그리고 내고장성과 같은 것에 동작해야 하는지에 대한 정책
  • 기본 오브젝트(Basic object), 컨트롤러(Controller), 오브젝트 스펙 및 메타 정보로 구성
    • 오브젝트는 사용자가 쿠버네티스에 바라는 상태(desired state)를 의미하고
      컨트롤러는 객체가 원래 설정된 상태를 잘 유지할수있게 관리하는 역할

 

- 기본 오브젝트 (Basic object)

구성 요소

  • Pod: 컨테이너화된 애플리케이션
  • Volume: 디스크
  • Service: 로드밸런서
  • Namespace: 패키지명

1. Pod

Pod는 쿠버네티스에서 가장 기본적인 배포 단위입니다. 

Pod은 하나 이상의 컨테이너 그룹을 포함하며, 이 컨테이너 그룹은 동일한 호스트에서 실행됩니다. 

이러한 컨테이너는 서로 강하게 결합되어 공유 네트워크 및 스토리지를 사용할 수 있습니다. 

일반적으로 하나의 애플리케이션을 실행하는데 사용되며, 서로 강하게 연결된 컨테이너를 필요로 하는 애플리케이션의 복잡성을 관리합니다.

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
    - name: nginx-container
      image: nginx
    - name: database-container
      image: postgres

 

2. Volume

컨테이너 재시작과 상관 없이 파일을 영속적으로 저장하는 스토리지
볼륨은 Pod가 실행될 때 컨테이너에 마운트되어 사용되며 쉽게 컨테이너의 외장 디스크라고 생각하시면 됩니다.
*마운트: row disk 형태 있다면 실제로 사용가능하게 디렉토리에 연결하는 것

볼륨은 NFS(Network File System),  Cinder, CephFS 등과 같은 네트워크 스토리지(외장 디스크)부터 

 AWS EBS(Elastic Block Store), Google PD(Persistent Disk) , Azure Disk Storage 등과 같은 퍼플릭 클라우드 스토리지,

VsphereVolume같은 프라이빗 클라우드 솔루션까지 다양한 유형의 볼륨들을 지원하고 있습니다. 유형에 따라 볼륨이 Pod 내부에 존재할 수도 있고 Pod 외부에 존재할 수도 있습니다.

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
    - name: app-container
      image: my-app
      volumeMounts:
        - name: data-volume
          mountPath: /data
  volumes:
    - name: data-volume
      emptyDir: {}

*mount: 특정디스크와 디렉토리 연결

*컨테이너간에 voulme name을 동일하게 설정하거나 mount path를 이용하여 볼륨을 공유함

 

3. Service

Label Selector로 여러 Pod를 선택하여 하나의 Endpoint로 노출

지정된 IP로 생성이 가능하고, 고유한 DNS 이름을 가질 수 있다.

멀티 포트 지원, Pod 간에 랜덤으로 부하를 분산하는 로드 밸런싱 알고리즘 지원
*Label Selector: 어떤 Pod들을 Service로 묶을 것인지를 정의하는 것

*DNS: IP 주소 및 기타 데이터를 저장하고 이름별로 쿼리할 수 있게 해주는 계층형 분산 데이터베이스

*로드 밸런싱: 부하 분산

apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  selector:
    app: example-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080


*라벨(Label)

  • 쿠버네티스의 리소스를 선택하는데 사용되는 선택 조건
  • metadata 섹션에 Key:Value 형태로 정의할 수 있으며, 하나의 리소스에 여러개의 라벨을 동시에 적용할 수도 있습니다.
metadata:
  labels:
    app: frontend

 

4. Namespace

한 쿠버네티스 클러스터내의 논리적인 분리단위이며

물리적 분리가 아니라서 다른 네임 스페이스간의 pod 라도 통신은 가능합니다.

① 사용자별로 네임스페이스별 접근 권한(사용자권한)을 다르게 운영 가능

② 네임스페이스별로 리소스의 쿼타 (할당량)을 지정 가능

③ 네임 스페이스별로 리소스를 나눠서 생성, 관리 할 수 있다. (Pod, Service 등)

apiVersion: v1
kind: Namespace
metadata:
  name: example-namespace

 

- 컨트롤러(Controller)

기본 오브젝트들을 생성하고 이를 관리

컨트롤러는 Replication Controller (aka RC), Replication Set, DaemonSet, Job, StatefulSet, Deployment 등 존재

1. Replication Controller (RC)

  • Replication Controller는 Pod를 지정된 숫자로 Pod를 기동 시키고 관리해주는 역할
  • 크게 Replica의 수, Pod Selector, Pod Template 3가지로 구성


2. ReplicaSet

  • ReplicaSet은 Replication Controller 의 새버전
  • Replication Controller 는 Equality 기반 Selector를 이용하는데 반해, Replica Set은 Set 기반의 Selector를
    이용


3. Deployment

  • ReplicaSet의 상위 추상화 개념으로, Pod와 ReplicaSet에 대한 배포를 관리
  • 실제 운영에서는 ReplicaSet 이나 Replication Controller를 바로 사용하는 것보다, 좀 더 추상화된 Deployment를 사용


4. DaemonSet (DS)

  • DaemonSet역시 Deployment와 유사하게 Pod를 생성하고 관리하지만, 전체 노드(서버)에서 항상 실행되어야 하는 특정 Pod를 실행할 때 사용
  • DS에 의해 관리되는 Pod는 모든 노드에 균등하게 하나씩만 배포
  • 특정 노드에만 Pod를 배포할 수 있도록 , Pod의 “node selector”를 이용해서 라벨을 이용하여 특정 노드만을 선택할 수 있게 지원


5. Job

  • 워크로드 모델중에서 배치나 한번 실행되고 끝나는 형태의 워크로드 모델(백업이나 배치 작업 등)을 지원하는 컨트롤러
  • Job에 의해서 관리되는 Pod는 Job이 종료되면, Pod 를 같이 종료
  • Job을 정의할 때 컨테이너 스펙 부분에 image 뿐만 아니라, 컨테이너에서 Job을 수행하기 위한 커맨드(command) 를 같이 입력


6. StatefulSet

  • 데이타 베이스등과 같이 상태를 가지고 있는 Pod를 유지하고 관리할 때 사용쿠버네티스의 디스크 볼륨에 대한 이해가 필요