진취적 삶
07 쿠버네티스 컨트롤러 본문
7.1 컨트롤러란?
컨트롤러는 k8s의 리소스를 지속적으로 바라보며 리소스의 생명주기에 따라 미리 정해진 작업을 수행하는 주체를 말한다.
현재 상태와 바라는 상태에 대해서 알아야 한다.
k8s 는 control loop 라는 루프를 지속적으로 돌면서 특정 리소스에 대해 관찰한다.
control loop 를 통해 현재 상태가 바라는 상태와 동일해지도록 정해진 작업을 수행한다.
7.2 ReplicaSet
Pod를 복제한다.
가용성을 높이는 역할을 담당한다.
apiVersions: apps/v1
kind: ReplicaSet
metadata:
name: myreplicaset
spec:
replicas: 2
selector:
matchLabels:
run: nginx-rs
template:
metadata:
labels:
run: nginx-rs
spec:
containers:
- name: nginx
image: nginx
- relicas 복제할 Pod 개수 정의
- selector - matchLabels: 라벨링 시스템을 이용하여 복제 개수을 유지할 Pod 선택
- template : 복제할 Pod 정의
sudo kubectl get replicaset (rs)
sudo kubectl scale rs --replicas 4 myreplicaset
//복제본 개수 확장
7.3 Deployment
애플리케이션 업데이트 및 배포에 특화된 기능이 있다.
- 롤링 업데이트를 지원하고 롤링 업데이트 되는 Pod의 비율을 조절
- 업데이트 히스토리를 저장하고 다시 롤백할수 있는 기능을 제공
- ReplicaSet 과 마찬가지로 Pod 의 개수를 늘릴수 있다.
- 배포 상태를 확인할수 있다.
# mydeploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mydeploy
spec:
replicas: 10
selector:
matchLabels:
run: nginx
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
template:
metadata:
labels:
run: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
- replicas : 유지할 Pod 개수 정의
- selector.matchLabels: ReplicaSet 과 마찬가지로 라벨링 시스템
- strategy.type: 배포전략 종류
- RollingUpdate → 점진적 업데이트
- Recreate → 전체 Pod 삭제되고 새로운 Pod 새성
- maxUnvailable: 최대 중단 개수 ex 25 % 10개에서 4개가 중단 가능
- maxSurge: 최대 초과 개수 ex 25% 10개면 4개가 초과 가능
- template: 복제할 Pod를 정의한다.
sudo kubectl apply --record -f mydeploy.yaml
sudo kubectl get deployment
- Deployment :배포 담당
- ReplicaSet : 복제 담당
- Pod: 컨테이너 실행 담당
배포 상태 확인
sudo kubectl rollout status deployment mydeploy
Deployment 리소스의 롤링 업데이트 기능과 Service 리소스의 안정된 서비스 끝점을 통해 중단 없이 애플리케이션을 배포할수 있다.
- —record 옵션은 rollout history 에서 실제 사용한 명령을 기록하기 위해서
- rollout undo 명령어 통해서 이전 배포 상태로 롤백할수 있다.
롤백
sudo kubectl rollout undo deployment mydeploy
7.3.1 k8s 리소스 컨셉
k8s 는 작은 기능을 수행하는 다양한 리소스들을 조합할수 있다.
- 컨테이너 실행 Pod
- 네트워킹 책임 Service
- 복제를 담당하는 ReplicaSet
- 배포를 관리하는 Deployment
7.4 StatefulSet
복제된 Pod가 완벽히 동일하지 않고 순서에 따라 고유의 역할을 가진다.
프로세스간 서로 치환될 수 없는 클러스터를 구축할 때 많이 사용한다.
statefulSet 에서는 각 Pod의 순서와 교유성을 보장한다.
고유의 데이터를 보관해야 하는 애플리케이션에서 많이 사용된다.
- 고유의 Pod 식별자가 필요한 경우
- 명시적으로 Pod 마다 저장소가 지정되어야 하는 경우
- Pod 끼리의 순서에 민감한 애플리케이션
- 애플리케이션이 순서대로 업데이트 되어야 하는 경우
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysts
spec:
serviceName: mysts
replicas: 3
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: nginx-vol
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: nginx-vol
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
name: mysts
spec:
clusterIP: None
ports:
- port: 8080
protocol: TCP
targetPort: 80
selector:
run: nginx
sudo kubectl get statefulset
StatefulSet 리소스는 각 Pod끼리 완전히 다른 컨테이너를 사용하는 것은 아니지만 완벽히 일치하는 동작을 수행하는 것이 아니라 ,Pod의 순서에 따라 다른 역할을 맡거나 Pod 생성 순서를 보장받아야 할때 사용하는 리소스
7.5 DaemonSet
모든 노드에 동일한 Pod를 실행 시키고자 할때 사용하는 리소스
모든 노드에 동일한 Pod가 위치하면서 노드에 관한 정보를 추출할때 많이 사용한다.
# fluentd.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
spec:
selector:
matchLabels:
name: fluentd
template:
metadata:
labels:
name: fluentd
spec:
containers:
- name: fluentd
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
volumeMounts:
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- selector.matchLabels: 라벨링 시스템을 이용하여 노드에서 노드 실행될 Pod를 선택
- template : 모든 노드에서 생성될 Pod를 정의
sudo kubectl get daemonset
DaemonSet 의 장점으로 클러스터에 노드를 새롭게 추가시 따로 작업을 수행하지 않더라도 신규로 편입된 노드에 자동으로 필요한 Pod들이 생성된다.
7.6 JOB & CronJob
7.6.1 Job
일반 Pod처럼 항상 실행되고 있는 서비스 프로세스가 아닌 한번 실행하고 완료가 되는 일괄처리 프로세스용으로 만들어 졌다.
- train.py : 기계학습 스크립트
- Dockerfile: 기계학습 스크립트를 도커 이미지로 변환
- job.yaml : job 실행을 위한 리소스 정의서
# job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
template:
spec:
containers:
- name: ml
image: $USERNAME/train
args: ['3', 'softmax', '0.5']
restartPolicy: Never
backoffLimit: 2
7.6.2 CronJob
Job 리소스와 유사하지만 주기적으로 Job을 실행할수 있도록 확장된 리소스
특정 주기마다 반복해서 실행하고자 할때 활용할수 있는 리소스
7.7 마치며
- 작은 컨테이너를 모아 Pod를 만들고
- Deployment 와 Service로 엮어서 작은 컴포넌트를 만들고
- 하나의 거대한 애플리케이션을 만들수 있다.
'개발 도서 > 핵심만 콕 쿠버네티스' 카테고리의 다른 글
09 ingress 리소스 (0) | 2023.11.17 |
---|---|
08 helm 패키지 매니저 (0) | 2023.11.17 |
06 쿠버네티스 네트워킹 (0) | 2023.11.17 |
05 Pod (0) | 2023.11.17 |
04 쿠버네티스 첫 만남 (0) | 2023.11.17 |