Kubernetes

Kubernetes 기초 - Controller(2)

사실 나도 모름 2023. 12. 12. 03:15
  1. ReplicationController
  2. ReplicaSet       ←  오늘 볼 내용
  3. Deployment
  4. DaemonSet
  5. StatefulSet
  6. Job
  7. CronJob

2. ReplicaSet

기능적으로는 이전에 봤던 ReplicationController 와 기능적으로 거의 동일하다.

그럼에도 불구하고 ReplicaSet을 사용하는 이유는 더 정교한 LabelSelector의 기능이 있기 때문이다.

ReplicationController는 selector를 통해 라벨을 지정했을 때 여러개를 지정하며 AND연산과 같이 모두 동일해야 파드 선택이 가능했다.

하지만 ReplicaSet은 matchExpressions를 통해 In, NotIn, Exists, DoesNotExist 등 연산을 사용하여 특정 라벨만이라도 일치하면 파드가 선택되는 정교한 작업이 가능하다. 

 

 

matchExpressions 연산자

  • In : key와 values를 지정하여 key, value가 일치하는 Pod만 연결
  • NotIn : key는 일치하고 value는 일치하지 않는 Pod에 연결
  • Exists : key에 맞는 label의 Pod를 연결
  • DoesNotExist : key와 다른 label의 Pod를 연결

 

기본 형태
ReplicationController definition ReplicaSet definition
apiVersion: v1
kind: ReplicationController
metadata:
  name: rc-nginx
spec:
  replicas: 3
  selector:
    app: webui
  template:
    metadata:
      labels:
        app: webui
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.25

apiVersion: apps/v1
kind: ReplicaSet
metadata:  
  name: rs-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webui
  template:
    metadata:
      labels:
        app: webui
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.25

 

왼쪽과 오른쪽은 같은 결과를 출력하며 차이점은 apiVersion과 kind 그리고 selector의 표기법이다.

 

 

ReplicaSet의 matchExpressions
In NotIN
selector:    
  matchExpressions:
  - {key: version, operator: In, values: ["2.1", "2.2"]}
selector:  
  matchExpressions:
  - {key: version, operator: NotIn, values: [main, sub]}
Exists DoesNotExist
selector:    
  matchExpressions:
  - {key: version, operator: Exists}
selector:    
  matchExpressions:
  - {key: version, operator: DoesNotExist}

 

 

위와 같이 사용이 가능하다.

위 코드를 보면 다음을 알 수 있다.

  • 반드시 matchExpressions의 내용 전체는 중괄호 { } 로 묶어서 입력을 한다.
  • 제일 앞에 '-' 가 앞에 있는 것을 보면 여러줄 조건을 적용하여 사용이 가능하다.
  • In과 NotIn의 경우는 value를 대괄호 [ ] 로 묶어서 값을 넣어줘야 한다.

 

 

ReplicaSet 생성

 

yaml 코드는 위 기본 형태의 코드 그대로 사용한다.

# rs-nginx.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:  
  name: rs-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webui
  template:
    metadata:
      labels:
        app: webui
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.25

파드 3개 실행

 

 

 

ReplicaSet 구성 수정

 

# kubectl scale을 이용한 replicas 수정
kubectl scale rs rs-nginx --replicas=2

replicas: 3에서 2로 변경

 

ReplicationController의 경우와 동일하게 scale 명령으로 유지할 파드의 개수를 수정할 수 있다.

물론 kubectl edit으로도 수정이 가능하다.

 

 

 

cascade 옵션

 

일반적으로 ReplicationController든 ReplicaSet이든 컨트롤러를 지우면 생성했던 파드도 함께 지워진다.

하지만 관리자 입장에서 컨트롤러는 삭제하되 파드는 유지시키고 싶은 때가 있을 것이다.

그 때 사용하는 옵션이 '--cascade=false' 다.

# cascade옵션을 적용 후 컨트롤러 삭제
kubectl delelte rs rs-nginx --cascade=false

주의의 내용은 거의 사용되지 않는다는 뜻이므로 그냥 무시한다.
컨트롤러를 삭제해도 변화없음.
컨트롤러 없음

 

이와 같이 컨트롤러만 삭제하고 파드는 유지시킬 수 있다.

 

 


 

 

여기서 고민해볼 점은 현재 app=webui라는 label을 가진 파드가 2개 있다.

만약 selector로 app: webui를 가지고 replicas: 3인 컨트롤러를 생성하면 파드는 몇개가 생성될까?

당연히 이미 2개가 조건을 만족하기에 하나만 생성된다.

전혀 다른 시스템인 파드라고 할지라도 label의 내용과 selector의 내용이 일치하면 존재하는 것으로 인지하고 파드 개수 제어를 하는 것이다.

그러므로 라벨의 내용은 중복되지 않도록 잘 정해야 하는 것이다.

 

 

 

실습

 

1. 다음의 조건으로 ReplicaSet을 사용하는 rs-lab.yaml 파일을 생성하고 동작시킵니다.

- labels(name: apache, app: main, rel:stable)를 가지는 httpd:2.2 버전의 Pod를 2개 운영합니다.

- rs name: rs-mainui

- container: httpd:2.2

- rel: stable은 반드시 포함하며 app: main, app: sub 둘 중 하나라도 포함하고 name: nginx는 포함하지 않도록 matchExpressions를 작성

- 현재 디렉토리에 rs-lab.yaml 파일이 생성되어야 하고, 애플리케이션 동작은 파일을 이용해 실행합니다.

 

2. 동작되는 httpd:2.2 버전의 컨테이너를 3개로 확장하는 명령을 CLI로 적고 실행하세요.

 

 


 

 

1번 답안

# rs-lab.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-mainui
spec:
  replicas: 2
  selector:
    matchLabels:
      rel: stable
    matchExpressions:
    - {key: app, operator: In, values: [main, sub]}
    - {key: name, operator: NotIn, values: [nginx]}
  template:
    metadata:
      labels:
        app: main
        rel: stable
        name: apache
    spec:
      containers:
      - name: apache-pod
        image: httpd:2.2

 

 

2번 답안

# 2번 답안
kubectl scale rs rs-mainui --replicas=3

 

 

 

 


 

 

아래 영상을 참고했습니다.

https://youtube.com/playlist?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&si=hbPclcPuc-6lTNdE

 

[따배쿠] 쿠버네티스 시리즈

 

www.youtube.com

 

'Kubernetes' 카테고리의 다른 글

Kubernetes 기초 - Controller(4)  (0) 2023.12.14
Kubernetes 기초 - Controller(3)  (0) 2023.12.14
Kubernetes 기초 - Controller(1)  (0) 2023.12.11
Kubernetes 기초 - Namespace  (0) 2023.12.11
Kubernetes 기초 - Pod(7)  (0) 2023.12.09