Search

OS Upgrade

Created
2023/10/22 01:35
Tags
k8s
CKA
Mumshad Mannambeth
Cluster Maintenance

1) About

Pod가 어떤 노드에서 실행되고 있는지는 생각보다 중요
Pod가 1개만 있거나 여러 Pod가 한 노드에 몰려 있다면, 해당 노드가 다운되었을 때 서비스의 장애로 이어짐
만일 노드가 다운되었다가 다시 온라인이 되면 Kubelet에 의해 원래 동작을 이어갈 수 있게 처리되는데, 만일 5분 넘게 해당 노드가 복구되지 않는다면 해당 노드에 있던 Pod들은 종료됨
** Replica Set으로 설정된 Pod들은 Pod의 종료 상태가 지정됨에 따라 자동으로 다른 노드에서 실행 되지만, 단일 Pod로 운용하고 있었다면 해당 노드는 별도의 복구가 이뤄지지 않음
** 5분이라는 시간을 확인하는 주체는 마스터 노드
** 위의 5분이라는 값은 kube-controller-manager 설정 값으로 변경할 수 있는데, --pod-eviction-manager라는 필드에 옵션에 해당됨

2) Drain

노드 상에서 진행해야하는 작업이 있다고 가정
해당 작업이 다운 타임을 갖는다고 했을 때 다운 타임이 5분 내로 끝나면 다행이지만, 그렇지 않으면 Replica Set으로 지정되지 않은 Pod들은 상태 이상에 빠지게 됨
이 때 Replica Set으로 지정한 Pod들 중에서 상태 이상 노드에 배치된 Pod들도 5분 간은 상태 이상에 빠지게 되는데, 운이 좋지 않으면 모든 Pod가 한 노드에 몰려 있어서 장애로 이어질 수도 있음
어떠한 형식으로든 노드의 다운 타임으로 Pod의 상태 이상이 발생하지 않도록 만드는 것이 중요
Kubernetes는 Drain이라는 기능을 이용하여, 노드의 다운 타임을 만드는 작업을 수행하기 전에 노드 내의 Pod들을 다른 노드로 배치될 수 있도록 쫓아낼 수 있음
추가적으로, 새롭게 생성되는 Pod들도 해당 노드에 스케줄링 되면 안 되기 때문에 스케줄링을 막도록 설정됨
** 형식상 쫓아내는 것처럼 보이는 것이지만, 정확히 는 Pod의 상태를 종료로 만드는 것이므로 단일 운용 Pod에 대해서 주의해야함
** Replica Set 등 Controller가 함께 사용되는 객체면 문제 없이 다른 노드로 배정되겠지만, 단일 운용 Pod는 그렇지 않기 때문에 Drain을 강제로 수행하지 않는 이상 동작하지 않음
다운 타임을 만들 노드의 재부팅이 이뤄졌을 때, 다시 노드의 상태가 온라인이 되어도 Pod가 스케줄링 되지 않는 것을 볼 수 있음
이는 Drain을 수행할 때 스케줄링을 막아놓은 상태이 기 때문인데, Uncordon을 수행하여 다시 스케줄링이 되도록 만들 수 있음
** Cordon은 스케줄링이 되지 않도록 막는 기능인 데, Drain과 달리 Pod를 종료시키진 않음

3) Command

kubectl drain ${NODE}
노드에 배치된 Pod들을 종료 상태로 만들고, 스케줄링이 되지 않도록 막음
** Daemon Set이 떠있는 경우 경고가 발생할 수 있는데, kubectl drain ${NODE} —ignore-daemonsets 명령어로 Daemon Set에 대해선 해당 작업을 무시하도록 만들 수 있음
** Controller가 함께 이용되는 객체가 아닌, 단일 운용 Pod가 존재하면 강제하지 않는 이상 해당 명령어가 동작하지 않음
kubectl cordon ${NODE}
노드에 스케줄링이 되지 않도록 막음
kubectl uncordon ${NODE}
노드에 스케줄링이 가능하도록 만듦