🧭 Kubernetes | January 18, 2021
Controller의 주 역할은 Pod 을 생성, 관리하는 것이다.
Auto Healing
: Pod
또는 Node
의 문제로 인해 Pod가 다운될 시 Pod를 정상적으로 동작하도록 재생성해준다.Auto Scaling
: Pod
의 자원 상태가 limit
의 상태로 돌입하였을 때 이를 감지하여 Pod
를 하나 더 생성해 부하를 분산시켜 성능에 대한 장애 없이 안정적인 서비스를 운영할 수 있게 해준다.Software Update
: 여러 Pod
에 대한 버전 업그레이드를 컨트롤러를 통해 쉽게 업그레이드가 가능하다.
Job
: 필요한(일시적인) 순간에만 작업을 해야할 때만 해당 작업 이행 후 제거할 수 있다.
현재
Replication Controller
대체용으로ReplicaSet
이 사용되고 있다.
지정된 숫자로 Pod을 기동 시키고 관리한다.
template
: Pod
를 재생성 또는 추가로 기동시킬 때 즉, template
에 정의된 내용을 토대로 Pod를 생성
replicas
: 정해진 개수만큼 Pod
의 스케일 인/아웃을 관리해준다.지정된 숫자로 Pod을 기동 시키고 관리한다.
template
, replicas
두개의 기능을 기본적으로 가지고 있다.selector
: label
기준으로 어떤 Pod들을 관리할지 정의한다.matchLabels
: 기존의 label
기능과 같이 Key: value의 값이 Pod - label
과 동일한 Pod들만 연결 시켜주는 기능
주의사항:
label
에 정의된 내용을 기준으로 작성해야 한다.
matchExpressions
: 조건을 걸어 label
을 좀 더 정교하게 필터링하는 기능
key
값이 Pod
에 존재하는 것만 연결시켜주는 기능key
값이 Pod
에 존재하지 않는 것만 연결시켜주는 기능key
를 포함하는 Pod
들 중에서 value
의 값들이 존재하는 것만 연결시켜주는 기능key
를 포함하는 Pod
들 중에서 value
의 값들이 존재하지 않는 것만 연결시켜주는 기능레플리카 오브젝트를 지우게 되면 자동으로 안에 있던 Pod
들도 삭제가 된다. 하지만 레플리카 오브젝트를 지울 때 Pod
를 살릴 수 있는 옵션이 있는데 바로 --cascade==false
라는 옵션이다.
$ kubectl delete 레플리카_오브젝트명 레플리카_네임 --cascade==false
서비스를 업데이트해서 배포 및 재배포 시 도움을 주는 컨트롤러
ReplicationController 와 ReplicaSet 을 좀더 추상화한 개념
이전 Pod
들을 삭제 후 새 버전의 Pod
를 재배포
(옵션) revisionHistoryLimit: 이전 버전의 히스토리 보관 개수를 지정한다.
새 버전을 먼저 만들어준다. 즉, V1, V2 버전이 동시에 서비스가 되고 있기 때문에 사용자의 버전이 다를 수 있다.
(옵션) minReadySeconds : V1 -> V2 로 버전을 업데이트할 때 대기 시간을 부여한다.
블루그린은 새버전, 구버전의 2세트의 서버를 마련하고 한꺼번에 교체하는 배포 방법이다.
로드 밸런서 혹은 서비스 디스커버리 수준에서 참조 대상을 교체하는 방식으로 이뤄지는 배포형태이다.
- 두개의 ReplicaSet.yml 를 작성이 선행되어야 한다.
Service 컨트롤러를 이용해 label
단위로 V1, V2 버전을 선택. 즉, 신버전, 구버전의 순간적인 교체 가능
label
만 이전 버전(V1)으로 바꿔주는 롤백이 가능(스탠바이 상태 가능), 다운 타임이 없음신규 버전을 배포할 때 한꺼번에 앱의 전체를 교체하는게 아니라 기존 버전을 유지한 채로 일부 버전만 신규 버전으로 올려서 신규 버전에 버그나 이상은 없는지를 사용자 반응은 어떤지 확인하는데 유용하게 사용하는 방법이다.
Pod
에 대한 label
을 2개 달아놓고, 레플리카셋 등으로 테스트용 Canary-Pod
의 개수를 할당해 트래픽을 분산 및 신규 버전을 테스트하는 식이다.
Path
를 이용해 특정 target을 대상으로 테스트가 가능하다.이전까진 ReplicaSet과 같은 컨트롤러와 쿠버네티스 스케줄러에 의해 각 Node의 자원량을 점수로 환산해 적절한 곳에
Pod
를 배치 시켰지만,Daemonset
은 각Node
에Pod
를 하나씩 생성해 준다.
- 각 노드에 두개 이상의 Pod를 만들 순 없지만
nodeSelector-label
를 통해 특정 노드에 Pod를 안만들 순 있다.
성능 수집
Prometheus
툴 등)로그 수집
fluentd
툴 등)각 노드에 대한 정보를 저장 - Storage
GlusterFS
툴 등)(옵션) hostPort: Service의
externalTrafficPolicy: Local
처럼 해당 노드의Pod
에 접근이 가능하게 해준다.(같은 기능이라고 생각하면 된다.)
Job
- 한번 실행되고 끝나는 Pod 을 관리한다.
- Job 컨트롤러가 종료되면 Pod 도 같이 종료한다.
- 컨테이너에서 Job 을 수행하기 위한 별도의
command
를 준다.- Job
command
의 성공 여부를 받아 재실행 또는 종료여부를 결정한다.
CronJob
- Job 컨트롤러를 주기적으로 수행해야 할 때 사용한다. (Pod 등)
- 별도의
schedule
을 정의해아 한다.- 예시: 주기적인(데이터 백업, 업데이트 확인, 예약 메일, SNS 등 메시징 관리)
(옵션) completions: 정의된 개수만큼
Pod
정해진 작업을 수행한다.(옵션) parallelism: 정의된 개수만큼
Pod
를 생성한다.(옵션) activeDeadlineSeconds: 정의된 시간(초)동안 동작하다
Pod
의 수행여부와 관계없이 종료
- 예를 들어 10초면 끝나야 할 작업이 30초가 되어도 끝나지 않을 시 등 점검해보기 위해 많이 사용
schedule : 리눅스에서 사용하는 Cron 포맷형태 (정의된 시간대로 Job를 만든다.)
concurrencyPolicy:
Job
의 동작 방식을 설정 (Allow가 default)
https://arisu1000.tistory.com/27842
https://kkimsangheon.github.io/2019/06/15/kube17/
https://dailyheumsi.tistory.com/208