워크로드 리소스는 컨트롤러 - 컨트롤러는 파드의 집합
대부분 컨트롤러를 만들고 해당 컨트롤러가 파드를 만들고 파드가 컨테이너를 만듦
쿠버네티스의 빌트인 워크로드 리소스
- Pod
- Controller
- ReplicationController
- ReplicaSets
- DaemonSets
- Jobs
- CronJobs
- Deployments
- StatefulSets
- HorizontalPodAutoscaler
Deployment 및 ReplicaSet.
Deployment는 Deployment의 모든 Pod가 필요시 교체 또는 상호 교체 가능한 경우, 클러스터의 스테이트리스 앱 워크로드 관리에 적합함.
StatefulSet
어떻게든 스테이트를 추적하는 하나 이상의 파드를 동작하게 함
DaemonSet
노드-로컬 기능을 제공하는 Pods를 정의함
클러스터 운용에 기본적인 것.
Job, CronJob
실행 완료 후 중단 작업을 정의
CronJob은 스케줄 따라 반복, Job는 단 한번
ReplicationController
리소스 정의 방법 확인
rc.spec
- replicas : 생성할 replica의 개수, default는 1
- selector : pod의 label selector
- template : pod template
- minReadySeconds : 새로 생성된 포드가 준비되어야 하는 최소 시간, default는 0
rc.spec.template : RC가 Pod를 만들 때 사용할 정보, Pod Template
Seletor : 컨트롤러가 관리하는 모든 파드에 레이블이 있어야 함.
컨트롤러가 여러 파드 중 관리하는 파드를 선택함.
이때 동일한 컨트롤러가 제어하는 파드는 동일한 레이블이 있어야 함.
ex)
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb-rc
spec:
replicas: 3
selector:
app: web
template:
metadata:
labels:
app: web
env: dev
spec:
containers:
- name: myweb
image: ghcr.io/c1t1d0s7/go-myweb
ports:
- containerPort: 8080
myweb-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb-rc
spec:
replicas: 3
selector:
app: web
# Pod Configure
template:
metadata:
# name: 항상 똑같은 이름의 Pod를 생성할 것이 아니기 때문에 name은 지정하지 않는다
# pod의 name은 controller의 이름 뒤에 랜덤한 값이 붙게된다.
labels:
app: web
spec:
containers:
- name: myweb
image: ghcr.io/c1t1d0s7/go-myweb
ports:
- containerPort: 8080
protocol: TCP
레이블을 바꾸면 관리 대상 파드가 두개가 되어 새것을 하나 더 만듦
또, 변경된 파드는 관리대상이 아니게 됨
NAME READY STATUS RESTARTS AGE IP NODE LABELS
myweb-rc-grmsh 1/1 Running 0 79s 10.233.236.16 cmp-v2-k8s-w-1 app=web
myweb-rc-j255w 1/1 Running 0 79s 10.233.236.17 cmp-v2-k8s-w-1 app=web
myweb-rc-v554c 1/1 Running 0 79s 10.233.236.15 cmp-v2-k8s-w-1 app=web
See 'kubectl label --help' for usage.
root@cmp-v2-k8s-m-1:~# k label pods myweb-rc-grmsh app=beta --overwrite
pod/myweb-rc-grmsh labeled
root@cmp-v2-k8s-m-1:~# k get pods --show-labels -o wide
NAME READY STATUS RESTARTS AGE IP NODE LABELS
myweb-rc-2fvls 1/1 Running 0 4s 10.233.236.18 cmp-v2-k8s-w-1 app=web
myweb-rc-grmsh 1/1 Running 0 4m23s 10.233.236.16 cmp-v2-k8s-w-1 app=beta
myweb-rc-j255w 1/1 Running 0 4m23s 10.233.236.17 cmp-v2-k8s-w-1 app=web
myweb-rc-v554c 1/1 Running 0 4m23s 10.233.236.15 cmp-v2-k8s-w-1 app=web
RC 스케일링
--replicas 옵션을 사용하여 스케일링
k scale rc myweb-rc --replicas=5
yaml 파일 수정의 경우 create 명령으로 생성하게 되면 기존 RC가 존재하기 때문에 오류
replace 명령으로 재배치 해야함.
또는 patch 명령으로 파일 수정 가능
인라인 형태
$ kubectl patch -f myweb-rc.yaml -p '{"spec": {"replicas": 3}}'
json 형
{
"spec":
{"replicas": 2}
}
또는 edit 명령으로 실시간 수정 가능
$ kubectl edit -f myweb-rc.yaml
$ kubectl edit rc myweb-rc
선언형 오브젝트 구성
apply 명령은 없다면 생성하고 있다면 수정함
create 후 replace, patch, edit 과 같은 효과를 가짐
로그 확인
컨트롤러가 아닌 컨트롤러가 관리하는 파드를 지정해 로그를 볼 수 있음
RC 삭제
컨트롤러가 삭제되면 컨트롤러가 관리하는 파드도 삭제됨
--cascade=orphan 옵션으로 파드만 남길 수 있음
RC는 ReplicaSet으로 대체 가능
다른 점은 셀렉터 하위에 필드가 존재함.
MatchLabel은 레이블 확인하는 것으로 동일하지만
MatchExpressions가 추가됨.
필드
key : label key
operator : In, NotIn, Exists --> 집합성 기준
values : value
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myweb-rs
spec:
replicas: 3
selector:
matchLabels:
app: web
env: dev
template:
metadata:
labels:
app: web
env: dev
spec:
containers:
- name: myweb
image: ghcr.io/c1t1d0s7/go-myweb
ports:
- containerPort: 8080
protocol: TCP
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myweb-rs
spec:
replicas: 3
selector:
matchLabels:
app: web
env: dev
template:
metadata:
labels:
app: web
env: dev
spec:
containers:
- name: myweb
image: ghcr.io/c1t1d0s7/go-myweb
ports:
- containerPort: 8080
protocol: TCP
두 rs가 데리고 있는 파드의 레이블이 같은데
정작 선언하고 생성까지 아무 문제가 없음
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: ReplicaSet
name: myweb-rs
uid: f91433f0-69b6-4b06-a7aa-26691b1ddc19
ownerReferences정보가 추가되어 컨트롤러가 관리 영역을 구분할 수 있게 됨.
'Cloud > Kubernates' 카테고리의 다른 글
[k8s, kubernates] 서비스 -1 (0) | 2024.07.15 |
---|---|
[k8s, kubernates]컨트롤러 : 데몬셋 (0) | 2024.07.09 |
[k8s, kubernates] 파드 라이프사이클 (0) | 2024.07.09 |
[k8s, kubernates] 레이블 (0) | 2024.07.09 |
[k8s, kubernates] 네임스페이스 (0) | 2024.07.09 |