#kubernetes #kube-apiserver #service-node-port-range
#kubernetes #сервер kube-apiserver #сервис-узел-диапазон портов
Вопрос:
У меня исправный кластер k8s. Сервер kube-apiserver использует порт 8443. Затем я делаю что-то вроде приведенного ниже. Я создаю / редактирую сервис и также назначаю фиксированный порт узла 8443.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
nodePort: 8443
Кластер становится недоступным. Если я выполню команду kubectl get pods
. Он возвращает Unable to connect to the server: EOF
Потому что мне нужно запустить команду kubectl, чтобы изменить порт узла обратно. Но я не могу использовать kubectl. Это становится мертвым циклом. У меня есть 2 вопроса.
- Что я могу сделать, чтобы вернуть свой кластер k8s?
- Почему kube-apiserver или другие компоненты не мешают мне изменить порт узла на 8443? Укажите, что порт 8443 уже используется.
Комментарии:
1. Создание службы должно завершиться неудачей, если порт используется (см. Документы API . Если этого не произойдет, вы можете открыть проблему на GitHub. Хотя я думаю, что сервер api обычно использует порт 6443.
2. Возможно, вы сможете напрямую общаться с etcd, не используя kubectl (см. Документы etcd )
Ответ №1:
модуль kube-apiserver — это статический модуль, созданный kubelet с использованием файла /etc/kubernetes/manifests/kube-apiserver.yaml на главных узлах
таким образом, вы можете отредактировать /etc /kubernetes/manifests/kube-apiserver.yaml, где указан порт 8443, и изменить его на неиспользуемый порт. так что сервер kube-apiserver будет доступен на этом порту. в идеале kubelet пытается перезапустить статический модуль при изменении его файла манифеста.
вам нужно отредактировать ~/.kube/config , где адрес «сервера» должен быть изменен на новый порт.
удалите проблемную службу порта узла.
отмените свои изменения в файле /etc/kubernetes/manifests/kube-apiserver.yaml amp; .kube/config, чтобы вернуться к исходному порту (8443)
Ответ №2:
Это должно быть невозможно, если диапазон портов задан с service-node-port-range
флагом API-сервера по умолчанию.
—Диапазон портов узла службы По умолчанию: 30000-32767
Диапазон портов для резервирования для служб с видимостью порта узла. Пример: ‘30000-32767’. Включительно на обоих концах диапазона.
Что я могу сделать, чтобы вернуть свой кластер k8s?
Вы можете изменить /etc/kubernetes/manifests/kube-apiserver.yaml
файл и заменить все вхождения 8443
на, например, 6443
.
Затем подключитесь к серверу apiserver с:
$ kubectl --server https://<ip>:6443 ...
Удалите my-service
службу и восстановите файл kube-apiserver.yaml в его предыдущей форме.
Почему kube-apiserver или другие компоненты не мешают мне изменить порт узла на 8443? Укажите, что порт 8443 уже используется.
Я не думаю, что многие люди сталкиваются с этой проблемой, потому что люди обычно используют api-сервер со значениями по умолчанию --service-node-port-range
флага, который является: 30000-32767
. В таком случае вы увидите эту ошибку:
The Service "my-service" is invalid: spec.ports[0].nodePort: Invalid value: 8443: provided port is not in the valid range. The range of valid ports is 30000-32767
Вероятно, лучшее, что вы можете с этим сделать, это спросить разработчиков k8s о репозитории k8s github. Просто откройте проблему и, поскольку этот вопрос существует.