NodePort与kube-apiserver的hostPort

时间:2020-09-14 08:05:45

标签: kubernetes kube-apiserver service-node-port-range

我有一个健康的k8s集群。 kube-apiserver正在使用端口 8443 。 然后我做下面的事情。我也创建/编辑服务,并分配一个固定的nodePort 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命令才能将nodePort改回来。但是我不能使用kubectl。它成为死循环。我有两个问题。

  1. 我该怎么做才能恢复我的k8s集群?
  2. 为什么kube-apiserver或其他组件不会阻止我将nodePort更改为 8443 ?指示端口 8443 已被使用。

2 个答案:

答案 0 :(得分:0)

kube-apiserver容器是kubelet在主节点上使用/etc/kubernetes/manifests/kube-apiserver.yaml文件启动的静态容器

因此您可以编辑/etc/kubernetes/manifests/kube-apiserver.yaml, 其中引用了8443端口并将其更改为未使用的端口。这样kube-apiserver将在该端口上可用。理想情况下,kubelet会在清单文件更改时尝试重新启动静态pod。

您需要编辑〜/ .kube / config,其中“服务器”地址需要更改为新端口。

删除有问题的节点端口服务。

将/etc/kubernetes/manifests/kube-apiserver.yaml和.kube / config文件中的更改还原到原始端口(8443)

答案 1 :(得分:0)

当端口范围设置为默认service-node-port-range api-server flag时,这是不可能的。

-service-node-port-range portRange默认值:30000-32767
保留给具有NodePort可见性的服务的端口范围。例如:“ 30000-32767”。包含范围的两端。


我该怎么做才能恢复我的k8s集群?

您可以更改/etc/kubernetes/manifests/kube-apiserver.yaml文件,并将8443的所有出现位置替换为例如6443

然后使用以下命令连接到apiserver:

$ kubectl --server https://<ip>:6443 ...

删除my-service服务,并将kube-apiserver.yaml文件恢复为以前的格式。


为什么kube-apiserver或其他组件不会阻止我将nodePort更改为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 github存储库上询问k8s开发人员。只是open an issue,这里就是这个问题。

相关问题