쿠버네티스 기본 사용법(2)

쿠버네티스 기본 사용법(2)

레플리카셋으로 파드 수 관리하기

많은 사용자를 대상으로 휍 서비스를 하려면 다수의 파드가 필요한데, 이를 하나씩 생성한다면 매우 비효율적이기 때문에 쿠버네티스에서는 다수의 파드를 만드는 레플리카셋 오브젝트를 제공합니다.

예를 들어, 파드를 3개 만들겠다고 레플리카셋에 선언하면 컨트롤러 매니저와 스케줄러가 워커 노드에 3개를 만들도록선언합니다.

레플리카셋은 파드의 개수를 지정한 대로 맞춰는 역할을 하며, 이 과정이 어떻게 이루어지는지 확인해보겠습니다.

1. 먼저 배포된 상태를 확인합니다.

2. nginx-pod를 scale 명령으로 3개로 증가 시킵니다.

여기서 --replicas=3은 파드의 수를 3개로 맞추는 옵션 입니다.

실행해보니 리소스를 찾을 수 없다는 에러 메시지가 나오면서 실행되지 않습니다.

nginx-pod는 파드로 생성했기 때문에 디플로이먼트 오브젝트에 속하지 않습니다.

3. 이번에는 디플로이먼트로 생성한 dpy-nginx를 scale 명령과 --replicas=3 옵션으로 파드의 수를

3개로 만듭니다.

4. scale 명령으로 추가된 2개의 nginx 파드를 확인 합니다.

5. dpy-nginx의 모든 파드가 정상적으로 워커 노드에 적용되고 IP가 부여됐는지

kubectl get pods -o wide 명령으로 확인합니다.

6. 다음 진행을 위해 생성한 디플로이먼트 dpy-nginx를 삭제 합니다.

그 후, 배포된 파드 또는 디플로이먼트의 상태를 확인합니다.

스펙을 지정해 오브젝트 생성하기

kubectl create deployment 명령으로 디플로이먼트를 생성하긴 했지만, 1개의 파드만 만들어 졌을 뿐입니다.

디플로이먼트를 생성하면서 한꺼번에 여러 개의 파드를 만들고 싶은데,

create 에서는 replicas 옵션을 사용할 수 없고, scale은 이미 만들어진 디플로이먼트에서만 사용할 수 있습니다.

이러한 설정을 위해 필요한 내용을 파일로 작성 해야 하며, 이때 작성하는 파일 을 오브젝트 스펙(Spec)이라고 합니다.

일반적으로 야믈(YAML) 문법 으로 작성합니다.

그러면 3개의 nginx 파드를 디플로이먼트 오브젝트로 만들어 보겠습니다.

오브젝트 스펙을 작성해 디플로이먼트를 만듭니다.

디플로이먼트의 오브젝트 스펙을 처음부터 만들기는 어렵기 때문에 내려받은 파일 디렉터리에

예제 파일(echo-hname.yaml)을 사용 합니다. 파일 내용은 다음과 같습니다.

apiVersion: apps/v1 kind: Deployment metadata: name: echo-hname # 디플로이먼트의 이름 labels: # 디플로이먼트의 레이블 app: nginx spec: replicas: 3 # 몇 개의 파드를 생성할지 결정 selector: # 셀렉터의 레이블 ㅣ정 matchLabels: app: nginx template: # 템플릿의 레이블 지정 metadata: labels: app: nginx spec: # 템플릿에서 사용할 컨테이너 이미지 지정 containers: - name: echo-hname image: sysnet4admin/echo-hname # 사용되는 이미지

apiVersion은 오브젝트를 포함하는 API 버전을 의미 합니다.

여기서 사용하는 apps/v1은 여러 종류의 kind(오브젝트)를 가지고 있는데, 그 중에서 Deployment를 선택해

레플리카셋을 생성 합니다. 레플리카셋은 몇 개의 파드를 생성할지 replicas로 설정 합니다.

1. echo-hname.yaml 파일을 이용해 디플로이먼트를 생성 합니다.

그리고 echo-hname 파드가 3개인지 확인 합니다.

2. 디플로이먼트를 생성했고 이번에는 echo-hname.yaml 파일을 수정해 파드를 6개로 늘려보겠습니다.

replicas의 값을 3에서 6으로 변경합니다. 이때 사용하는 명령어는 sed(streamlined editor)입니다.

-i는 --in-place의 약어로 변경한 내용을 현재 파일에 바로 적용하겠다는 의미 이며,

s/는 주어진 패턴을 원하는 패턴으로 변경하겠다는 의미 입니다.

이 명령어들이 어렵다면 직접 파일을 수정하셔도 됩니다.

3. replicas의 값이 3에서 6으로 변경됐는지 확인합니다.

4. 변경된 내용을 적용합니다.

하지만 "echo-hname"이 이미 존재한다는 에러 메시지가 나옵니다.

한번 배포된 오브젝트의 스펙을 변경하는 방법을 확인해 보겠습니다.

apply로 오브젝트 생성하고 관리하기

run은 파드를 간단하게 생성하는 매우 편리한 방법입니다. 하지만 run은 단일 파드만 생성 가능합니다.

그렇기 때문에 run 명령어를 모든 상황에 적용해 사용하기는 어렵습니다.

그렇다고 create로 디플로이먼트를 생성하면 파일의 변경 사항을 바로 적용할 수 없다는 단점이 있습니다.

이런 경우를 위해 쿠버네티스는 apply라는 명령어를 제공합니다.

1. replicas 6으로 수정한 echo-hname.yaml 파일을 kubectl apply 명령으로 적용 합니다.

오브젝트를 처음부터 apply로 생성한 것이 아니어서 경고가 뜹니다.

작동에는 문제는 없지만 일관성에 문제가 생길 수 있기 때문에, 변경 사항이 발생할 가능성이 있는 오브젝트는

처음부터 apply로 생성하는 것이 좋습니다.

2. 명령이 적용된 후 echo-hname이 6개로 늘어났는지 확인 합니다.

kubectl apply를 사용하면 파일의 변경 사항도 쉽게 적용할 수 있다는 것을 확인했습니다.

밑에 표는 명령어 정리입니다.

구분 Run Create Apply 명령 실행 제한적임 가능함 안 됨 파일 실행 안 됨 가능함 가능함 변경 가능 안 됨 안 됨 가능함 실행 편의성 매우 좋음 매우 좋음 좋음 기능 유지 제한적임 지원됨 다양하게 지원됨

파드의 컨테이너 자동 복구 방법

파드와 디플로이먼트, 오브젝트에 대해 배운 내용을 사용해 보겠습니다.

쿠버네티스는 거의 모든 부분이 자동 복구되도록 설계됐습니다.

특히, 파드의 자동 복구 기술 을 셀프 힐링(Self-Healing)이라고 합니다.

제 대로 작동하지 않는 컨테이너를 다시 시작하거나 교체해 파드가 정상적으로 작동하게 합니다.

1. 파드에 접속하려면 파드의 IP를 알아야 하기 때문에, kubectl get pods -o wide 명령으로

접속할 파드의 IP를 확인 합니다.

2. kubectl exec 명령을 실행해 파드 컨테이너의 셸(Shell)에 접속 합니다.

명령에서 i 옵션은 stdin(Standard input)이고, t는 tty(Teletypewriter)를 의미합니다.

-it는 표준 입력을 명령줄 인터페이스로 작성한다는 의미 가 됩니다.

그리고 파드인 nginx-pod에 /bin/bash를 실행해 nginx-pod의 컨테이너에서 배시(bash) 셸에 접속 합니다.

3. 배시 셸에 접속하면 컨테이너에서 구동하는 nginx의 PID를 확인 합니다.

nginx의 PID는 언제나 1입니다.

4. ls -l 명령으로 프로세스가 생성된 시간을 확인 합니다.

5. 슈퍼푸티에서 m-k8s의 터미널을 1개 더 띄우고 이 터미널 화면에서 nginx-pod의 IP(172.16.103.133)에서

돌아가는 웹 페이지를 1초마다 한 번씩 요청하는 스크립트를 실행 합니다.

curl에서 요청한 값만 받도록 --slient 옵션을 추가 합니다.

6. 배시 셸에서 nginx 프로세서인 PID 1번을 kill 명령으로 종료 합니다.

7. 1초마다 nginx 웹 페이지를 받아오는 스크립트가 잘 작동하는지 확인하고, 자동으로 다시

복구되는지도 확인합니다. 아마 잠시 끊겼다가 다시 nginx 웹 페이지를 받아오는 것을 확인할 수 있을 것입니다.

8. 확인 후, nginx-pod에 접속 합니다.

ls -l을 실행하여 nginx.pid가 생성된 시간으로 새로 생성된 프로세스인지 확인 합니다.

nginx 프로세스는 몇 초만에 종료되고 바로 다시 실행되므로 생성 시간을 확인하기 어려울 수 있습니다.

참조 - 컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 (조훈, 심근우, 문성주 지음)

from http://puzzle-moon.tistory.com/90 by ccl(A) rewrite - 2021-12-30 22:00:38