반응형
리뷰 (Review)
더보기
Pod
- Kubernetes에서 하나의 독립적인 서비스를 제공할 수 있는 container들을 모아서 관리하는 최소 배포 단위
- Pod 단위로 container 작성, 시작, 정지, 삭제 등과 같은 조작 수행
Pod 특징
- 동일한 Pod의 container는 반드시 동일한 node 상에 동시에 deploy 된다.
- 같은 Pod 안에서 Port 번호는 중복될 수 없다.
- Pod 안의 여러 container가 가상 NIC를 공유하는 구성을 취하기 떄문에 localhost를 통해 통신 가능하다.
Pod 생명 주기
- Pod status
- Pending
- Running
- Succeeded
- Failed
- Unkown
- Pod conditions
- Initialized
- Ready
- ContainersReady
- PodScheduled
- Unschedulable
Volume
- Volume은 Pod의 일부분으로 정의되는 요소로, Pod와 동일한 생명 주기를 갖는 disk storage
- 독립적인 리소스가 아니므로 자체적으로 생성, 삭제할 수 없다.
- Volume은 Pod의 모든 container에서 사용 가능하며 사용 시 container에서 mount 해야 사용 가능
- 각 container 파일 시스템의 어느 경로에도 mount 할 수 있다.
Volume 유형
- emptyDir
- hostPath
- nfs
- public cloud 전용 스토리지
- configMap, secret, downwardAPI
- persistentVolumeClaim
ReplicaSet
ReplicaSet
- Pod를 정해진 수만큼 복제하고 관리
- Kubernetes 사용 목적 - 사용자가 요청한 상태를 유지 관리 (자동으로) 하는 것이 목적
- Pod는 Kubernetes 기본 단위로 한 개 또는 여러 개의 container를 추상화해 하나의 Application으로 동작하도록
만드는 container 묶음 - 사용자가 직접 또는 YAML 파일을 정의해 Pod를 생성하면 해당 Pod의 생명 주기는 오직 사용자에 의해서만 관리
- 마이크로 서비스 아키텍처 구조의 Application을 배포하기 위해서는 여러 개의 Pod를 생성하여 배포해야 한다.
- 따라서 사용자는 여러 개의 Pod를 생성하여 외부 요청을 여러 Pod에 분배하는 방식으로 구성하게 된다.
- 동일한 여러 개의 Pod 생성 방법
- 다른 이름을 갖는 여러 개의 Pod 직접 생성
- 동일한 Pod 여러 개를 직접 생성
- 만약 Pod가 어떤 이유에 의하여 중지되었을 때 사용자가 직접 Pod를 생성 / 삭제하여 복구해야 한다.
- 사용자가 직접 Pod를 관리한다는 것은 Kubernetes를 사용하는 의미가 없다.
- 다른 이름을 갖는 여러 개의 Pod 직접 생성
ReplicaSet 동작
- 정해진 동일한 Pod가 항상 실행되도록 관리
- node (worker node) 장애 등의 이유로 Pod를 생성할 수 없다면 다른 node에서 Pod를 다시 생성
- 사용자가 요구하는 상태가 되도록 Pod 관리
ReplicaSet 실습
더보기
#### replicaset-nginx.yml #####
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset-nginx
spec:
replicas: 3
selector:
matchLabels:
app: my-nginx-pods-label
template:
metadata:
name: my-nginx-pod
labels:
app: my-nginx-pods-label
spec:
containers:
- name: nginx
image: nginx:1.20.0
ports:
- containerPorts: 80
- spec.replicas - 동일한 Pod 유지할 개수
- spec.selector.matchLabels
- label 체크 조건
- ReplicaSet이 검색하는 Pod label
- spec.template - 생성할 Pod 명시
- ReplicaSet에 의해 생성할 Pod에 대해 명시
- kubectl get replicasets - ReplicaSet 목록
- kubectl describe replicaset/<ReplicaSet 이름> - 특정 ReplicaSet 상세 정보
- kubectl get pod --show-labels - Pod 정보에 label 포함하여 출력
- kubectl label pod/<Pod 이름> app- - 특정 Pod의 label 내용 변경
ReplicaSet을 이용한 Scale In / Scale Out
- ReplicaSet YAML 파일의 replicas 값 변경 후 kubectl apply -f <ReplicaSet YAML 파일>
ReplicaSet 삭제
- 생성된 Pod도 같이 삭제
- kubectl delete -f <ReplicaSet 이름>
Deployment
Deployment
- 참고 자료
- Deployment는 Kubernetes에서 가장 많이 사용되는 Object
- Deployment는 ReplicaSet을 관리하는 Controller 역할
- ReplicaSet을 이용하여 Pod를 Update 하고 이력을 관리하여 Rollback 하거나 특정 버전으로 돌아가는 기능 제공
Deployment 실습
더보기
##### deployment-nginx.yml #####
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx
labels:
app: deployment-nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pods
template:
metadata:
name: nginx-pod
labels:
app: nginx-pods
spec:
containers:
- name: nginx
image: nginx:1.20.2
ports:
- containerPort: 80
- ReplicaSet과 차이점은 kind에 Deployment로 기술
- 기본적으로 Deployment와 ReplicaSet의 YAML 내용은 차이가 없다.
- Deployment는 ReplicaSet을 제어하여 pod를 관리
- Deployment → ReplicaSet → Pod
- Deployment
- ReplicaSet 관리
- Pod Update / Rollback / Revision
- 이력 관리
- ReplicaSet - Pod 관리
- Pod - container 실행
- Deployment
- kubectl apply -f <Deployment YAML 파일 이름> - Deployment 생성
- kubectl get pod --show-labels - Pod 목록
- kubectl get replicasets -o wide - ReplicaSet 목록
- kubectl get deployments -o wide - Deployment 목록
- READY - replicas에 의해 요청한 Pod 중 정상 동작 중인 Pod 수
- UP-TO-DATE - update가 된 Pod 수
- AVAILABLE - 사용 가능한 Pod 수
- Deployment 생성 시 ReplicaSet의 이름 형식
- [Deployment 이름]-[pod-template-hash=hash 값]
- ex) kubectl get replicaset/deployment-nginx-76688c8 -o yaml - ReplicaSet을 YAML 형식으로 출력
- ownerReferences - ReplicaSet을 관리하는 Deployment 정보
- ex) kubectl get pod/deployment-nginx-76688c8-gsrtt -o yaml - Pod를 YAML 형식으로 출력
- ownerReferences - Pod를 관리하는 ReplicaSet 정보
Application 배포 (update) 방식
- 서비스 제공을 위한 Application 배포 의미
- Application을 배포할 때 기존 서비스를 제공하는 Application을 중단하고 배포하게 되면 서비스가 중단되는 시점이 생긴다.
- 서비스가 중단되는 시점을 downtime이라고 한다.
- 이와 같은 downtime을 줄이거나 없애기 위해 무중단 배포 방식 사용
- Rolling Update
- 사용 중인 인스턴스 내에서 새 버전을 점진적으로 교체
- 무중단 방식의 가장 기본적인 방식
- 장점
- 인스턴스마다 차례로 배포를 진행하기에 상황에 따라 쉽게 Rollback 가능
- 추가적인 인스턴스를 늘리지 않아도 된다.
- 간편한 관리
- 단점
- 사용 중인 인스턴스에 트래픽이 몰릴 수 있다.
- 배포 중 신버전과 구버전이 공존하므로 호환성 문제 발생 가능성이 있다.
- Blue / Green Deployment
- Blue는 구버전, Green은 신버전
- 운영 중인 구버전과 동일한 신버전의 인스턴스를 구성한 후 Load Balancer를 통해 모든 트래픽을 한 번에
신버전 쪽으로 전환하는 방식 - 장점
- 구버전의 인스턴스가 그대로 남아있어서 손쉬운 Rollback 가능
- 구버전의 환경을 다음 배포에 재사용할 수 있다.
- 운영 환경에 영향을 주지 않고 새로운 버전 테스트 가능
- 단점
- 시스템 자원이 두 배로 필요
- 새로운 환경에 대한 테스트가 전제되어야 한다.
- Canary Release
- 옛날 광부들이 유독 가스 감지를 위해 카나리아를 이용한 것이 유래로 잠재적 문제 상황을 미리 발견하는 방식
- 신버전을 소수의 사용자에게 배포해서 문제가 없는지 확인한 후 점차 사용자를 늘려 배포하는 기법
- Blue / Green Deployment와 유사한 면이 있지만 트래픽을 한 번에 바꾸는 것이 아니라 단계적으로 전환하기
때문에 부정적 영향을 최소화하고 트래픽 양을 조절하여 Rollback 할 수 있다. - 장점
- 문제 상황을 빠르게 감지
- A/B 테스트로 활용 가능
- A/B 테스트 - 대조군과 실험군을 나누어서 특정 UI나 Algorithm 효과 비교 테스트 방법론
- 단점
- 네트워크 트래픽 제어 부담
Deployment를 이용한 Application 배포 (Update)
- Deployment는 ReplicaSet과 다르게 Application update 기능을 가지고 있다.
- Deployment Update 종류
- Recreate
- 전체를 한 번에 update
- 기존 Pod를 삭제하고 새로운 Pod를 생성하여 update 수행
- RollingUpdate (default)
- 점진적으로 Pod를 교체하면서 update 수행
- 기존 Pod 일부를 제거하고 새롭게 Update 된 Pod 일부를 배포하는 과정을 반복하는 방식
- 점진적 배포 과정 때문에 완료까지 시간이 더 걸리지만 일부의 Pod는 계속 running 상태를 유지하여
downtime이 발생하지 않는다.
- Recreate
- Deployment YAML 파일에 spec.strategy 필드에 update 방식을 명시하며 생략 시 RollingUpdate가 기본 적용
Recreate 방식으로 Update 실습
더보기


- Deployment 상태 변화 관찰을 위한 watch 명령
- watch "kubectl get deployment deployment-nginx"
- Deployment YAML 파일에 spec.strategy : Recreate 설정 후 apply
- kubectl apply -f <Deployment YAML 파일 이름>
##### deploy-nginx-recreate.yml #####
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx
labels:
app: deployment-nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pods
strategy:
type: Recreate
template:
metadata:
name: nginx-pod
labels:
app: nginx-pods
spec:
containers:
- name: nginx
image: nginx:1.20.2
ports:
- containerPort: 80
- update 내용 변경
- Deployment YAML 파일에 update할 내용을 추가한 후 apply
- Deployment YAML 파일 수정
- kubectl apply -f <Deployment YAML 파일 이름>
- kubectl set 명령으로 update 내용 변경 방법
- kubectl set <set 대상 필드> <set 대상 필드를 가지고 있는 Object> <변경 내용>
- kubectl set image deployment/deployment-nginx nginx=nginx:1.22.0
- Deployment YAML 파일에 update할 내용을 추가한 후 apply
RollingUpdate 방식으로 실습
더보기


update 수행

- Deployment YAML 파일에 추가 설정 내용
- strategy.rollingUpdate.maxSurge
- update 시 최대 얼마만큼의 Pod를 더 생성할 수 있는지 설정
- int 값 또는 string 값으로 % 사용 가능
- 최대 몇 개의 Pod를 추가 생성할 수 있는지 결정
- strategy.rollingUpdate.maxUnavailable
- update 시 최대 얼마만큼의 Pod가 unavailable 상태여도 되는지 정할 수 있는 설정
- int 값 또는 string 값으로 % 사용 가능
- 최소 동작 Pod 수 결정
- strategy.rollingUpdate.maxSurge
##### deploy-nginx-rolling.yml #####
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx
labels:
app: deployment-nginx
spec:
replicas: 4
selector:
matchLabels:
app: nginx-pods
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 50%
maxUnavailable: 50%
template:
metadata:
name: nginx-pod
labels:
app: nginx-pods
spec:
containers:
- name: nginx
image: nginx:1.20.2
ports:
- containerPort: 80
- Deployment YAML 파일 apply
- kubectl apply -f <Deployment YAML 파일 이름>
- Deployment와 Pod 상태 변화 모니터링
- watch "kubectl get deployments"
- watch "kubectl get pods"
- update 수행 - NginX 버전 변경
- kubectl set image deployment/deployment-nginx nginx=nginx:1.23.1

Deployment Rollback
- 새로운 Application을 배포하였다가 문제가 생겨 이전 버전으로 되돌리는 과정을 Rollback이라 한다.
- Deployment는 Rollback 기능을 사용할 수 있다.
- 배포 이력 확인
- kubectl rollout history deployment/<Deployment 이름>
- kubectl rollout history deployment/<Deployment 이름> --revision=<revision 번호>
- Deployment revision에 대한 배포 정보 확인
- 이전 버전으로 Rollback
- kubectl rollout undo deployment/<Deployment 이름>
- kubectl rollout undo deployment/<Deployment 이름> --to-revision=<revision 번호>
- 특정 revision 번호로 Rollback
TIF
강사님께서 공유해주신 자료로 금방 끝날 줄 알았다면...
실습 환경 새로 만든다고 몇 시간을 날렸는데...
다시 만들어도 계속 ContainerCreating에서 먹통이 되어서 Instance를 지우고 다시 깔고를 수 차례 반복했는데...
2022. 10. 13 에 작성된 글입니다.
반응형
'구름 쿠버네티스' 카테고리의 다른 글
구름 쿠버네티스 전문가 과정 6기 - 51일차 (0) | 2023.11.09 |
---|---|
구름 쿠버네티스 전문가 과정 6기 - 50일차 (3) | 2023.11.08 |
구름 쿠버네티스 전문가 과정 6기 - 48일차 (1) | 2023.11.06 |
구름 쿠버네티스 전문가 과정 6기 - 47일차 (3) | 2023.11.03 |
구름 쿠버네티스 전문가 과정 6기 - 46일차 (3) | 2023.11.02 |