본문 바로가기
자바 , 기타 공부/클라우드 공부

배포 실습/ 쿠버네티스를 활용한 배포

by 임지혁코딩 2024. 2. 4.

 

DockerHub에서 img파일을 가져와서 , 이를 다시 배포하는 실습을 진행하자. 

 

방금 전 받아왔던 release 0에 대해 queue를 추가하는 내용을 실습해보자. 

 

1. POD 정보 추가 

한 YAML파일에 정리한 이유는, 이 POD 들이 같은 K8S 클러스터에서 작동됨을 표현하기 위해서이다.

 

2. SERVICE 작성

 

동일하며, nodePort만 변경하였다. 

 

 

kubectl apply -f . 로 모든 yaml파일을 적용시켰으며, 잘 동작한다.

 

 

<동일한 문제 발생>

현재 30010으로 localhost로 접근하면 불가능해서, 자체적으로 포트포워딩을해서 동작시키고 있다.

해당 문제가 service를 사용하고는 있지만 내부 port 포워딩 까진 되지 않으므로.. 고민이 필요하다. 

 

 

 

포트포워딩을 하지 않아도 원래의 service의 목적대로 30010으로의 접근이 바로 8161포트로 

이동하는 방법을 고민해봐야할 것 같다.

 

주로, 배포는 레플리카 형태를 활용했다.

배포의 핵심: 가동 중지 시간 없이 업데이트가 가능하다. 

 

이를 위해 Deployment를 활용한 형태를, 연습해 보자! 이는 앞선 post인 레플리카와 굉장히 유사한 yaml을 사용한다. 

 

dealon25@DESKTOP-38S9KI1:~$ kubectl delete rs webapp
replicaset.apps "webapp" deleted

 

레플리카를 가볍게 삭제해주자. 

 

kind를 변경해주고, (replicates는 2를 유지했다.)

 

 

이렇게 변경된 형태를 보자. (굉장히 복잡해졌다) 

 

deployments->replicaset생성->replicates에 맞추어 pods를 생성한다.

그 과정에서 replicaset를 무작위로 생성하는 것이다. 

 

<롤링 배포가 가능한 이유?>

deployment에서 사용중인 img를 변경 -> 새로운 replicaset를 실행하고 -> 새로운 podv2가 실행된다.

이떄, 기억해야 할 것은 이전 img(V1) 레플리카가 아직 존재한다는 것이다. (replicas는 0이된다)

 

<롤링 배포 실습> 

핵심은, 컨테이너 img를 활용한다는 것. 

minReadySeconds는, 새로운 값을 적용시키는데에 걸리는 시간(새로고침시간)

 

이 구조를 보면 된다.

가장 처음에는 첫번째 replicaset에서 2개를 동작시키고 있었으나, 

그 중간에 img파일을 변경하였다. 
그랬더니 새로운 replicaset에서 2개의 new ver img pod를 2개 생성하고, 기존 replicaset은 종료되는 과정을 볼 수 있다. 

 

이 방식은 현명하나, 이전 버전으로 돌아갈때도 img를 계속해서 바꿔줘야 하는 문제가 있다.

 

주로 해당 방식을 활용한다. 

 

깃허브나 , db의 트랜잭션처럼, 변경하고 undo(rollback)등이 가능하다. 

 

그 과정에서 replicaset을 생성할 필요없을때는 자동으로 돌아가고, 이런 현명한 과정을 진행한다. 

img파일이 망가진 반영사항은, ready만 되고 적용되지 않을만큼 현명하다. 

(해당 status를 imagepullbackoff라고 한다)

 

*주의

마치 git처럼, 이전에는 release0에 readysecond가 5였는데 이번엔 release0/readysecond50시 

오류가 발생한다. 

 

 

 

(고쳐야 할점)

 

아직도.. port forwarding이 필요하다. 이를 사용하지 않는 방법을 고민해보자.  

 

 

<문제 해결> 

    spec:
      containers:
        - name : webapp
          image: richardchesterwood/k8s-fleetman-webapp-angular:release0
          ports:
          - containerPort: 80

 

pod까지는 container가 잘 mapping 해줬지만, container까지 mapping해주지 못해서 생긴 문제였다. 
해결 !