pod는 일회성 싱글톤에 불과하다.

특정 시간 동작하는 여러개 컨테이너의 복제본이 필요하다.

  • 중복성 : 여러 인스턴스가 동작하는 환경에서의 내고장성
  • 확장성 : 여러 인스턴스가 동작하는 환경에서 더 많은 요청 처리가능
  • 샤딩 : 각기 다른 복제를 병렬로 연산처리가능.


여러개의 각기 다른 매니페스트를 사용하여 다수의 pod 복제본을 생성할 수 있다.

논리적으로 pod 복제 집합의 관리자는 이것을 하나의 개체로 인식해 정의하고 관리한다.

이 개념이 리플리카세트이다.

리플리카셋은 클러스터에서 pod가 정확한 종류와 수로 동작하는지 상시 관리하는 pod 관리자 역할이다.

리플리카셋으로 관리하면 노드의 장애나 네트워크 분리 같은 장애 상황에서 pod를 자동으로 스케줄링 한다.

리플리카셋은 pod 라벨 집합을 사용하여 클러스터의 상태를 모니터링 한다.

클러스터에서 라벨을 이용한 pod 목록을 필터링하고 동작중인 pod 를 추적한다. 


리플리카셋 설계

아키텍처 내부에서 확장 가능한 단일 마이크로서비스를 구성하기위한 설계.

리플리카셋 컨트롤러가 생성한 모든 pod가 완전히 동일하다.

리플리카셋은 상태 비저장 서비스로 설계되었다.

리플리카셋은 상호 교환이 불가능하다.

리플리카셋을 축소하면 대상 pod가 삭제되며, 애플리케이션은 영향 받지 않는다.


최소한의 리플리카세트 명세

apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
  name: kuard
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: kuard
        version: "2"
    spec:
      containers:
      - name: kuard
        image: "gcr.io/kuar-demo/kuard-amd64:2"


리플리카셋 생성

kubectl apply 사용한 kuard 리플리카셋트 구성.

# kubectl apply -f kuard-rs.yaml 
replicaset.extensions "kuard" created
# kubectl get pods
NAME          READY     STATUS    RESTARTS   AGE
kuard-mcrsv   1/1       Running   0          4s


리플리카셋 검사

역시 다른 객체와 같이 리플리카셋에 대한 상태 및 더 많은 정보를 확인하기 위해 describe 를 사용한다.

# kubectl describe rs kuard
Name:         kuard
Namespace:    default
Selector:     app=kuard,version=2
Labels:       app=kuard
              version=2
Annotations:  kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"extensions...
Replicas:     1 current / 1 desired
Pods Status:  1 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=kuard
           version=2
  Containers:
   kuard:
    Image:        gcr.io/kuar-demo/kuard-amd64:2
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  2m    replicaset-controller  Created pod: kuard-mcrsv


리플리카셋 확인

어떤 리플리카셋이 관리하고 있는지 확인.

# kubectl get pods {pod name} -o yaml


리플리카셋 Pod 집합 찾기

리플리카셋이 관리하는 pod 집합 확인이 가능.

# kubectl get pods -l app=kuard,version=2


리플리카셋 확장

리플리카셋 객체를 spec.replicas 키를 갱신하여 확장 및 축소가 가능하다.


1. kubectl scale 를 이용한 명령형 확장

데모 또는 긴급상황 (부하가 급격히 증가한 경우) 등 신속한 상황에 

대응하기 위해 유용하지만 실행 후 텍스트 파일 설정을 갱신하여 scale을 통해 수정한 복제본의 수와 일치시키는 작업이 후속 되어야 한다.

# kubectl scale kuard --replicas=4


2. kubectl apply 를 이용한 선언형 확장

선언형 환경에서 버전 제어의 설정 파일을 편집 후 변경사항 작성, 클러스터에 변경사항 적용으로 확장한다.

..
spac:
  replicas: 4
..


# kubectl apply -f kuard-rs.yaml
replicaset "kuard" configured


리플리카셋 자동 확장

웹서버의 경우 CPU 사용량 때문에 확장이 필요할때가 있으며,

인메모리 캐시 에 대한 메모리 수요에 따라 화갖ㅇ이 필요한 경우가 있다.

사용자 정의 애플리케이션의 측정 항목에 따른 화가장이 필요한 경우

모든 상황을 수평적 포드 자동 확장 (HPA, horizontal pod autoscaling) 을 통하여 조정한다.


HPA 는 클러스터에 heapster 포드가 있어야 한다.

Hespster는 측정항목을 추적하고 HPA가 확장여부를 결정할때 사용하는 수요 측정 항목 API를 제공한다.

Heapster 존재여부는 kubectl get pods --namespaces=kube-system 으로 출력결과로 확인할수 있다.

Heapster 가 없는 경우, 자동확장이 정상적으로 동작되지 않는다.


CPU기반 자동확장

CPU기반 확장은 가장 일반적이다.

# kubectl autoscale rs kuard --min=2 --max=5 --cpu-percent=80

CPU 임계치가 80%인 복제본을 2개에서 최대 5개까지 확장하는 자동 확장기 생성.

자동확장의 조회, 변경, 삭제 처리는 표준 다음 명령어를 사용함.

# kubectl get hpa


리플리카셋 삭제

kubectl delete 명령을 사용해 삭제가 가능.

기본적 리플리카셋을 관리하는 pod도 같이 삭제된다.

# kubectl delete rs kuard
replicaset.extensions "kuard" deleted

또는 리플리카셋이 관리하는 pod를 삭제하고 싶지 않는 경우,

--cascade 를 사용하여 리플리카셋 객체만 삭제하고 pod는 남겨둘수 있다.

# kubectl delete rs kuard --cascade=false





  • No labels
Write a comment…