首页 > 解决方案 > NodePort 与 kube-apiserver 的 hostPort 冲突

问题描述

我有一个健康的 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已在使用中。

标签: kuberneteskube-apiserverservice-node-port-range

解决方案


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)


推荐阅读