Infra/Kubernetes

Controller - ReplicaSet 특징 -> Template, Replicas, Selector

최-코드 2025. 6. 12. 01:00
ReplicaSet 컨트롤러와 파드는 서비스와 파드처럼 라벨과 셀렉터로 연결할 수 있다.
컨트롤러를 삭제하면 연결된 파드들도 모두 삭제되기 때문에 주의해야 한다. 대쉬보드가 아닌, 터미널에서 아래의 명령어를 사용하면 파드는 삭제하지 않고, 컨트롤러만 삭제할 수 있게 된다.
-> kubectl delete replicationcontrollers replication1 --cascade=false

Template

  • 템플릿 기능은 아래와 같다.
    • 컨트롤러를 만들 때 템플릿으로 파드의 내용을 넣게 되는데, 오토 힐링의 기능을 사용하기 위함이다.
    • 즉, 사진 상 왼쪽 Pod가 죽었을 때 템플릿을 통해 파드를 새로 만들어준다.
    • 이러한 기능을 통해 소프트웨어 업데이트 기능을 이끌어낼 수 있다.
      • 템플릿을 v2에 대한 파드로 업데이트하고, 기존에 연결되어 있는 파드를 다운시키면  v2의 파드를 생성하게 된다.

  • template에서도 라벨을 지정해줘야 새로 만들어질 때 replication-1 컨트롤러와 연결이 된다.
  • template 부분은 Pod를 만들 때와 동일한 yaml 구조로 정의하듯이 해준다.
  • name을 넣어줘도 replicas에 맞춰서 새로 생성될 때는 임의의 이름으로 생성된다.

Replicas

  • replicas 만큼 파드의 개수가 관리된다.
    • 만약 파드가 삭제가 되거나 장애가 발생하면 replicas 수를 맞추기 위해 새로운 파드를 생성한다.
    • replicas의 수를 늘리면 그만큼 스케일 아웃이 된다.
yaml 파일은 위의 설명 사진 참고
화살표는 임의로 보여주는 것으로, 그저 정수 하나만을 적어줘야 한다.

Selector

  • ReplicaSet에는 ReplicationController와 다르게 selector에 두 가지 추가적인 속성이 있다.
    • matchLabels:  ReplicationController와 같이 Key:Value가 모두 같아야지 연결을 해주는 기능
    • matchExpressions: Key:Value를 좀 더 디테일하게 컨트롤할 수 있게 해준다. 예를 들어 사진 속 key를 ver이라고 지정하고 operator를 Exists로 할 시에, value에 상관없이 key 이름이 ver인 파드를 모두 연결해준다.

  • ReplicationController는 현재 deprecated 상태이므로 ReplicaSet만을 사용하도록 지향해야 한다.
  • matchLabels or matchExpressions 둘 중 하나를 꼭 정의해줘야 한다. ReplicationController처럼 바로 Key:Value 선언이 불가능하다.
  • operator의 종류는 오른쪽 사진과 같다.
    • Exists: 지정한 key의 값과 동일한 파드를 연결해준다.
    • DoesNotExist: 지정한 key의 값과 동일하지 않은 파드를 연결해준다.
    • In: 지정한 key의 값과, values에 지정한 값 중 만족하는 파드를 연결해준다.
    • NotIn: 지정한 key의 값과, values에 지정한 값 중 만족하지 파드를 연결해준다. -> key의 값이 같은 것 중에서 values만 만족하지 않는 파드를 연결해준다.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replica1
spec:
  replicas: 1
  selector:
    matchLabels:
      type: web
      ver: v1
    matchExpressions:
    - {key: type, operator: In, values: [web]}
    - {key: ver, operator: Exists}
  template:
    metadata:
      labels:
        type: web
        ver: v1
        location: dev
    spec:
      containers:
      - name: container
        image: kubetm/app:v1
      terminationGracePeriodSeconds: 0
  • matchLabels의 각 라벨에 대해 template의 labels에서 만족하는게 존재하면 생성된다.
  • 만약 matchLabels의 ver: v1이 ver: v3으로 변경되면 오류가 발생해 생성되지 않는다.
  • template의 labels에서 그 외의 추가적인 라벨은 더 생겨도 문제 없다.