ReplicaSet(ReplicationController와의 차이점은?) 쿠버네티스 pod 개수 보장
ReplicaSet이란?
- ReplicationController와 같은 역할을 하는 컨트롤러
- ReplicationController보다 풍부한 selector ( matchExpressIons 사용 )
selector:
matchLabels:
component: redis
matchExpressIons:
- {key: tier, operator: In, Values: [cache]}
- {key: environment, operator: NotIn, values: [dev]}
- matchLabels
- key: value
- matchExpressIons 연산자
- In : key와 values를 지정하여 key, value가 일치하는 pod만 연결
- NotIn : key는 일치하고 value는 일치하지 않는 pod에 연결
- Exists : key에 맞는 label의 pod를 연결
- DoesNotExist : key와 다른 label의 Pod를 연결
ReplicationController와 ReplicaSet
ReplicationController | ReplicaSet |
spec: replicas: 3 selector: app: webui version: "2.1 |
spec: replicas: 3 selector: matchLabels: app: webui matchExpressions: - {key: version, operator: In, Values: ["2.1","2.2"]} |
- ReplicationController : app: webui이고 version이 2.1인 pod를 3개 운영해줘, pod가 없다면 pod 템플릿을 통해 생성
- ReplicaSet : app: webui이고 version 안에 값이 2.1인 pod를 3개 운영해줘, 여기까지면 똑같다.
- Value에 2.2를 추가해보자, 이러면 버전이 2.1이거나 2.2인 pod를 3개 운영해줘가 된다.
- 이것이 matchExpressIons를 쓰는 이유이다
- In을 NotIn으로 넣었다면 버전이2.1이나 2.2가 아닌 pod를 3개 운영
- Exists를 넣는다면 뒤에 value 없이 oprator: Exists까지만 넣으면 된다. (버전이 존재하기만 하면 됨)
- DoesNotExist를 넣는다면 버전이 존재하지만 않으면 된다.
ReplicaSet Definition
ReplicationController | ReplicaSet |
apiVersion: v1 kind: ReplicationController metadata: name: rc-nginx spec: replicas: 3 selector: app: webui template: metadata: name: nginx-pod labels: app: webui spec: containers: - name: nginx-container image: nginx:1.14 |
apiVersion: apps/v1 kind: ReplicaSet metadata: name: rc-nginx spec: replicas: 3 selector: matchLabels: app: webui template: metadata: name: nginx-pod labels: app: webui spec: containers: - name: nginx-container image: nginx:1.14 |
- apiVersion, kind, Selector 차이 확인
ReplicaSet example
$cat rs-nginx.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx
spec:
replicas: 3
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
- webui인 pod를 3개 유지, pod가 없다며 밑에 템플릿을 보고 pod 생성
TEST
- example yaml로 테스트를 진행
$cat rc-nginx.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: rc-nginx
spec:
replicas: 3
selector:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
- ReplicationController로 label이 webui인 pod를 3개 유지하도록 설정
QUESTION
- 다음의 조건으로 ReplicaSet을 사용하는 rc-lab.yaml 파일을 생성하고 동작시킵니다.
- labels ( name: apache, app: main, rel: stable )를 가지는 httpd:2.2버전의 pod를 2개 운영합니다.
- rs name: rs-mainui
- container: httpd:2.2
- 현재 디렉토리에 rs-lab.yaml 파일이 생성되어야 하고, 애플리케이션 동작은 파일을 이용해 실행합니다.
- 동작되는 httpd:2.2버전의 컨테이너를 1개로 축소하는 명령을 적고 실행하세요.
- CLI #
ANSWER
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-mainui
spec:
replicas: 2
selector:
matchLabels:
app: main
matchExpressions:
- {key: version, operator: In, values: ["2.2"]}
- {key: rel, operator: In, values: ["stable"]}
template:
metadata:
name: apache
labels:
app: main
version: "2.2"
rel: stable
spec:
containers:
- name: httpd
image: httpd:2.2
- 따배쿠 강좌 영상에 답은 안나왔길래 정확한 답은 모르겠다.
- labels ( name: apache, app: main, rel: stable )를 가지는 httpd:2.2버전의 pod를 2개 운영해야 한다고 나와있어서 일단 app: main이며 version이 2.2, rel가 stable인 것으로 조건을 걸었다.
- kubectl scale rs rs-mainui --replicas=3
- scale을 통해 replicas를 3개로 조정