본문 바로가기
database/DevOps를 위한 Kubernetes 시작

{쿠버네티스와 컨테이너} 가상화 컨테이너란?

by 문파워 2020. 11. 15.
더보기

요약

가상화 컨테이너란?

쿠버네티스 기본 오브젝트?

쿠버네티스 라벨?

Workload Resources

※ 가상화 컨테이너란?

 

컨테이너는 애플리케이션과 애플리케이션을 구동하는 환경을 격리한 공간을 의미한다.

 

대부분의 서버 장비들은 컴퓨팅 환경을 소프트웨어로 구현한 가상머신 (VM: Virtual Machine) 을 사용하고 있으며 이 서버들은 다수의 운영체제를 동시에 실행하기 위해 하이퍼바이저가 필요하고, 그 상위 계층에 Guest OS가 각각 설치된 가상머신들을 구동시킨다.

 

반면에 컨테이너로 구성된 서버는 하이퍼바이저를 사용하지 않고 CPU, RAM, Disk, Network 과 같은 운영체제의 자원을 필요한 만큼 격리하여 컨테이너에 할당한다.

 

출처: kubernetes.io


※ 쿠버네티스 기본 오브젝트?

 

오브젝트는 사용자가 쿠버네티스에 바라는 상태 (desired state) 를 의미하고 

컨트롤러는 객체가 원래 설정된 상태를 잘 유지할 수 있게 관리하는 역할을 하는데, 

쿠버네티스에 의해서 배포 및 관리되는 가장 기본적인 오브젝트는 컨테이너화되어 배포되는 애플리케이션의 워크로드를 기술하는 오브젝트로 Pod, Service, Volume, Namespace 4가지가 있다. 

 

Pod: 컨테이너화된 애플리케이션

  • 쿠버네티스는 Pod 단위로 배포한다. (하나의 컨테이너를 개별으로 배포하는 것이 아닌 )
  • 쿠버네티스에서 가장 기본적인 배포 단위로 하나 이상의 컨테이너를 포함하는 단위이다
  • 일반적으로 1 Pod 1 Container 
  • Pod 내의 컨테이너들은 IP, Port 를 공유한다
  • Pod가 재시작되면 IP가 변경되며 Pod내의 컨테이너들의 로컬디스크 내용이 사라진다
  • Pod 내에 배포된 컨테이너간에는 디스크 볼륨 공유 가능 
  • Pod Templates
apiVersion: batch/v1
kind: Job
metadata:
  name: hello
spec:
  template:
    # This is the pod template
    spec:
      containers:
      - name: hello
        image: busybox
        command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 3600']
      restartPolicy: OnFailure
    # The pod template ends here

출처: kubernetes.io/docs/concepts/workloads/pods/#pod-templates

 

 

Volume: 일종의 디스크, 저장소

  • (Pod가 기동될 때 디폴트로 컨테이너마다 로컬디스크를 생성해서 기동되지만 이 로컬디스크의 경우 영구적이지 못하다.)
  • 데이터베이스와 같이 영구적으로 파일을 저장해야하는 경우에는 컨테이터 재시작과 상관없이 파일을 영속적으로 저장해야 하는데, 이러한 형태의 스토리지를 Volume(볼륨)이라고 한다.
  • Volume은 Pod와 라이프사이클이 같다.
  • Volume은 컨테이너의 외장디스크와 유사하며 Pod가 기동될때 컨테이너에 마운트하여 사용된다.
  • 쿠버네티스는 다양한 외장디스크를 제공한다. (iSCSI, NFS - Onpremiss 기반의 외장 스토리지 / AWS EBS, Google PD - 클라으드 외장 스토리지 / github - 오픈소스 기반 외장스토리지 서비스 지원)

 

Service: 로드밸런서

  • Label Selector로 Pod를 선택하여 하나의 Endpoint로 노출 (Lable Selector: 서비스를 정의할 때 어떤 Pod들을 Service로 묶을 것인지를 정의하는 것)
  • 일반적으로 하나의 Pod로 서비스하는 경우는 드물고 여러개의 Pod를 서비스하며 이를 로드밸런서를 이용해 하나의 IP와 Port로 묶어서 서비스를 제공
  • 프리버전을 사용하게 되면 WorkerNode의 NodePort로 밖에 접근할 방법이 없다.
  • 각 Pod를 생성할 때 Object Spec의 metadata 부분에서 Pod에서 사용할 Label을 정의할 수 있다.
  •  
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

출처: kubernetes.io/docs/concepts/services-networking/service/#defining-a-service

 

Namespace: 패키지명

  • 하나의 쿠버네티스 클러스터내의 논리적인 분리 단위이다. (물리적인 기타 장치를 통해서 환경을 분리 (Isolation) 한 것이 아님) 
  • 다른 Namespace 간의 Pod라도 통신은 가능하다.
  • Namespace 는 사용자별로 접근 권한을 다르게 운영 가능하고 
  • Namespace 별 리소스의 할당량 저장 가능하며 
  • Namespace 별 리소스를 나눠서 관리 가능하다 (Pod, Service 등)

 


※ 쿠버네티스 라벨

  • 쿠버네티스 리소스
  • 라벨은 쿠버네트스의 리소스를 선택하는데 사용된다
  • 각 리소스는 라벨을 가질 수 있고, 라벨 검색 조건에 따라서 특정 라벨을 가지고 있는 리소스만을 선택 가능하다
  • 특정 리소스만 배포/업데이트할 수 있다
  • 라벨로 선택된 리소스만 Service에 연결하거나
  • 특정 라벨로 선택된 리소스에만 네트워크 접근 권한을 부여하는 등의 행위 가능하다
  • Label은 metadata 섹션에 키/값 의 쌍으로 정의가 가능하다
"metadata": {
  "labels": {
    "key1" : "value1",
    "key2" : "value2"
  }
}

출처: kubernetes.io/docs/concepts/overview/working-with-objects/labels/

 


※ Workload Resources

요약

더보기
  1. Replication Controller
  2. ReplicaSet
  3. Deployment
  4. DaemonSet
  5. Job
  6. StatefulSet
  7. ...

1. Replication Controller (이하 RC)

RC는 Pod를 관리해주는 역할로 지정된 숫자로 Pod를 기동 시키고 , 관리하는 역할

RC는 크게 3가지로 구성된다.

  : replicas 의 수 / (pod) selector / (pod) template  

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

출처: kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/#running-an-example-replicationcontroller

 

2. ReplicaSet

RC의 새버전

RC는 Equlity 기반의 Selector를 이용하는데 반해

ReplicaSet은 Set 기반의 Selector를 이용

참고: kubernetes.io/docs/concepts/workloads/controllers/replicaset/

 

3. Deployment

Deployment RC와 ReplicaSet의 좀 더 상위 추상화 개념

실제 운영에서는 RC나 ReplicaSet을 바로 사용하는 것 보다 좀 더 추상화된 Deployment 를 사용한다.

참고: kubernetes.io/docs/concepts/workloads/controllers/deployment/

 

4. DaemonSet (이하 DS)

DS는 Pod가 각각의 노드에서 하나씩만 돌게 하는 형태로 Pod를 관리하는 컨트롤러

DS에 의해 관리되는 Pod는 모든 노드에서 균등하게 하나씩만 배포된다

특정 노트에서만 Pod를 배포할 수 있도록 Pod의 'node selector' 라벨을 이용하여 특정 노드만을 선택할 수 있게 지원

참고: kubernetes.io/docs/concepts/workloads/controllers/daemonset/

 

5. Job

워크로드 모델중에서 배치 / 한번 실행되고 끝나는 형태의 워크로드 모델을 지원하는 컨트롤러

Job에 의해서 관리되는 Pod는 Job 종료되면 Pod도 같이 종료된다

Job을 정의할 때 컨테이너 스펙 부분에서 image 뿐만 아니라 , Job을 수행하기 위한 command 같이 입력할 수 있다.

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4
  

 

참고: kubernetes.io/docs/concepts/workloads/controllers/job/

 

6. StatefulSet 

데이터베이스등과 같이 상태를 가지고 있는 Pod를 지원하기 위해서 새롭게 등장했다.

쿠버네티스의 디스크 볼륨에 대한 선행적 이해가 필요하다.

참고: kubernetes.io/docs/concepts/workloads/controllers/statefulset/

 


 

 


 

Kubernetes Concepts

https://kubernetes.io/docs/concepts/

 

Concepts

Production-Grade Container Orchestration

kubernetes.io

와 한글이다

kubernetes.io/ko/docs/concepts/overview/what-is-kubernetes/

 

쿠버네티스란 무엇인가?

쿠버네티스는 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식할 수 있고, 확장 가능한 오픈소스 플랫폼으로, 선언적 구성과 자동화를 모두 지원한다. 쿠버네티스는 크고 빠르게 성장하

kubernetes.io

 

댓글