Controller는 Pod의 개수를 보장한다.
요구하는 파드의 개수를 보장하며 파드 집합의 실행을 항상 안정적으로 유지하는 것을 목표
→ 요구하는 파드의 개수가 부족하면 template을 이용해 파드를 추가,
→ 요구하는 파드의 수보다 많으면 최근 생성된 파드를 삭제
apiVersion: v1
kind: ReplicationController
metadata:
name: myapp-rc
spec:
replicas: 3
selector:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: nginx-container
image: nginx:1.14
기본구성
ReplicationController는 이 세개만 보는거지
#
kubectl create rc -exam --image=nginx --replicas=3 --selector=app=webui
api는 app=webui 라벨을 가진 파드를 3개 실행하게 된다. controller는 3개가 보장되게 계속 탐지
이렇게 delete pod시키면 알아서 replicaset에 맞춰 파드가 자동 생성되는 것을 볼 수 있다.
kubectl run redis --image=redis --labels=app=my-app --dry-run -o yaml > redis.yaml
같은 라벨을 가진 파드를 실행시킨다면?
실행이 안되고 바로 중지된다. controller에서는 라벨 확인을 하고 terminate시킴
kubectl edit rc my-app
# 위 명령어를 해서 replicas 값을 수정하거나
# 아래 명령어처럼 수정해도 된다
kubectl scale rc my-app --replicas=2
replicationController와 같은 역할을 하는 컨트롤러
replicationController보다 풍부한 Selector
selector:
matchLabels:
key : value
matchExpressions:
{key: , operator: , values: }
matchExpressions 연산자
#selector안에 있는 조건은 AND!
ReplicationController
spec:
replicas: 3
selector:
app: my-app
version: "2.1"
templete:
~~
ReplicaSet
spec:
replicas: 3
selector:
matchLabels:
app: my-app
matchExpressions:
- {key: version, operator: In, value: ["2.1"]}
templete:
~~~
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
kubectl delete rs rs-nginx --cascade=false
—cascade=false가 없으면 해당 rs의 파드도 함께 사라지는데 이 옵션 붙여주면 파드는 삭제 안됨.
replicaset을 제어해주는 부모 역할 → 디플로이먼트가 레플리카셋을 컨트롤하고 레플리카셋은 파드를 컨트롤하는 거
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-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
Rolling update를 위해 만들어 졌다,
Replicaset을 컨트롤해서 pod의 수를 조절한다.
Rolling Update: 파드를 점진적으로 새로운 것으로 업데이트하여 디플로이먼트 업데이트가 서비스 중단없이 이루어지도록 해줌.
kubectl set image deployment [deploy name] [container name]=[new version image]
RollBack
kubectl rollout history deployment [deploy name]
kubectl rollout undo deploy [deploy name]
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deploy
spec:
selector:
matchLabels:
app: webui
replicas: 3
template:
metadata:
labels:
app: webui
spec:
containers:
- image: nginx:1.14
name: web
ports:
- containerPort: 80
kubectl create -f deploy-test.yaml --record
kubectl get deployment,rs,pod,svc
# rolling update
kubectl set image deploy app-deploy web=nginx:1.15 --record
# controlling rolling update
kubectl rollout pause deploy app-deploy
kubectl rollout resume deploy app-deploy
kubectl rollout status deploy app-deploy
# rollback
kubectl rollout history deployment app-deploy # 이전 업데이트 기록을 볼 수 있어 그래서 record 옵션을 꼭 쓰는것!
kubectl rollout undo deployment app-deploy # 그 이전 버전으로 rollback
kubectl rollout undo deployment app-deploy --to-revision=[돌아가고 싶은 revison 번호로]
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx
annotations:
kubernetes.io/change-cause: version 1.15
spec:
progressDeadlineSeconds: 600
revisionHistoryLimit: 10
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
replicas: 3
selector:
matchLabels:
app: webui
template:
metadata:
labels:
app: webui
spec:
containers:
- name: web
image: nginx:1.15
ports:
- containerPort: 80
maxSurge를 통해서 업데이트를 얼마나 빨리 할지 커스텀할 수 있다.
maxsurge가 25%인것은 replicas*0.25 의 값에서 반올림한 값
예를들어 replicas가 3이고 maxsurge가 50%인것은
3 * 0.5 = 1.75 → 2 ⇒ 3+2개의 파드
업데이트 할때 5개까지 러닝중인것을 유지하는거지!
maxUnavailable : terminating하는 파드의 개수를 조절하는 것.
annotation → yaml파일로 업데이트 시키는 방법
kubectl create -f [yaml파일]
vi -> annotations 버전 변경
kubectl apply -f [yaml파일]
노드당 하나의 파드를 보장해준다,
로그 수입기, 모니터링 에이전트와 같은 프로그램 실행시 적용한다.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-nginx
spec:
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
하나만 보장하니깐 replicas는 필요가 없다~
kubeadm token list
kubeadm token create --tth[시간]
토큰은 일정 시간이 지나면 삭제 되서 생성해줘야함
그럼 새로운 워커 노드에 토큰만 바꿔서 join하면됨.
마스터 노드에서 daemon set을 설정하면 마스터노드에 연결된 모든 워커노드에 deamonset 파드가 하나씩 생기는데 위 코드처럼 추가하면 추가한 노드에도 하나의 파드를 보장해준다.
daemonset도 edit하면 rolling update가 된다. rollback도 마찬가지
파드의 상태를 유지해주는 컨트롤러
파드의 이름과 볼륨(저장소)을 유지해준다.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sf-nginx
spec:
replicas: 3
serviceName: sf-service
# podManagementPolicy: OrderedReady 순차적으로 만듦
podManagementPolicy: Parallel
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
kubectl scale statefulset sf-nginx --replicas=
scale up하면 다음 번호가 생성 down하면 그 마지막 번호가 삭제됨
쿠버네티스는 파드를 running중인 상태로 유지
batch 처리하는 파드는 작업이 완료되면 종료됨
batch 처리에 적합한 컨트롤러로 파드의 성공적인 완료를 보장
→ 비정상 종료 시 다시 실행하고 정상종료되면 완료시킨다.
apiVersion: batch/v1
kind: Job
metadata:
name: centos-job
spec:
# completions: 5
# parallelism: 2
activeDeadlineSeconds: 5
template:
spec:
containers:
- name: centos-container
image: centos:7
command: ["bash"]
args:
- "-c"
- "echo 'Hello World'; sleep 25; echo 'Bye'"
restartPolicy: Never
# restartPolicy: OnFailure
# backoffLimit: 3
# centos 이미지를 실행하고 실행된 파드 내에서 sleep 5 커멘드 실
kubectl run testpod --image=centos:7 --command sleep 5
사용자가 원하는 시간에 job을 실행하게 해주는 예약기능
job 컨트롤러로 실행할 application pod를 주기적으로 반복해서 실행
Linux의 cronjob의 스케줄링 기능을 job controller에 추가한 API
data backup, send email, cleacing task 같이 반복적으로 실행하는 job을 운영할 때 사용
cronjob schedule
ex) 0 3 1 * * → 매월 1일 새벽 3시에 job을 실행하라!
/5 * * * → 5분에 1번씩 job을 실행하라!
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-exam
spec:
schedule: "* * * * *"
startingDeadlineSeconds: 500
# concurrencyPolicy: Allow
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- echo Hello; sleep 10; echo Bye
restartPolicy: Never