tl; dr Основная проблема, кажется, заключается в том, что resources.requests.cpu
установлен точно на 1000m
.
Я написал простое приложение Java, которое выводит доступное количество процессоров:
public class CpuTest {
public static void main(String[] args) {
System.out.println("Number of CPUs = " + Runtime.getRuntime().availableProcessors());
}
}
Я упаковал в Dockerfile и создал простое развертывание:
apiVersion: apps/v1
kind: Deployment
metadata:
name: cputest
labels:
app: cputest
spec:
replicas: 1
selector:
matchLabels:
app: cputest
template:
metadata:
labels:
app: cputest
spec:
containers:
- name: cputest
image: dev/cputest:latest
imagePullPolicy: Never
Я запустил это на своей локальной машине RedHat 7, которая имеет 24 ядра. Ожидаемый результат:
Number of CPUs = 24
Затем я применил к развертыванию различные запросы ресурсов ЦП:
resources:
requests:
cpu: 1000m
и повторно развернул. Результаты были интересны:
- Запрос ЦП установлен на 500 м: приложение сообщает 1 ЦП
- Запрос ЦП установлен на 1000 м: приложение сообщает 24 ЦП <== </li>
- Запрос ЦП установлен на 1001 м: приложение сообщает 2 ЦП
- Запрос ЦП установлен на 2000 м: приложение сообщает 2 ЦП
- Запрос ЦП установлен на 4000 м: приложение сообщает4 CPU
Таким образом, проблема возникает только тогда, когда запрос CPU установлен 1000m
(также попытался 1
и получил тот же результат, когда он думает, что имеет все 24 процессора).
Я вернулся и посмотрел на все наши приложения. Конечно же, те, в которых мы устанавливаем запрос ЦП равным 1000m
, имеют проблему. Любое другое значение работает, как и ожидалось.
Интересно, что когда я также устанавливаю ограничение ЦП на 1000m
, проблема исчезает, и JVM сообщает о 1 ЦП.
Вполне возможно, этоожидается, и я не до конца понимаю, как ресурсы и ограничения ЦП используются Kubernetes, или, возможно, проблема с версией, с которой мы работаем (1.12.7).
В любом случае, по крайней мере, у меня есть ответпочему некоторые наши модули видят разные процессоры.