나그네소

kubernetes controller Replicatoin 1탄 본문

Cloud/Kubernetes

kubernetes controller Replicatoin 1탄

나그네소티 2022. 11. 18. 15:44

1. Replication Controller란

POD 개수를 보장 한다.

step1. 쿠버야 낭 nginx 서버 3개 실행해줘.
step2.  api는etcd에서 정보를 확인한후 scheuler에게 요청을 한다.
step3.scheduler는 어느 노드에다 생성을 할지 확인을 한후 어디에다 하면되하고 Api에게 전달을 한다.
step4. API는 응답을 받고 해당 controller에게 nginx 3개를 니가 보장해라 하고 전달 한다.
step5. scheduler에게 응답닫은 노드에 각각 nginx 3개의 pod를 생성하게 된다.
step6. 혹시 하나라도 문제가 생기면 controller의 역할은 보장을 해주는 역할이니까 controller에서 문제가
           생긴 pod 하나를 다시 만든다.

 

2. replication controller

 

  • 요구하는 pod의 개수를 보장하면 파드집합의 실행을 항상 안정적으로 유지 하는 것을 목표
    • 요구하는 pod의 개수가 부족하면 template를 이용해 pod를 추가
    • 요구 하는 pod 수보다 많으면 최근에 생성된 pod를 삭제
  • replication controller 기본 구성.
    • selector
    • replicas
    • template
apiVersion:v1
kine: ReplicationController
metadata:
   name: <RC_이름>
spec:
  replicas: < 배포 갯수 >
  selector:
    key:value
  template:
 <컨테이너 템플릿>
 
selector : 쿠버테이스야 이런키 이런 value를 replica 개수많큼 몇개 운영해줘.
template : pod 템플릿

: selector의 key:value를 보고 해당 replicas 개수만큼 생성해준다.

 
2-1) replicationController 동작원리 
 
쿠버야 nginx 웹 서버 3개 실행해줘.
kuberctl create rc-exam --image=nginx --replicas=3 --selector=app=webui

: 위와 같이 실행 요청을 하게 되면 controller에서 라벨 app:webui로 pod를 3개 실행 한다. 
 
[Replication Controller Definition]
Pod-definition(일반 POD)
replication contorller definition
 
 
 
 
 
 
 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: webui
spec:
  containers:
  - name: nginx-container
     image: nginx:1.14
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
  • 컨트로러는 selector를 보고 개수만큼 보장하려고 한다.
  • app:webui 라벨를 보고 template의 pod를 replica 개수만큼 보장하고 없으면 만들어줘.
    (템플릿에는 pod를 생성하는 것이 들어가 있다.)
  • 반드시 selector에 있는 라벨이(key:value) 템플릿의 labels에 포함되어야 한다.  (중요)

 

3. replication example 

rc-nginx.yaml
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

 

3-1) POD 확인

kuber-master:/home/son_kube/tmp] k get rc
NAME       DESIRED   CURRENT   READY   AGE
rc-nginx   3         3         3       8s

kuber-master:/home/son_kube/tmp] k get rc -o wide
NAME       DESIRED   CURRENT   READY   AGE   CONTAINERS        IMAGES       SELECTOR
rc-nginx   3         3         3       14s   nginx-container   nginx:1.14   app=webui

kuber-master:/home/son_kube] k get pods -o wide --watch
NAME             READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
rc-nginx-62crw   0/1     Pending   0          0s    <none>   <none>   <none>           <none>
rc-nginx-62crw   0/1     Pending   0          0s    <none>   kuber-node1   <none>           <none>
rc-nginx-rgvsd   0/1     Pending   0          0s    <none>   <none>        <none>           <none>
rc-nginx-8jj8v   0/1     Pending   0          0s    <none>   <none>        <none>           <none>
rc-nginx-rgvsd   0/1     Pending   0          0s    <none>   kuber-node2   <none>           <none>
rc-nginx-8jj8v   0/1     Pending   0          0s    <none>   kuber-node1   <none>           <none>
rc-nginx-62crw   0/1     ContainerCreating   0          0s    <none>   kuber-node1   <none>           <none>
rc-nginx-rgvsd   0/1     ContainerCreating   0          0s    <none>   kuber-node2   <none>           <none>
rc-nginx-8jj8v   0/1     ContainerCreating   0          0s    <none>   kuber-node1   <none>           <none>
rc-nginx-rgvsd   1/1     Running             0          1s    10.244.2.53   kuber-node2   <none>           <none>
rc-nginx-62crw   1/1     Running             0          1s    10.244.1.241   kuber-node1   <none>           <none>
rc-nginx-8jj8v   1/1     Running             0          1s    10.244.1.242   kuber-node1   <none>           <none>

kuber-master:/home/son_kube/tmp] k describe rc rc-nginx
Name:         rc-nginx
Namespace:    default
Selector:     app=webui
Labels:       app=webui
Annotations:  <none>
Replicas:     3 current / 3 desired
Pods Status:  3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=webui
  Containers:
   nginx-container:
    Image:        nginx:1.14
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                    Message
  ----    ------            ----  ----                    -------
  Normal  SuccessfulCreate  67s   replication-controller  Created pod: rc-nginx-62crw
  Normal  SuccessfulCreate  67s   replication-controller  Created pod: rc-nginx-8jj8v
  Normal  SuccessfulCreate  67s   replication-controller  Created pod: rc-nginx-rgvsd

 

4. Replication Controller Test

kuber-master:/home/son_kube/tmp] k run redis --image=redis --dry-run
// --dry-run pod 생성 하지 않고 정상 적인 명령어 인지 체크 

kuber-master:/home/son_kube/tmp] k run redis --image=redis --labels=app=webui --dry-run
kuber-master:/home/son_kube/tmp] k run redis --image=redis --labels=app=webui --dry-run -o yaml > redis.yaml
// pod 생성 구문을 yaml으로 저장한다.

kuber-master:/home/son_kube/tmp] k get pod --show-labels //현재 상태
NAME             READY   STATUS    RESTARTS   AGE     LABELS
rc-nginx-62crw   1/1     Running   0          8m36s   app=webui
rc-nginx-8jj8v   1/1     Running   0          8m36s   app=webui
rc-nginx-rgvsd   1/1     Running   0          8m36s   app=webui
kuber-master:/home/son_kube/tmp] k apply -f redis.yaml
pod/redis created

kuber-master:/home/son_kube] k get pods -o wide --watch
NAME             READY   STATUS        RESTARTS   AGE   IP             NODE          NOMINATED NODE   READINESS GATES
rc-nginx-62crw   1/1     Running       0          11m   10.244.1.241   kuber-node1   <none>           <none>
rc-nginx-8jj8v   1/1     Running       0          11m   10.244.1.242   kuber-node1   <none>           <none>
rc-nginx-rgvsd   1/1     Running       0          11m   10.244.2.53    kuber-node2   <none>           <none>
redis            0/1     Terminating   0          4s    <none>         kuber-node2   <none>           <none>
redis            1/1     Terminating   0          9s    10.244.2.54    kuber-node2   <none>           <none>
redis            0/1     Terminating   0          10s   10.244.2.54    kuber-node2   <none>           <none>
redis            0/1     Terminating   0          10s   10.244.2.54    kuber-node2   <none>           <none>
redis            0/1     Terminating   0          10s   10.244.2.54    kuber-node2   <none>           <none>

: controller는 app:webui 라벨을 3개만 유지시키고 있기에 새로 redis.yaml에서 app:webui 라벨로 pod을 생성 하려고 
할 때 Terminating   되는 것을 알 수 있다.

 

 

4-1) Replication Edit

kuber-master:/home/son_kube/tmp] k edit rc rc-nginx
replicas: 3->4
: 위의 값을 변경하여 pod를 변경 할 수 있다.(또는 축소 할 수도 있다.)
* command
kubectl scale rc rc-nginx --replicas=2
example)
kuber-master:/home/son_kube/tmp] k get rc
NAME       DESIRED   CURRENT   READY   AGE
rc-nginx   4         4         4       14m
kuber-master:/home/son_kube/tmp] kubectl scale rc rc-nginx --replicas=2
replicationcontroller/rc-nginx scaled
kuber-master:/home/son_kube/tmp] k get rc
NAME       DESIRED   CURRENT   READY   AGE
rc-nginx   2         2         2       15m