쿠버네티스의 Controller는 Service를 관리하는데 큰 도움을 준다.
(Auto Healing, Software Update, Auto Scaling, Job)
Node 위에 Pod가 있는데 이 Pod가 갑자기 다운되던가 이 Pod가 스케쥴링 되어있는 Node가 다운이 되면 Controller가 이를 즉각적으로 파악한 후 Pod를 다른 Node에 새로 만들어준다.
Pod의 Resource가 Limit 상태가 되었을 때 Controller는 이를 파악한 후 Pod를 새로 하나 만들어 줌으로써 부하를 분산시키고 Pod가 죽지 않게 해준다.
따라서 Pod는 부하 없이 안정적으로 운영할 수 있다.
여러 Pod에 대한 Version을 Upgrade 해야 할 경우 Controller를 통해서 한번에 쉽게 할 수 있고 Upgrade 도중에 문제가 생기면 Rollback을 할 수 있게 도와준다.
일시적인 작업을 해야 할 경우 Controller가 필요한 순간에만 Pod를 만들어서 해당 작업을 수행하고 삭제한다.
Controller와 Pod는 Service와 Pod처럼 Label과 Selector로 연결된다.
Controller를 만들 때 Template으로 Pod의 내용을 넣는데 Controller는 Pod가 죽을 때 재성성 시키기 때문에 Pod가 다운되면 template의 내용을 바탕으로 Pod를 새로 만들어준다.
이러한 특성을 사용해서 App에 대한 Upgrade를 할 수 있는데 Template에 버전이 Update된 Pod의 내용을 넣고 기존의 연결되어 있는 Pod를 다운시키면 Controller는 Template를 가지고 Pod를 재생성 하기 때문에 버전이 Upgrade된 Pod가 재생성된다.
apiVersion: v1
kind: Pod
metadata:
name: pod-1
labels:
type: web
spec:
containers:
- name: container
image: nginx:1.14
apiVersion: v1
kind: ReplicationController
metadata:
name: replication-1
spec:
replicas: 1
selector:
type: web
template:
metadata:
name: pod-1
labels:
type: web
spec:
containers:
- name: container
image: nginx:1.14
ports:
- containterPort: 8080
Pod에 Label이 달려있고 ReplicationController에 Selector를 통해 Pod와 연결할 수 있고 template으로 Pod의 내용을 넣는다.
그리고 template안에도 Label을 넣어야 Pod를 새로 만들 때 Controller와 연결할 수 있다.
Replicas의 개수만큼 Pod가 관리된다.
따라서 Replicas의 수가 1이였다가 3으로 증가하면 Pod의 개수도 1개에서 3개로 늘어난다. (Scale Out)
또한 Pod가 삭제되어도 Replicas의 숫자만큼 Controller에서 다시 재생성해준다.
즉 Pod의 개수를 보장해준다.
Selector는 ReplicaSet에만 있는 기능이다.
ReplicaSet에는 Selector에 matchLabels와 matchExpressions 라는 2가지의 기능이 추가되었다.
matchLabels: key와 value가 모두 같아야 연결해준다. (기존의 기능과 동일)
matchExpressions: key와 value를 detail하게 control 할 수 있다.
ex) key: ver, oprator: Exists
--> key가 ver인 모든 Pod들
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replica-1
spec:
replicas: 3
selector:
matchLabels:
type: web
matchExpressions:
- {key: ver, operator: Exists}
template:
matadata:
name: pod
...
matchLabels에는 key와 value가 matchExpressions에는 key와 value에 대한 디테일 설정이 들어가 있다.
Exists : Key를 정하고 그에 맞는 Key의 값을 가지고 있는 Pod들을 연결
DoesNotExist: Key를 정하고 그 key를 가지고 있지 않는 Pod들을 연결
In : Key와 Values를 지정하고 Key에 해당하는 Values중 하나라도 만족하는 Pod들을 연결
NotIn : Key와 Values를 지정하고 Key에 해당하는 Values 모두를 만족하지 않는 Pod들을 연결