0.Controller(컨트롤러)
컨트롤러는 다양한 파드들을 관리하는 Auto Healing, Software Update, Auto Scaling, Job 4가지역할을 맡는다.
쿠버네티스는 클러스터 구조여서 단일 노드와 파드만 사용하는 경우는 흔하지않기 때문에, 장애 없는 서비스를 유지하기 위해컨트롤러는 중요하다. 다양한 목적에 맞게 파드를 사용 할 수 있는 컨트롤러가 존재한다는 것이 쿠버네티스의 장점이기도 하다.
- 오랜 시간동안 실행되어야하는 파드 관리 : 레플리카셋 + 디플로이먼트
- 클러스터의 전체 노드에 같은 파드 실행 : 데몬세트
- statefull한 앱의 파드를 관리 : 스테이트풀셋
- 1회성 작업 및 주기적인 배치 작업 실행할 때 사용 : 크론잡
1. Replication Controller(rc) / ReplicaSet (rs)
Replication Controller Definition File
ReplicaSet을 구성하는 Deployment가 현재 권장하는 레플리케이션 설정 방법이다.
apiVersion: v1
kind: ReplicationController
metadata:
name: myapp-rc
labels:
app: myapp
type: front-end
spec:
template:
metadata:
name: myapp-pod
labels:
app: myapp
type: front-end
spec:
containers:
- name: nginx-container
image: nginx
replicas: 3
ReplicaSet Definition File
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-replicaset
labels:
app: myapp
type: front-end
spec: #.spec에 필드에 자세한 명세 설정
template: #.spec.template 레플리카세트가 어떤 파드를 실행할지 명시함
metadata: #그래서 하위에 .metadata.spec존재
name: myapp-pod #파드 이름
labels:
app: myapp #오브젝트를 식별하는 레이블이 앱 컨테이너고 myapp이라 지칭.
type: front-end
spec:
containers: #.spec.templete.spec.containers[] 필드는 하위에
- name: nginx-container #컨테이너 이름
image: nginx #컨테이너 이미지
port:
- containerPort: 80 #컨테이너에 접속할 포트 번호
replicas: 3 #.spec.replica는 파드 몇개 유지할건지 (설정안하면 기본값 :1)
selector: #.spec.selector 어떤 레이블(.labels의 파드를 선택해서 관리할지 설정)
matchLabels:
app: myapp # 레이블 기준으로 파드 관리함->
# .spec.template.metadata.labels 하위 필드 설정과 .spec.selector.meathLabels 하위 피드 설정이 같아야함
type: front-end #
질문
레이블 기준으로 파드를 관리하게 되는데 , 아래처럼 .spec.selector.matchLabels 하위 피드 설정에 label이 없어도 동작하나?
-> 템플릿에 별도의 .spec.selector 설정이 없으면 .spec.template.metadata.labels.app에 있는 내용을 기본값으로 설정한다는데 그 이유 때문인건가?
- matchLabels는 OR연산이기 때문에 type또는 app하나만 적어도 된다.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-replicaset
labels:
app: myapp
type: front-end
spec:
template:
metadata:
name: myapp-pod
labels:
app: myapp
type: front-end
spec:
containers:
- name: nginx-container
image: nginx
replicas: 3
selector:
matchLabels:
type: front-end
- DESIRED : 레플리카세트 설정에 지정한 파드 개수
- CURRENT : 레플리카 세트를 이용해 현재 클러스터에서 동작하는 실제 파드 개수
레플리카셋에서 파드를 분리 시키면 기존 관리하던 개수에 맞춰 새로운 파드가 생성되는 예시
#상위 레플리카세트 설정에 따르면, 레플리카셋이 관리하는 파드는 3개
#vi가 실행되면서 현재 실행 중인 파드 정보 수정가능
alias k=kubectl; k edit pod [레플리카셋이 관리하는 pod명]
#.metadata.labels.app 필드를 수정함 myapp-replicaset-> myapp-other
apiVersion: v1
kind: Pod
metadata:
generateName: myapp-replicaset
labels:
app: myapp-other
name: 레플리카셋이 관리하는 pod명
namespace: default
# 저장 후 종료한 뒤, 이후 k get pods를 실행하면 파드가 4개가 된것을 볼 수 있다.
# 그 이유는 기존 레플리카가 관리하는 파드가 3개이기 때문에 1개가 새로 생성된 것
# 각 파드의 .metadata.labels.app 필드 설정 확인
k get pods -o=jsonpath="{range .items[*]}{.metadata.name}{'\t'}{.metadata.labels|{'\n\}{end}"
#이후 필드 설정 확인해보면 이전에 수정한 파드는 레플리카셋에서 분리되었음을 확인할 수 있다.
2. ETC
질문
레플리카 셋과 파드를 지웠음에도 파드가 살아있는 이유는 뭐지??. .
>> k delete replicaset 컨테이너명 [레플리카만 삭제 옵션: --cascade=orphan]
No resources found in default namespace. 라고 뜨는데 pods가 4개가 정답이었다. 그 이유는 레플리카셋이 파드를 재생성하기 때문이라는데 애초에 레플리카셋을 다 지웠는데 왜 재생성됐고 왜 안보이지?.. 궁금..
No resources found in default namespace.
-> 이렇게해도 된다.
kubectl scale deployment/nginx-deployment --replicas=0
선언적: yaml파일 설정 집어넣기 (이거대로 되는것)
비선언적: K get deploy 디플로이먼트이름 -o=jsonpath="{spec.template.spec.containers[0].image}{'\n'}"
kodeKloud
To Create the replicaset
$ kubectl create -f replicaset-definition.yaml
To list all the replicaset
$ kubectl get replicaset
To list pods that are launch by the replicaset
$ kubectl get pods
$ kubectl delete replicaset myapp-replicaset
## 첫번째 방법 - yml 파일에서 replicas : 6으로 직접 변경 후 업데이트 하기
$ kubectl replace -f replicaset-definition.yaml
## 두번째 방법 - 파일 수정 없이 업데이트
$ kubectl scale --replicas=6 -f replicaset-definition.yaml
$ kubectl scale --replicas=6 [type:replicaset] [name:myapp-replicaset]
참고
1. https://github.com/kodekloudhub/certified-kubernetes-administrator-course
'STUDY > Data Engineering' 카테고리의 다른 글
6. CKA udemy 강의 정리 - Section 2 [Services & kodekloud] (0) | 2023.01.05 |
---|---|
5. CKA udemy 강의 정리 - Section 2 [Deployment & kodekloud] (0) | 2023.01.05 |
3. CKA udemy 강의 정리 - Section 2 [kodekloud PODs] (0) | 2023.01.04 |
2. CKA udemy 강의 정리 - Section 2 [k8s 컴포넌트] (0) | 2023.01.04 |
1. CKA udemy 강의 정리 - Section 2 [k8s란?] (1) | 2023.01.02 |