프로그래밍/쿠버네티스

[쿠버네티스] 5. Deployment 업데이트

riroan 2023. 5. 6. 22:11

현재 배포중인 deployment에서 코드 변경등의 이유로 업데이트를 하고 싶을 수 있다. 어떻게 업데이트를 하는지 알아보자.

 

Deployment 업데이트

# main.py

from fastapi import FastAPI
import uvicorn

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello Wonderful World"}

if __name__ == "__main__":
    uvicorn.run(app, port=8000, host="0.0.0.0")

코드를 위와 같이 업데이트했다. 일단 업데이트했으니 이미지를 빌드해야한다.

docker build --tag riroan/myserver .
docker push riroan/myserver .

그 후 Deployment에 해당 이미지를 덮어써야한다.

kubectl set image deployment/server myserver=riroan/myserver

이제 Service를 통해 접속해보자.

???

??? 변하지 않았다?

그 이유는 이미지의 태그가 이전과 같기 때문이다. 그렇기 때문에 같은 이미지를 사용한다고 판단하여 새로운 이미지를 pull하여 적용한 것이 아니라 클러스터 내부에 존재하는 이미지를 적용한 것이다. (로컬에는 댕글링이미지도 생겼을것이다.) 이를 해결하기 위해 태그를 다르게 하여 적용하자.

docker build --tag riroan/myserver:0.1 .
docker push riroan/myserver:0.1 .
kubectl set image deployment/server myserver=riroan/myserver:0.1

그 후 deployment에 rollout을 해야 끝이 난다.

kubectl rollout status deployment/server

이제 업데이트됐다는 메시지와 함께 실제로 반영된 것을 확인할 수 있다.

또한 대시보드를 확인하면 새로운 이미지를 받은 것을 볼 수 있다.

Deployment 롤백

Deployment의 변경사항들을 확인하고 원하는 버전으로 되돌릴 수 있다.

예를들어 Deployment를 업데이트하는데 이미지를 잘못 입력했다고 하자.

kubectl set image deployment/server myserver=riroan/myserver:12345
kubectl rollout status deployment/server

riroan/myserver:12345 이미지는 존재하지 않는다.

이 상태로 무한대기상태에 빠진다. 대시보드에서 pod를 보면 이미지를 찾지 못해 에러가 났다는 내용을 볼 수 있다.

이러한 상황이 오면 deployment를 되돌려야한다. 그러기 위해서 롤백을 수행한다.

kubectl rollout undo deployment/server

정상적으로 돌아온 것을 확인할 수 있다.

 

Deployment history

Deployment가 어떻게 변화했는지 history를 출력할 수 있다.

kubectl rollout history riroan/server

총 3번의 변경이 있었고 상세 정보를 확인하려면 뒤에 --revision 옵션을 추가하여 확인한다.

우리가 처음 만든 pod 정보이다. riroan/myserver 이미지를 사용한 것을 확인할 수 있다. 위에서 롤백하기 위해 undo를 사용했는데 to-revision을 사용하면 해당하는 revision으로 롤백이 가능하다.

kubectl rollout undo deployment/server --to-revision=1

Hello World로 돌아온 것을 확인할 수 있다.