Конфликты портов узлов с портом хоста сервера kube-apiserver

#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 вопроса.

  1. Что я могу сделать, чтобы вернуть свой кластер k8s?
  2. Почему 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. Просто откройте проблему и, поскольку этот вопрос существует.