
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=<특정버전> 옵션을 사용하여 그 버전으로 롤백도 가능하다 .

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

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