2

我有一个健康的 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。它变成了一个死循环。我有 2 个问题。

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

2 回答 2

1

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

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

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

删除有问题的 nodeport 服务。

恢复您在 /etc/kubernetes/manifests/kube-apiserver.yaml 和 .kube/config 文件中的更改以返回原始端口 (8443)

于 2020-09-14T09:31:52.277 回答
0

service-node-port-range 当端口范围设置为默认api-server 标志时,它应该是不可能的。

--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 已在使用中。

我不认为很多人会遇到这个问题,因为人们通常使用带有默认值--service-node-port-rangeflag 的 api-server,即: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 repo 上询问 k8s 开发人员。只需打开一个问题,并作为这个问题。

于 2020-09-15T08:33:46.620 回答