[Kubernetes] POD, ReplicaSet, Deployment

1. POD

1-1. 소개

k8s에서 서비스를 운영할 때 하나의 서비스 인스턴스 단위로 사용하는 개념이다. k8s는 컨테이너 이미지를 직접 운영하지 않고 POD라는 단위로 묶어서 관리한다. 한 POD 안에는 여러 복수의 컨테이너들이 있을 수 있고 같은 POD안에서는 같은 네트워크, 볼륨을 공유할 수 있기 때문에 컨테이너 간의 연결을 쉽게 사용할 수 있다. 서비스 스케일링의 단위도 POD 단위로 수행한다.

1-2. 명령어

# Docker hub 등 리파지터리에서 이미지를 가져와 POD를 실행할 경우
kubectl run nginx —image nginx
# POD 리스트와 상태를 조회
kubectl get pods
# POD의 상세정보 조회
kubectl describe pod nginx

2. ReplicaSets(Replication-Controller)

2-1. 소개

Replication Controller는 POD의 수를 원하는 상태로 모니터링하고 유지시켜주는 역할을 한다. 이를 통해 고가용성이나 로드밸런싱, 스케일링을 달성할 수 있다. 또한 명령어 하나로 여러 POD를 실행하거나 업데이트, 삭제할 수 있게 해준다. ReplicaSet은(Deployment와 함께 사용해) Replication Controller을 대체하기 위해 나왔지만 현재는 둘 다 사용가능하다. 기능은 거의 동일하나 selector 탭 다음 부분이 달라졌다. matchLabels 항목으로 변경되며 매칭되는 문자열의 Pod 검색 뿐만이 아니라 In, NotIn, Exist 등의 연산자를 사용할 수 있게 되었다.

2-2. 명령어

# yml 파일로 생성
kubectl create -f replicaset-definition.yml
# 레플리카셋 조회
kubectl get replicaset
kubectl describe replicaset
# 레플리카셋 삭제(포함된 POD 전부 삭제됨)
kubectl delete replicaset myapp-replicaset
# 스케일링하기 위해 yml파일의 replicas 수를 조정 후 반영하는 구문
kubectl replace -f replicaset-definition.yml
# 수동으로 replicas를 변경하여 스케일링. yml파일에는 변경이 안된다.
kubectl scale --replicas=6 -f replicaset-definition.yml
kubectl scale --replicas=5 rs/my-replicaset

2-3. YAML파일

apiVsersion: app/v1 #replicaset을 쓰기 위해서는 v1에서는 안됨
kind: ReplicaSet
metadata: 
 name: myapp-replicaset
 labes:
  app: myapp
  type: front-end
spec: 
 template: #Pod definition으로 작성했던 파일의 metadata부분을 그대로 넣음
  metadata: 
   name: myapp-pod
   labels: 
    app: myapp
    type: front-end
   spec: 
    containers:
     - name: nginx-container
       image: nginx
 replicas: 3
 selector: # 상태모니터링 할 pod를 검색조건으로 지정할 수 있음
  matchlabels:
   type: front-end

3. Deployment

3-1. 소개

Deployment는 ReplicaSet에 더해 어플리케이션 배포와 관련된 Update, Rolling Update(배포로 인한 유저 영향을 고려해 1 POD 씩 업데이트를 적용하는 방식) , Pause & Resume 등의 기능을 포함한 개념이다. 실제 서비스 환경에서는 ReplicaSet보다는 Deployment로 정의하고 실행하는게 대부분일 것이다. yaml 파일도 ReplicaSet과 큰 차이는 없으며 kind에 Deployment를 지정한다. deployment 정의서를 만들어 kubectl create -f 문을 실행하면 deployment, replicaset, pod가 모두 생성되는 것을 확인할 수 있다.

3-2. 명령어

# 생성된 모든 리소스 확인 (Deployment , POD 포함 한번에 확인 가능)
kubectl get all

# deployment 생성
kubectl create deployment --image=nginx nginx --replicas=4

# yaml 파일 생성
kubectl create deployment --image=nginx nginx --dry-run -o yaml

# scale 명령
kubectl scale deployment nginx --replicas=4

3-3 Deployment 편집 시 팁

실행 중인 파드에 대해 수정이 필요할 때 일부 옵션들은 파드를 종료하고 새로 시작해야만 적용이 되는 것들이 있다. 이 때 Deployment 안에 파드가 있을 경우 변경이 간단하다.
$ kubectl edit deployment my-deployment
edit 커맨드로 편집을 하면 파드는 deployment의 자식 개체이므로 자동으로 삭제와 실행을 수행한다.


파드를 직접 편집할 경우에는 두가지 방법이 있다.

1) kubectl edit pod pod-name
2) vi에서 변경 내용 적용하고 저장
3) 변경할 수 없는 옵션이라며 저장에 실패하고 변경내용은 /tmp 영역에 저장된다.
4) kubectl delete pod pod-name
5) /tmp/아래에 있는 파일명으로 파드를 생성한다.


또 한가지 방법은 yaml 파일을 추출하는 것이다.

1) kubectl get pod webapp -o yaml > my-new-pod.yml
2) vi my-new-pod.yml
3) kubectl delete pod webapp
4) kubectl create -f my-new-pod.yml

'Kubernetes' 카테고리의 다른 글

[Kubernetes] 클러스터 업그레이드  (0) 2020.12.17
[Kubernetes] 어플리케이션 배포 관리  (0) 2020.12.11
[Kubernetes] 모니터링, 로깅  (0) 2020.11.28
[Kubernetes] Service  (0) 2020.11.19
[Kubernetes] 기초 + minikube 설치  (0) 2020.07.30