我有一个通过第一个cmd创建的内部服务。然后,我在创建的服务上运行kubectl expose。
kubectl -n XXX create -f service.yml
kubectl -n XXX get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
foo ClusterIP 10.152.183.41 <none> 8089/TCP
kubectl -n XXX expose service foo --type=NodePort --name=foo-ext
kubectl -n XXX get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
foo ClusterIP 10.152.183.41 <none> 8089/TCP 29m
foo-ext NodePort 10.152.183.177 <none> 8089:30406/TCP如果外部ip在哪里,我会认为kubectl expose会给外部服务分配一个外部ip,我需要传递一个额外的标志吗?
发布于 2018-06-29 03:04:38
根据Kubernetes docs的说法
如果您将类型字段设置为NodePort,Kubernetes主节点将从-- Service - Node - port -range标志(默认值为30000-32767)指定的范围中分配一个端口,并且每个节点将该端口(每个节点上的相同端口号)代理到您的服务中。
因此,Kubernetes将确保在托管此服务的所有节点上公开相同的端口号。在本例中,外部IP是节点的IP地址。
而库伯内斯对External IPs的评价是这样的
如果存在路由到一个或多个集群节点的外部If,则可以在这些外部If上公开Kubernetes服务。在服务端口上使用外部IP (作为目标IP)进入群集的流量将被路由到其中一个服务端点。
externalIPs不是由Kubernetes管理的,而是由集群管理员负责的。
NodePort类型的服务的缺点是,它本身不是一种可伸缩的方法,并且缺乏服务可发现性。
如果您想要通过单个IP地址将服务公开给Kubernetes集群之外的消费者,如果您有公共云或混合云Kubernetes部署,您可能想要查看LoadBalancer类型的服务,或者如果您有本地Kubernetes部署,您可能想要查看Ingress。
发布于 2018-06-29 03:38:22
LoadBalacer类型的服务“分配”了一个外部IP,但它是特定于云提供商的,所以它不起作用。除非您有一个指向集群的负载均衡器(当然是使用外部IP )。
在其他服务中,您唯一的选择是NodePort类型的服务,它会将您的pod端口映射到节点上的端口,因此可以从外部世界访问它。丑陋的部分是它将在一个类似30021的端口上(在30000-32767之间)。
https://stackoverflow.com/questions/51088532
复制相似问题