'데이터 엔지니어'로 성장하기

정리하는 걸 좋아하고, 남이 읽으면 더 좋아함

기타/K8S

Slipp) K8S 스터디4주차_디플로이먼트, 서비스, 잡 :: mightytedkim

MightyTedKim 2021. 9. 20. 12:03
728x90
반응형

 

이번 스터디 주제는 디플로이먼트와 서비스입니다

(책은 15단계로 배우는 도커와 쿠버네티스, 깔끔하고 눈으로만 봐도 될정도로 과정을 다 기록해줌)

 

요약

1. pod는 일시적인 존재라 없어질 수 있기 때문에 관리해줄 친구들이 필요해요

2.  그 방법이 오늘 정리할 deployment service, job 입니다.

- deployment는 파드의 개수를 관리해줘요

- service는 IP를 관리해줘요

- job 은 실행하고 종료하는 역할을 해요

 


1. Deployment

요청한 개수만큼 파드를 기동하여, 장애 등의 이유로 파드의 개수가 줄어들면 새롭게 파드를 만들어 기동한다.

- replicaset 과 함께 동작한다.

 

주요 명령어

replicas : 파드 템플릿을 기동할 파드의 개수를 지정

selector : 레플리카셋과 파드를 대응 (matchlabels>app: aaaa)

template : (metatada>app: aaaa)

 - pod의 메타데이터와 spec 부분이 일치해야함

 

1. 스케일

레플리카의 값을 변경해서 개수를 늘림

클러스터의 cpu/메모리가 부족해지면 프드 생성이 보류됨

방법은 2가지가 있음

  * deplyment.yml

spec:
  replicas: 3 -> 5

 * kubectl scale

kubectl scale --replicas=3 rs/foo                                 # Scale a replicaset named 'foo' to 3
kubectl scale --replicas=3 -f foo.yaml                            # Scale a resource specified in "foo.yaml" to 3
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql  # If the deployment named mysql's current size is 2, scale mysql to 3
kubectl scale --replicas=5 rc/foo rc/bar rc/baz                   # Scale multiple replication controllers

2. 롤아웃

컨테이너 업데이트 (yml 수정해서 한 번더 apply 하는 것)

- 작업을 진행할 수 있도록, 일정 개수만큼만 업데이트 진행할 수 있음

처음에는 containerCreating이 나오다가, Running 중이던 pod를 Terminiating 하며 고체한다.

RollingUpdateStrategy:  25% max unavailable, 25% max surge

 - 최대 25%파드를 정지할 수 있고 ,최대 25%만 초과할 수 있다.

 

예시) replcias: 5 일 경우, nginx의 이미지만 1.16에서 1.17로 변경

   -> 최소 4개의 파드를 유지하고, 최대 7개의 파드가 되도록 점진적 롤아웃 진행

      - 최소 파드 : 5 * 0.75 = 3.75 -> 4 (최소 running)

      - 초과 파드 : 5 * 1.25 = 6.25 -> 7  (최대 runnging + creating + terminating)

롤 아웃에 의해 종료될 때는 SIGTERM이 전송되고 30초 후에 강제 종료됨

3. 롤백 

SQL의 롤백처럼, 롤아웃 전에 사용하던 예전 컨테이너로 돌아가는법

$ kubectl rollout undo deployment web-deploy

4. 자동복구

노드 수준에서 장애가 발행했을 대 파드를 복구하는 기능

 

node1,2에서 pod가 실행되고 있는데, node2를 죽이면

deployment가 있는 경우 ip그대로 node1에 복구가되지만

deployment 없이 생성된 pod는 그대로 사라진다.

 

+ kubectl get events | grep web-deploy

+ kubectl logs [파드명]

+ kubectl describe po [파드명]

+ kubectl exec -it [파드명]


2. 서비스

서비스는 IP를 관리하는 타입으로 4가지 종류가 있어요

  1. ClusterIP : 내부의 파드 -> 서비스의 이름으로 접근
  2. NodePort : 외부 -> 노드의 IP 주소와 포트번호로 접근
  3. LoadBalancer : 외부 -> 대표IP주소로 접근
  4. ExternalName : 외부 IP 주소에 서비스 이름으로 접근
더보기

## 서비스
apiVersion: v1
kind: Service
metadata:
  name: web-service # 내부 DNS에 저장되며, IP연계에 사용
spec:                 # type을 생략하여 ClusterIP가 적용된다.

  selector:           # service - 백엔드 pod와 연결
    app: web
  ports:
  - protocol: TCP
    port: 80

Default : ClusterIP

> clusterIp 주소: 파드 집합을 대표하는 IP 주소

   파드 내부에서 통신할 때 kubectl get pode -o wide 의 IP로 통신 가능함

clusterIP: None

  • 헤드리스 설정으로  서비스가 동작 -> 대표 IP 주소 획득 X, 부하 분산도 X

서비스 타입 : NodePort

> clusterIP + NodePort

   외부에서 접근할 때 필요함

노드 IP에고 공개 Port 할당됨 (30000 ~ 32767)

사용 중인 포트를 설정하면 manifest 배포 과정에서 실패

노드가 셧다운되면 서비스 이용 못할 수 있음

* m1 에서 nodeport 가 작동안되서, tunneling으로 동작을 확인했어요

더보기

m1에서 안됨 (arm은 virtualbox 지원안해서 그런듯)

➜  step09 git:(master) ✗ minikube start --memory=4096 --driver=virtualbox
😄  Darwin 11.3.1 (arm64) 의 minikube v1.23.0
✨  유저 환경 설정 정보에 기반하여 virtualbox 드라이버를 사용하는 중

❌  Exiting due to DRV_UNSUPPORTED_OS: The driver 'virtualbox' is not supported on darwin/arm64

 

---------------------------------------------------------------------------------------------------------

 

차선책으로 tunneling 해야함

➜  ~ minikube  service web-service-np --url
🏃  web-service-np 서비스의 터널을 시작하는 중
|-----------|----------------|-------------|------------------------|
| NAMESPACE |      NAME      | TARGET PORT |          URL           |
|-----------|----------------|-------------|------------------------|
| default   | web-service-np |             | http://127.0.0.1:53525 |
|-----------|----------------|-------------|------------------------|
http://127.0.0.1:53525
❗  Because you are using a Docker driver on darwin, the terminal needs to be open to run it.
c^C✋  Stopping tunnel for service web-service-np.

(다른 터미널에서)

➜  step09 git:(master) ✗ curl localhost:53525
<!DOCTYPE html>
<html>
<head>

서비스 타입 : LoadBalancer

> clusterIP + NodePort

  nodeport를 사용하기 때문에 자연스럽게 clusterIp도 사용

- 로드밸랜서와 연동이 됨 퍼블릭 클라우드

서비스 타입 : ExternalName

> 파드에서 외부의 엔드포인트에 접속하기 위한 방법

  외부 DNS 이름의 매핑을 내부 DNS에 설정

* m1에서는 외부 DNS는 되지만, 내부 DNS는 설정이 안되는 것 같아요


잡과 크론잡

> pod의 status가 completed 나와도 문제가 있을 수 있다. -> k describe job, k logs [pod] 로 확인 필요

 

> 지정한 실행횟수와 병행 개수에 따라 한 개 이상의 파드를 실행

 - 활용 예

   1) 동시 실행과 순차 실행 -> parallelism 

   2) 파드를 실행할 노드 선택 -> GPU, CPU 등 특정 목적

   3) 온라인 배치 처리 요청 -> 메시지 브로커를 예시로 듦

   4) 정기 실행 배치 처리  -> 가장 일반적인 것

 

 

크론잡

> 크론으로 반복하는 잡

 - 종료된 파드는 가비지 수집 컨트롤러가 삭제

 

 

잡부분이 생각보다 복잡했는데, 실제 사용을 해봐야 와닿을 것 같아요.

다음 스터디는 아마 StorageStatefulset 에 대해 공부할 것 같아요

728x90
반응형