Kubernetes服务未分配(外部)IP地址

7
在SO上有许多类似问题的答案,它们都展示了我期望的部署方式,但我的部署并非如此。
  • 我正在Windows 10上运行Minikube 0.25,Kubernetes 1.9。
  • 我已成功创建了一个节点、一个复制控制器,并且单个Pod模板已经被复制了10次。
  • 该节点是Minikube,并分配了IP地址10.49.106.251。
  • 仪表板可在10.49.106.251:30000处获得。

我使用YAML文件部署服务,但该服务从未被分配外部IP - 如果我使用kubectl expose也会得到相同的结果。

我使用的YAML文件:

kind: Service
apiVersion: v1
metadata:
  name: hello-service
spec:
  type: NodePort
  selector:
    app: hello-world
  ports:
  - protocol: TCP
    port: 8080

我可以使用YAML文件来分配外部IP - 我将其分配为与节点IP地址相同的值。但无论哪种方法都导致无法连接到服务。我还应指出,10个复制的pod均匹配选择器。
运行kubectl get svc命令的结果如下:默认情况下,在更新外部IP后:
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
hello-service   NodePort    10.108.61.233   <none>          8080:32406/TCP   1m
hello-service   NodePort    10.108.61.233   10.49.106.251   8080:32406/TCP   1m

我一直在跟随的教程和其他SO上的答案显示了类似于以下结果:

hello-service   NodePort    10.108.61.233   <nodes>   8080:32406/TCP   1m

区别在于外部IP设置为<nodes>

我在本地运行时遇到了许多问题 - 这只是另一种情况吗,还是有其他人已经找到了解决外部IP分配问题的方法?


你是在看哪个教程?能否分享一下链接? - Aryak Sengupta
你解决了这个问题吗?我也遇到了同样的情况。 - Kundan
很遗憾,我没有。实际上,我已经转而做其他事情,并避开了k8s…… - Jono Stewart
3个回答

4

为了本地开发目的,我也遇到了将本地开发集群暴露为“公共IP”的问题。 幸运的是,我找到了一个能够帮助我的kubectl命令:

kubectl port-forward service/service-name 9092

9092是需要暴露的容器端口,以便我可以在本地开发环境中访问集群内的应用程序。

需要注意的是,这不是一个“生产级”解决方案。它作为一种临时的hack,可以很好地让您进入集群内部。


2
使用NodePort意味着它将在您的集群所有节点上打开一个端口。 在上面的示例中,暴露给外部世界的端口是32406。 为了访问hello-service(如果是http),它将是http://[节点IP]:32406/。 这将击中您的minikube,请求将以轮询方式路由到您的pod。

是的,这是它应该做的事情,但实际上并没有。它在节点IP的那个端口上不可访问。您可以在我上面发布的行中看到这一点……该服务还正确映射到适当的内部端口。 - Jono Stewart
2
你能发布你的部署清单吗?很多时候,部署标签与服务选择器不匹配。我曾经被这个问题困扰过几次。 - Baltazar Chua
这不是问题 - 我可以进入仪表板并正确地查看服务下的Pod,这意味着标签已经匹配。 - Jono Stewart
@BaltazarChua 您的评论帮助我节省了几个小时。您可能认为 Kubernetes 会为这样的无模式YAML文件提供错误/警告信息。 - deluged.oblivion

1

在尝试使用Kubernetes v1.9.2在本地部署简单的helloworld镜像时遇到了相同的问题。
经过两周的尝试,似乎Kubernetes将所有nginx web服务器应用程序内部公开在端口80而不是8080上。
因此,这应该可以工作:kubectl expose deployment hello-service --type=NodePort --port=80


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接