[쿠버네티스] Deployment 이미지 업데이트 하기 & 롤백

app.js

const express = require('express');

const app = express();

app.get('/', (req, res) => {
  res.send(`
    <h1>Hello from this NodeJS app!</h1>
    <p>Try sending a request to /error and see what happens</p>
  `);
});

app.get('/error', (req, res) => {
  process.exit(1);
});

app.listen(8080);

원래 이렇게 되어있는 app.js 내용에 Helllo form this NodeJS app! 부분에 

const express = require('express');

const app = express();

app.get('/', (req, res) => {
  res.send(`
    <h1>Hello from this NodeJS app!?!?!!?!?!? </h1>
    <p>Try sending a request to /error and see what happens</p>
  `);
});

app.get('/error', (req, res) => {
  process.exit(1);  
});

app.listen(8080);

?!?!!?!?!? 이렇게 추가해서 저장을 할 것이다.

 

 

 


Dockerfile

FROM node:14-alpine

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

EXPOSE 8080

CMD [ "node", "app.js" ]

도커 파일은 이렇게 구성해놓고 빌드를 한다. 

빌드를 할 때에는 도커허브에 레포지토리 이름으로 처음부터 빌드하면 편하다.

docker build --platform=amd64 -t crowssnest/kube-first-app:2 .

***이미지를 다시 다운로드 하려면 쿠버네티스를 트리거 하기위해서 버전 태그 텍스트를 변경해야한다.

 

docker push crowssnest/kube-first-app:2

도커 푸쉬를 하고 도커허브에서 확인을 한다. Tag 2가 잘 올라왔는지 확인할 수 있다. 


deployment  업데이트

 

 

kubectl set image deployment/first-app kube-first-app=crowssnest/kube-first-app:2

deployment를 업뎃하기위해서 kubectl set image명령을 사용한다.

그리고 뒤에 deployment와 deployment 이름을 적어준다. kubectl get deployments 로 확인한 deployments의 이름은 first-app이다.

그리고 쿠버네티스에게 새로운 이미지가 무엇인지 알려야한다. 

minikube 대시보드에서 확인한 컨테이너 이름 뒤에 등호를 붙여서 이미지를 설정해준다.

 

 kubectl rollout status deployment/first-app

이렇게 현재 업데이트 상태를 볼 수 있다 .

minikube service first-app

위 명령을 입력해서 열린 주소에서 확인 해보았을때 변경사항이 반영된것을 볼 수 있다.


롤백 

kubectl set image deployment/first-app kube-first-app=crowssnest/kube-first-app:3

롤백의 시나리오를 만들기 위해 일부러 실패를 만들것이다.

그러기 위해서 일부러 존재하지 않는 이미지 태그를 지정해서 deployment의 이미지를 업데이트 할 것이다.

kubectl rollout status deployment/first-app

kubectl rollout status deployment/<deployment이름> 의 서식의 명령어로 롤아웃 진행 상황을 검사할 수 있다.

Waiting for deployment "first-app" rollout to finish: 1 old replicas are pending termination...
error: deployment "first-app" exceeded its progress deadline

이런 메세지가 뜨는데 오래된 레플리카, 현재 실행중인 파드를 종료한다는 말인데, 데드라인을 넘겨서 에러가 난 상황이다.

minikube dash보드를 확인해보면 파드에 이미지를 가져오는 문제가 생겼음을 알 수 있다. (당연하다 존재하지 않는 이미지니까!)

그리고 새 파드가 성공적으로 시작되지 않았기 때문에, 오래된 레플리카가 종료되지 않았다.

파드 정보를 가져와 보아도 이미지를 가져오지 못했다는 에러가 뜬다. 그러다가 시도를 중지한 것이다. 

kubectl rollout undo deployment/first-app

이 명령을 하면 최근의 deployment가 undo가 된다. 

그리고 다시 실행되고 있는 파드의 정보를 보면, 이미지를 가지고 오지 못했던 파드가 사라진것을 확인 할 수 있다 .

kubectl rollout status deployment/first-app

위 명령을 입력해서 성공인 상태로 돌아온 것을 확인할 수 있다!


그 외 rollout 명령어 옵션

kubectl rollout history deployment/first-app

직전이 아닌 그 이전의 상태로 돌아가려면 위 명령어를 통해서 deployment 히스토리를 살펴볼 수 있다.

kubectl rollout history deployment/first-app --revision=3

--revision 옵션을 사용하면 더 디테일을 얻을 수 있고, 이러한 리비전 식별자 중 하나를 사용하여 이미지를 포함한 정보를 확인 가능하다. (--revision=3)

 

 

kubectl rollout undo deployment/first-app --to-revision=1

그리고  undo deployment/<deployment이름> --to-revision=<특정버전> 옵션을 사용하여 그 버전으로 롤백도 가능하다 .

그러면 이렇게 돌아가던 어플리케이션에서 리프래쉬를 해주면 

처음버전으로 롤백한것을 볼 수 있다. 

JUNE .

20'S LIFE IN SYDNEY and BUSAN

    이미지 맵

    DevOps Study/Kubernetes 다른 글

    이전 글

    다음 글