Scaling
쿠버네티스는 파드의 개수를 늘려 자동으로 로드밸런싱을 하는 scaling 기능을 제공한다. 이 기능을 한번 사용해보자.
# main.py
from fastapi import FastAPI
import uvicorn
import socket
app = FastAPI()
@app.get("/")
async def root():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('pwnbit.kr', 443))
ipaddr = sock.getsockname()[0]
return {"message": "Hello Wonderful World", "ipaddr": ipaddr}
if __name__ == "__main__":
uvicorn.run(app, port=8000, host="0.0.0.0")
우선 스케일링된 파드에 로드밸런싱이 적용되는지 확인하기 위해 내부 ip주소를 확인하는 코드를 넣었다. 코드가 바뀌었으니 deployment를 업데이트하자.
docker build --tag riroan/myserver:0.2 .
docker push riroan/myserver:0.2
kubectl set image deployment/server myserver=riroan/myserver:0.2
kubectl rollout status deployment/server
이제 service가 나타내는 주소를 접속하면 내부 ip주소도 반환할 것이다. 그럼 이제 본격적으로 scaling을 하자.
kubectl scale deployment/server --replicas=5
이 한줄이면 scaling이 끝난다. server pod를 5개로 늘린다는 뜻이다. 대시보드에서 증가한 pod를 확인해보자.
정상적으로 생성된 것을 확인할 수 있다.
각 파드는 ip주소가 모두 다르다. Service가 정상적으로 Loadbalancing을 해준다면 접속할때마다 ip가 다르게 출력될 것이다. 실제로 그런지 확인해보자.
# test.py
import requests
for i in range(10):
res = requests.get("http://192.168.49.2:30187").json() # 포트는 다를 수 있음
print(f"{i}번째 요청 -> {res['ipaddr']}")
정상적으로 로드밸런싱이 된 것을 확인할 수 있다.
Self-healing
쿠버네티스의 또 다른 핵심 기능은 self-healing이다. 이는 pod가 어떠한 이유로 종료되면 자동으로 되살리는 기능이다. 이 기능은 기본으로 제공하기때문에 따로 설정은 안해도 되고 실제로 적용되는지 확인해보자.
# main.py
import time
if __name__ == "__main__":
time.sleep(5)
assert 0
main.py 파일을 위와 같이 수정하고 deployment를 업데이트한다. 이제 꽤 숙련됐을것이다.
docker build --tag riroan/myserver:0.3 .
docker push riroan/myserver:0.3
kubectl set image deployment/server myserver=riroan/myserver:0.3
kubectl rollout status deployment/server
이제 파드의 상태를 확인해보자.
정상적으로 running하다가 assert때문에 Error가 난 것을 알 수 있다. 하지만 쿠버네티스는 이렇게 Error가 나면 자동으로 복구를 시도한다.
자동으로 회복하여 Running상태로 돌아온 것을 알 수 있다. RESTARTS는 이 방식으로 재시작한 횟수이다. 단순히 실패하는 컨테이너가 있을 수 있기 때문에 무한루프를 방지하기 위해 재시작할때마다 걸리는 시간이 길어진다.
현재 5초마다 에러를 일으키는 코드이므로 deployment를 이렇게 두기엔 기분이 안좋으니 rollback하자.
kubectl rollout undo deployment/server --to-revision=8
각자 history를 확인하고 밑에서 두 번째에 있는 deployment로 되돌리면 된다.
'프로그래밍 > 쿠버네티스' 카테고리의 다른 글
[쿠버네티스] 8. EKS 무작정 사용하기 (1) (0) | 2023.07.09 |
---|---|
[쿠버네티스] 7. 파일로 쿠버네티스 사용하기 (0) | 2023.05.07 |
[쿠버네티스] 5. Deployment 업데이트 (0) | 2023.05.06 |
[쿠버네티스] 4. Service (0) | 2023.05.06 |
[쿠버네티스] 3. 쿠버네티스 구성요소 (0) | 2023.05.06 |