Pod
쿠버네티스에서 Pod를 정의하는 정의하는 yaml의 형태는 다음과 같다.
(Pod 뿐만 아니라 다른 오브젝트도 동일)
# pod-definition.yml
apiVersion:
kind:
metadata:
spec:
containers:
- name: # - before the name indicates, its first item in the list
image:
Pod 관련 명령어
kubectl create -f [FILE NAME].yml
kubectl create -f [FILE NAME].yml --record
또는 kubectl apply -f [FILE NAME].yml
kubectl get pods
kubectl describe pod [POD NAME]
Labels, Selectors 개념
- Labels and Selectors act as a filter, filtering pods for ReplicsSet
- Labels와 Selectors는 필터로서의 기능을 함. ReplicaSet 뿐만 아니라 추후 다룰 Deployment, Service 등에서도 사용됨.
필터링 또는 파드를 선택하기 위한 용도로도 많이 사용 됨
- 파드에 label을 부여하고 selector를 통해 매치. 추후 파드가 수십 수백개가 되는 상태에서도 매니징을 가능케 함
- type 유형 별 (파드, 레플리카셋, 디플로이먼트, 서비스 등등)
- app 애플리케이션 별
- function 기능 별
ReplicaSet
Replication Controllers (OLD)
- High Availability
- 레플리카 Pod instance를 생성하고 관리함
- Pod가 하나인 상황에서도, 만약 죽으면 새로 다시 올리는 역할을 함
- Load Balancing & Scaling
- multiple pod , multiple node 상황에서도 관리
Replication controller 예시
# rc-definition.yml
apiVersion: v1 # v1에서는 여전히 replication controller 지원함
kind: ReplicationController
metadata:
name: myapp-rc
labels:
app: myapp
type: front-end
spec:
template:
# Pod 생성 때 사용했던 정보를 다 가져옴
metadata:
name:
labels:
app:
type:
spec:
containers:
- name:
image:
# template 과 같은 레벨에서 정의함
replicas: 3
kubectl create -f [RC FILE NAME].yml
kubectl get replicationcontroller
kubectl get pods
ReplicaSet 정의
- Replicaiton Controller 는 deprecated 되어 대부분 ReplicaSet 으로 대체됨
- 생성된 복수개의 Pod 를 모니터하며, fail이 생길 경우 새 Pod를 생성함.
ReplicaSet 예시
# replicaset-definition.yml
apiVersion: apps/v1 # apps/v1 에서부터 지원
kind: ReplicaSet
metadata:
name: myapp-replicaset
labels:
app: myapp
type: front-end
spec:
# 갯수
replicas: 3
# ReplicaSet에서는 어떤 Pod를 쓸지 정의
selector:
matchLabels: # Pod에서 명시한 label과 같은 label에서만 레플리카를 만든다
type: front-end
# replicas와 같은 레벨에서 정의
template:
# Pod 생성 때 사용했던 정보를 그대로 다 가져옴
metadata:
name: myapp-pod
labels:
app: myapp # labels가 위와 매칭하도록 주의!!!!!!
type: front-end
spec:
containers:
- name: nginx-container
image: nginx
kubectl create -f replicaset-definitnion.yml
kubectl get replicaset
kubectl get pods
ReplicaSet 스케일링 방식
- 레플리카 갯수 업데이트
kubectl replace -f replicaset-definition.yml
- 이미 정의된 replica의 파라미터를 수정하기
kubectl scale --replicas=6 -f replicaset-definition.yml
kubectl scale —-kubekreplicas=6 replicaset(TYPE) myapp-replicaset(NAME)
주의: 정의된 내용을 수정한다고 바로 스케일링이 되는 건 아님
변경사항을 바로 적용하고 싶다면
kubectl edit replicaset myapp-relicaset
으로 수정(k8s가 자체로 생선한 설정파일이므로, 여기는 수정을 주의해야 함)kubectl scale replicaset myapp-replicaset —-replicas=2
바로 얄짤 없이 적용
가장 적절한 방식은 definition yaml 파일을 수정한 후, kubectl apply
를 통해 적용하는 것. (정의 파일과 현상태가 sync 된 상태를 유지할 수 있음)
Deployment
- 상황
- 여러 개의 인스턴스를 배포한 상황일 때, 인스턴스를 업그레이드 해야 한다면, 한꺼번에 업데이트 하는 것은 바람직하지 않음 → 다운 타임 등으로 유저가 영향을 받을 수 있음
- Deployment 사용
- Deployment는 ReplicaSet보다 더 상위의 객체이며
- 배포된 여러 개의 Pod 들을 seamlessly 하게 업데이트하고 끄고 닫을 수 있게 함
Deployment 정의
# deployment-definition.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
lables:
apps: myapp
type: front-end
spec:
template:
metadata:
name: myapp-pod
labels:
app: myapp
type: front-end
spec:
containers:
- name: nginx-2container
image: nginx
replicas: 3
selector:
matchLabels:
type: front-end
strategy:
# strategy를 명시하지 않으면 default는 RollingUpdate 이다.
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
kubectl create -f deployment-definition.yml
kubectl get deployment
kubectl explain deployment
Rollout Deployment & Rollback
Rollout
Rollout and Versioning
- 새로운 버전의 컨테이너가 생성되면 rollout 을 시행
- deployment 생성 → rollout 실행 → 새로운 revision 생성
- 애플리케이션이 새 컨테이너로 업데이트되면 → 새로운 rollout 실행 → 새로운 revision 생성
- Rollout history tracking 가능
- Rollback도 가능
Rollout commands
kubectl rollout status deploymnet/myapp-deployment
kubectl rollout history deployment/myapp-deployment
kubectl rollout history deployment <deployment-name> --revision=<revision-no>
- 특정 revision number를 통해 히스토리를 선택해서 조회할 수 있음.
Rollback 하는 방법
롤아웃을 취소하는 방식으로 롤백함.
kubectl rollout undo deployment/<deployment-name>
kubectl rollout undo deployment/<deployment-name> --to-revision=<revision-no>
- 특정 revision으로 롤백 -
Deployment Strategy - Recreate & RollingUpdate
Recreate Strategy
- 실행되는 인스턴스 다 내림
- 새 인스턴스 올림
One-by-one (Rolling update) - default strategy
- 하나씩 내리고 하나씩 올림
- 디폴트 설정
Recreate, RollingUpdate 업데이트하는 법
kubectl edit -f deployment-definition.yml --record
kubectl apply -f deployment-definition.yml
Blue-Green
- 우선 배포 하고 나서, 라우팅 트래픽을 한번에 새 버전으로 옮기는 방법
- 현행 deployment (blue) 가 띄워져 있는 상태로 업데이트 된 deployment (green)을 생성함.
- 이후 로드밸런서가 Green deployment를 가리키게 하여 업데이트를 완료함.
- 리소스가 Blue deployment만큼 배로 필요함.
적용하는 방법
예시)
- service 가 blue에 연결되어 있는 상태.
version: v1
이라는 label을 통해 서비스와 deployment가 연결되어 있음. version: v2
라는 label이 지정된 green을 배포함- green 이 모두 배포된 이후에는 service의 label을 version: v2 으로 변경시켜서 service가 green 과 연결되게끔 함
Canary
일정한 작은 비율을 새 버전으로 배포하고, 일정 테스트를 거치고 괜찮다 판단되면 나머지를 배포함
적용 방법
예시)
- service 가 blue에 연결되어 있는 상태. version: v1 이라는 label을 통해 서비스와 deployment가 연결되어 있음.
- old와 new 에게 공동퇴는 label을 부여하여 서비스가 new에도 연결되도록 함.
- 이 때, new에는 replica를 최소한의 수로 지정함.
- 이렇게 되면 old의 배포는 유지하며, new 는 작은 비율을 차지하게 됨 (canary)
- new로 업그레이드 해도 되겠다 판단되면, primary를 업데이트하고, canary는 지움.
- 또는 primary를 scale down to 0 하고, canary의 replica를 기존 갯수대로 scale up 함 → 그리고 primary를 삭제