클라우드 + DevOps/Kubernetes (k8s)

Kubernetes 쿠버네티스 :: workload resources

gamjadori 2024. 4. 20. 16:02
728x90

<Kubernetes 쿠버네티스 :: workload resources>

<Kubernetes workload resources>

  • Kubernetes의 workload는 포드를 중심으로 구동되는 컨테이너 애플리케이션으로, 원하는 상태의 특성을 정의하는 다양한 구성 요소가 존재
  • Kubernetes workload는 포드의 Life Cycle 관리를 지원해 주는 도구
  • Kubernetes에는 내장된 다양한 object가 있고 Controller를 통해 관리
  • 포드는 애플리케이션 배포의 기본 단위지만, 포드만으로는 Orchestraion의 이점을 모두 얻을 수 없어 workload를 통해 애플리케이션 식별
  • Kubernetes workload resources
    • 애플리케이션 정의, 배포, 관리의 주요 역할 수행
    • 운영을 단순화하고 안정성과 확장성을 높여 리소스 관리를 향상시키는 추상화 수준의 기능 제공

<Deployments>

  • Deployments: 쿠버네티스 클러스터에서 컨테이너화된 애플리케이션을 관리하기 위한 기본 빌딩 블록 제공
  • 복제 포드 집합을 관리, 확장하는 선언적 방법을 제공하는 API 리소스로 상위 수준의 추상화 오브젝트
  • Deployments에서 원하는 상태를 설명하면 Deployments Controlloer가 제어된 속도로 현재 상태를 원하는 상태로 조정
  • Deployments 사용 이유
    1. ReplicaSet rollout을 통해 포드 복제본 및 이미지 버전 관리
    2. 포드의 지속적 상태 관리
    3. 워크로드 기준 수동 및 자동 확장, 축소 기능 구현 가능
    4. Rolling update를 통한 중단 없는 업데이트 지원
    5. 다양한 배포 전략을 제공하고 이전 포드에서 새로운 포드로 전환하는 속도 제어 가능
    6. 롤백 기능 지원
    7. 사용하지 않는 ReplicaSet 정리
  • Deployment 배포 전략
    • 일반적으로 배포 전략에 따라 애플리케이션이 이전 버전에서 최신 버전으로 업데이트 되는 방식 결정
    • 일부 전략에는 다운 타임이 포함되며, 일부는 테스트 개념을 도입하고 사용자 분석 가능

 

1. Deployment 생성

[PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl create deployment smoke-deploy --image=pyhton:2.7-slim --port=8000 --dry-run=client -o yaml > smoke-deploy.yaml

<smoke-deploy.yaml>

  • Deployment는 두 개의 Pod 생성
  • pyhton:2.7-slim 이미지 사용
  • 포트 8000 노출
  • 웹 서버를 실행하여 "Smoke Test Deployment" 메시지 표시
apiVersion: app/v1
kind: Deployment
metadata:
	creationTimestamp: null
	labels:
		app: smoke-deploy
		name: smoke-deploy
spec:
	replicas: 2
	selector:
		matchLbels:
			app: smoke-deploy
	strategy: {}
	template:
		metadata:
			labels:
				 app: smoke-deploy
			spec:
				containers:
				- image: pyhton:2.7-slim
					name: smoke-container
					port: 
					- containerPort: 8000
					command: ["/bin/bash", "-c", "echo \\"<h1>Smoke Test Deployment : $(hostname). </h1>" > index.html; python -m SimpleHTTPServer 8000"]

<적용>

[PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl apply -f smoke-deploy.yaml
deployment.apps/smoke-deploy created

 

2. Deployment 서비스 노출

  • smoke-svc라는 서비스 정의
  • 포트 8000 노출
  • 해당 포트로 들어오는 트래픽을 Deployment의 포트 8000으로 전달
[PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl expose deployment smoke-deploy --name=smoke-svc --port=8000 --target-port=8000
service/smoke-svc exposed

<생성 확인>

A. kubectl get deployment.app,rs,po,svc -o wide

[PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl get deployment.app,rs,po,svc -o wide | grep smoke

B. curl

ubuntu@k8s-master:~$ curl 10.111.156.96:8000
<h1>Smoke Test Deployment : smoke-deploy-d8bb44576-9rb5z.
ubuntu@k8s-master:~$ curl 10.109.131.36:8000
<h1>Smoke Test Deployment : smoke-deploy-d8bb44576-zllre.

C. crictl: 컨테이너 런타임과 상호 작용하기 위한 CLI(Command Line Interface) 도구

ubuntu@k8s-master:~$ sudo crictl ps

 

<--watch: 실시간 모니터링>

** 실시간으로 작업 확인 가능

[PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl get po -o wide --watch

1. Deployment 생성

  • msa-web라는 Deployment 생성
  • nginx:1.17 이미지를 사용하여 Pod 생성
  • 포트 80 노출
  • 레플리카 수를 2개로 지정하여 두 개의 Pod 생성
[PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl create deployment msa-web --image:nginx:1.17 --port=80 --replicas=2
deployment.apps/msa-web created

 

2. Deployment 이미지 업데이트

  • nginx:1.17에서 nginx:1.19로 업데이트
  • 캡쳐를 통해 업데이트 반영 확인 가능
[PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl set image deploy mas-web nginx=nginx:1.19
deployment.apps/msa-web image updated

<결과 확인>

A. kubectl get deploy,rs,po -o wide

B. kubectl rollout history: 롤아웃 이력 조회

[PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl rollout history deployment msa-web
deployment.apps/mas-web
REVISION   CHANGE-CAUSE
1          <none>
2          <none>
  • 두 번째 리비전에 대한 롤아웃 이력 조회
  • --revision=N 을 통해 롤아웃 단계 별 조회 가능
[PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl rollout history deployment msa-web --revision=2

 

3. Deployment 이미지 업데이트 Ver. 2

  • nginx:1.19에서 nginx:1.21로 업데이트
[PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl set image deploy mas-web nginx=nginx:1.21
deployment.apps/msa-web image updated

<수정 적용 확인>

A. kubectl rollout history: 롤아웃 이력을 조회

[PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl rollout history deployment msa-web
deployment.apps/mas-web
REVISION   CHANGE-CAUSE
1          <none>
2          <none>
3          <none>
  • --revision 3 옵션 적용을 통해 단계 별 확인
[PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl rollout history deployment msa-web --revision 3

<결과 확인>

 

4. 이전의 수정으로 롤백

[PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl rollout undo deployment msa-web --to-revision=
deployment.apps/mas-web rolled back

 

5. Deployment 이미지 업데이트 Ver. 2

  • nginx:1.19에서 nginx:1.21로 업데이트
[PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl set image deploy mas-web nginx=nginx:1.21
deployment.apps/msa-web image updated

<수정 적용 확인>

A. kubectl rollout history: 롤아웃 이력을 조회

[PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl rollout history deployment msa-web
deployment.apps/mas-web
REVISION   CHANGE-CAUSE
1          <none>
2          <none>
3          <none>
  • --revision 2 옵션 적용을 통해 단계 별 확인
[PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl rollout history deployment msa-web --revision 2

 

6. 레플리카 수 조정

A. 6개

[PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl scale deployment msa-web --replicas=6
deployment.apps/mas-web scaled

<결과 확인>

B. 2개

[PS C:\\Users\\admin\\Desktop\\k8s-pods> kubectl scale deployment msa-web --replicas=2
deployment.apps/mas-web scaled