Поды EKS с эфемерным хранилищем постоянно выселяются
Я работаю над EKS v1.20.11-eks-f17b81 и столкнулся с проблемой с Java-контейнером на основе Alpine. По сути, мое развертывание имеет ограничения на эфемерное хранилище для запросов, а также такие ограничения.
- containerPort: 8080
protocol: TCP
resources:
limits:
cpu: 2048m
ephemeral-storage: 1300Mi
memory: 4096M
requests:
cpu: 500m
memory: 1024M
ephemeral-storage: 1000Mi
Все модули через несколько часов перейдут в состояние «Выселено», и я не могу понять, почему. Если я посмотрю на папку /var/lib на узлах, там будет достаточно места, а если я пойду к какому-то поду с kubectl exec -ti POD --sh и я делаю что-то вроде du -sch / я никогда не находил использованного более 300 МБ, что может случиться?.
1 ответ
TLDR: либо не используйте ограничения вообще, либо используйте их для всех контейнеров в модуле.
Я думаю, у тебя нетephemeral-storage
ограничения, установленные для всех контейнеров в этом конкретном модуле. Менеджер выселения суммирует все лимиты контейнеров и устанавливает его как верхний предел на уровне модуля .
Это фактический фрагмент кода:
func (m *managerImpl) localStorageEviction(pods []*v1.Pod, statsFunc statsFunc) []*v1.Pod {
evicted := []*v1.Pod{}
for _, pod := range pods {
podStats, ok := statsFunc(pod)
if !ok {
continue
}
if m.emptyDirLimitEviction(podStats, pod) {
evicted = append(evicted, pod)
continue
}
if m.podEphemeralStorageLimitEviction(podStats, pod) {
evicted = append(evicted, pod)
continue
}
if m.containerEphemeralStorageLimitEviction(podStats, pod) {
evicted = append(evicted, pod)
}
}
return evicted
}
Как вы можете видеть, обаpodEphemeralStorageLimitEviction
иcontainerEphemeralStorageLimitEviction
используются для выселения. На момент написания я не понимаю, «почему» используются оба (а не только контейнер).