1. Cotroller
- K8s에서 ReplicationController(RC), ReplicaSet(RS), DaemonSet, Jon, StatuefulSet, Deployment 등이 콘트롤러가 있다
2. ReplicationContoller
- Label을 기준으로 Replicas에 설정값만큼 구동되는 Pod의 개수를 보장
- 구동중인 Pod가 죽으면 Replias의 개수가 맞게 Auto Deploy하여 개수 유지
- Equality Based Label
* Container의 Image가 다르더라도 selector가 일치하는 Pod가 이미 구동중이라면, 새로 Deploy되지 않음.
replication.yaml docs/concepts/workloads/controllers
apiVersion: v1
kind: ReplicationController
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort:30
3. ReplicaSet
- ReplicationContoller의 새버전으로 기능은 동일하나 Set based Label 사용한다
4. Deployment
- ReplicaSet을 만들고 관리
* 실제 운용 환경에서는 ReplicaSet과 Pod를 직접 배포하는 것은 특수한 케이스이다.
일반적으로 Deployment를 통하여 배포한다.
* Histroy 기능으로 기존에 배포된 형상을 가지고 있어 Roll-back이 용이
kind: Deployment
apiVersion: v1beta1
metadata:
name: frontend
spec:
replicas: 4
selector:
role: web
template:
metadata:
name: web
labels:
role: web
spec:
containers:
- name: my-app
image: my-app
- name: nginx-ssl
image: nginx
ports:
- containerPort: 80
- containerPort: 443
- Deploy Strategies
1) Supported Strategy
- Rolling update : 구버전의 Pod를 하나씩 내리고 새버전의 Pod를 배포
* On-premise에서 H/W 자원에 제약 사항이 있을때 좋다
kubectl rollout undo deployment [ deployment_name ] --to-revision=[version to raollback]
* history 기능으로 쉽게 Rollback이 가능
1) Unupported Strategy
- Blue&Green : 새버전의 Pod를 배포하고 구버전의 Pod가 구동중이면 내린다.
* Resource가 순간적으로 2배가 필요
* Deploy를 할때, selector의 version을 변경해서 새버전으로 라우팅을 변경한다.
- Canary deployment : 일부 Node만 새버전으로 Deloy한 뒤 Traffic을 수용
5. DaemonSet
- Pod가 각 노드에서 하나씩 구동되게 하는 형태로 관리하는 콘트롤러
- 주로 모니터링, 로그수집 등의 용도로 사용
- selector를 통해 특정 Node에만 배포되도록 설정 가능
ex) GPU가 설치된 노드에만 DaemonSet을 구동하여 모니터링
### daemonset.yaml
apiVersion: v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
sepc:
selector:
matchLabels:
name: fluentd-elasticsearch
affinity:
nodeAffinity:
requireDuringSchedulingIgnoreDuringExecetuon:
nodeSelectorTerms:
- matchExpressions:
- key: aliyun.accelerator/nvidia_name
operator: DoesNotExist
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
...
5. Job
- 배치나 일회성 형태의 워크로드 모델을 지원하는 콘트롤러
- Job에 의해 관리되는 Pod는 Job이 종료되면 Pod도 같이 종료
- Crash 등 비정상 상황 발생 시 작업 종료 또는 재시작 가능
* 작업이 처음부터 다시 시작되는 것으로 Resume이 아닌 Restart이다
* 프로세스의 exit 코드를 기준으로 작업 실패시 조치 가능
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
- 작업 방식에 Parallel run과 Sequential run 두 가지 방법이 있다.
- CronJob을 통해 자동화하여 주기적으로 Job 실행이 가능
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "0 5 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the K8s Cluster
restartPolicy: OnFailure
6. Reference
Kubernetes Advanced Workshop
'System Engineering > Kubernetes' 카테고리의 다른 글
6. K8s Volume (0) | 2021.04.05 |
---|---|
5. K8s Lifecycle / Configmap (0) | 2021.04.02 |
4. K8s Service / Ingress (0) | 2021.03.30 |
2. Kubernetes Architecture (1) | 2021.02.23 |
1. 가상화와 Container의 차이 (0) | 2021.02.20 |