본문 바로가기
Study/Cloud Computing

[Cloud] 쿠버네티스 실습

by sumping 2024. 5. 13.

 

*본 포스트는 성신여자대학교 [클라우드 컴퓨팅] 강의 기반으로 작성됨을 알립니다.

 
 

목차

1. 헬스 체크
2. 서비스
3.스토리지


 1️⃣ 헬스 체크

 
쿠버네티스에는 파드가 정상적인지 판단하기 위한 "헬스 체크" 기능이 있다.
헬스 체크는 컨테이너별로 이루어지며, 어느 하나의 컨테이너라도 실패하면 전체 파드가 실패한 것으로 간주한다.
 

파드의 헬스 체크 기능

  • 두 종류의 프로브
    • 활성 프로브 (Liveness Probe) : 정상적으로 동작 중인지 / 실패 시 컨테이너 재기동 (Restart)
    • 준비 상태 프로브 (Readiness Probe) : 파드가 요청을 받을 수 있는지 / 실패 시 트래픽 차단 (재기동X)
  • 사용방법
    • 매니페스트에 명시적 설정
    • 모니터링 할 application도 필요. 요청에 대한 적절한 응답을 반환하도록 구현
  • 프로브 대응 핸들러 종류 (어떤 핸들러를 사용할지)
    • exec (command) : 명령어를 실행하고 종료 코드가 0이 아니면 실패 / 컨테이너 별로 실행
    • tcpSocket (pod) : TCP 세션이 연결되지 않으면 실패
    • httpGet (path, port) : HTTP GET 요청을 실행하고 Status code가 200~399가 아니면 실패 (kubelet에서 이루어진다.)
    • initialDelaySeconds : 프로브 검사 시작 전 대기 시간
    • periodSeconds : 검사 간격 (얼마나 자주 확인을 할 지)

 

실습

  • 컨테이너 이미지 빌드 → 도커 허브 레지스트리에 로그인 후 등록(push) → 매니페스트에 push한 이미지 작성
// 디렉토리 준비하기
$ git clone https://github.com/Jpub/15_DandK
$ cd 15_DandK/step07/hc-probe/webapl

// 컨테이너 이미지 빌드
$ docker image build -t jekim12/webapp:0.1 .

// 도커 허브 레지스트리 로그인 및 리포지터리에 등록
$ docker login
$ docker image push jekim12/webapl:0.1

 

  • K8s 클러스터 연결 → 매니페스트 적용하여 파드 실행
// K8s 연결 확인
$ kubectl config get-contexts

// 매니페스트 적용
$ kubectl apply -f webapl-pod.yml
$ kubectl get pod

// 컨테이너 로그에 기록된 헬스 체크 결과 출력
$ kubectl logs webapl

// 파드의 상세 정보
$ kubectl describe pod webapl

 

 


 2️⃣ 서비스

서비스는 외부의 client가 pod에 접근하는 걸 도와주는 쿠버네티스 오브젝트이다.
 

서비스의 종류

 

  • ClusterIP : 서비스로 요청이 들어오면 내부 DNS에서 대표 IP로 반환하고 대표 IP 주소의 파드로 부하 분산 (대표 IP는 기본으로 설정되는 것이며, 대표 IP없는 헤드리스 모드도 가능하다. 스테이트풀셋에서 활용) (내부)
  • NodePort : ClusterIP + 노드의 IP 주소의 포트 공개
    • 정식 서비스에는 사용하지 않음. 클러스터 외부에서 내부의 파드 요청을 보내면 서비스는 각 노드의 포트를 열고 요청 전달
  • LoadBalancer : 많이 사용한다. NodePort (ClusterIP + 내부 포트 공개) + 외부에서 대표 IP 주소로 접근
  • ExternalName : 반대로, 파드에서 클러스터 외부의 엔드포인트에 접근하기 위해서

 

서비스의 매니페스트

  • 서비스와 파드를 연결하는 방법
    • selector의 label과 일치하는 파드를 etcd로부터 선택
    • etcd는 master node에 관리에 필요한 정보를 저장하는 KVS
    • 라벨이 중복되면 다른 application에 요청이 전달될 수도 있으므로 중복되지 않도록 주의.
  • 서비스의 spec
    • type, ports, selector, sessionAffinity, clusterIP
  • 서비스 pod의 spec
    • port, name, protocol, nodePort, targetPort

 

실습

  • 서비스의 생성 & 기능 실습
// 샘플 코드
$ git clone https://github.com/Jpub/15_DandK
$ cd 15_DandK/step09

// 매니페스트 배포
$ kubectl apply -f deploy.yml
$ kubectl apply -f svc.yml

// 디플로이먼트와 서비스 상태 출력
$ kubectl get all

// clusterIP이므로 내부 접근을 위한 busybox 컨테이너 기동
$ kubectl run busybox --image=busybox --restart=Never --rm -it sh
/ # wget -q -O - http://web-service

// 서비스 파드에 자동으로 생성된 환경변수가 세팅되어 있다.
/ # env |grep WEB_SERVICE

 

  • 서비스의 생성 & 기능 실습 - 부하 분산 확인
// 부하분산 확인
$ kubectl exec pod/web-deploy-5c7bdc66d4-9d9nq -it sh
# cat /usr/share/nginx/html/index.html
# hostname
web-deploy-5c7bdc66d4-9d9nq

$ for pod in $(kubectl get pods |awk 'NR>1 {print $1}'|grep web-deploy); do kubectl exec $pod -- /bin/sh -c "hostname>/usr/share/nginx/html/index.html";done
$ kubectl run busybox --image=busybox --restart=Never --rm -it sh
/ # while true; do wget -q -O - http://web-service; sleep 1;done
web-deploy-5c7bdc66d4-npvkh
web-deploy-5c7bdc66d4-npvkh
web-deploy-5c7bdc66d4-9d9nq
web-deploy-5c7bdc66d4-jcp2l
web-deploy-5c7bdc66d4-jcp2l
web-deploy-5c7bdc66d4-jcp2l
web-deploy-5c7bdc66d4-9d9nq

 
 

  • 로드밸런서
// 디플로이먼트 매니페스트 & 로드밸런서
$ kubectl apply -f deploy.yml
$ kubectl apply -f svc-lb.yml

// 서비스 목록 표시 - 여기서 external IP 확인
$ kubectl get svc
NAME             TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
kubernetes       ClusterIP      10.103.224.1     <none>          443/TCP        65m
web-service-lb   LoadBalancer   10.103.233.251   34.64.227.245   80:31218/TCP   81s

// 로드밸런서 상세 표시
$ kubectl describe svc web-servic-lb

 

 


 

 3️⃣ 서비스

 

퍼시스턴트 볼륨이란?

k8s에 배포한 애플리케이션이 데이터를 보존하기 위해 이용하는 스토리지이다. (파드는 일시적인 존재이기 때문에 데이터를 영구저장 및 보존을 하기 위한 것이다.)
# 데이터 보존 # 퍼시스턴트 (종료가 되어도 데이터는 유지)
# 내부 또는 외부 스토리지의 볼륨을 컨테이너에서 마운트하여 사용

 

스토리지 종류와 클러스터 구성

  • 클러스터 내부 볼륨
    • emptyDir : 단일 노드에서 다른 파드에서 접근 불가. (파드의 lifecycl과 관련이 있어서 파드 종료 시 삭제. (임시저장))
    • hostPath : 단일 노드에서 다른 파드 간 접근은 가능하지만 멀티 노드에서 노드 간 접근이 불가. 노드 정지 시 데이터에 접근이 불가하다. (노드가 정지하면 데이터가 분실된다.)
    • → 해결방법 : 외부 스토리지 시스템을 사용한다.

 

  • 클러스터 외부 스토리지 시스템과 연동
    • 모든 노드에서 접근 가능 (하지만 어떤 외부 스토리지 시스템을 사용하느냐에 따라 동시에 공유가 불가능할 수도 있다.)
    • 노드가 정지해도 다른 노드에 파드를 재기동하여 애플리케이션 수행이 가능

스토리지의 추상화와 자동화

  • 퍼시스턴트 볼륨의 설정
    • PV : 퍼시스턴트 볼륨
    • PVC : 퍼시스턴트 볼륨 요구
  1. PVC를 작성한다.
  2. 파드의 매니페스트에 PVC의 이름을 기술한다.
  3. 컨테이너가 퍼시스턴트의 볼륨을 마운트한다.

 

  • 퍼시스턴트 볼륨 Spec - accessModes
    • ReadWriteOnce : 단일 노드에서 read와 write
    • ReadOnlyMany : 복수 노드에서 read
    • ReadWriteMany : 복수 노드의 read와 write

 
 

클라우드에서의 동적 프로비저닝

SCSI : 한 대의 컴퓨터에 여러 개의 하드디스크 드라이브를 연결하기 위한 기술 (케이블로 호스트 어댑터에 하드디스크를 연결한다.)
iSCSI : i는 IP 프로토콜을 의미. 즉, 네트워크를 통해서 특정 block stroage device에 접근하겠다는 의미. -> 물리적인 케이블 대신 IP 프로토콜을 사용한다. 하지만 복수의 노드에서 하나의 블록 스토리지 공유가 불가능하다. (ReadWriteMany X, ReadWriteOnce O)

 


REFERENCE

헬스 체크
https://velog.io/@holicme7/K8s-%ED%97%AC%EC%8A%A4-%EC%B2%B4%ED%81%AC

[K8s] 헬스 체크

쿠버네티스에는 파드가 정상인지를 판단하기 위한 헬스체크 기능이 있다.파드 내부 컨테이너에서 실행 중인 프로세스가 동작하고 있는지에 대한 헬스 체크는 쿠버네티스가 표준으로 하고 있으

velog.io