我有一个通过第一个cmd创建的内部服务。然后,我在创建的服务上运行kubectl暴露。
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将为外部服务分配一个外部ip,我还需要传递一个附加标志吗?
答案 0 :(得分:2)
如果将类型字段设置为NodePort,则Kubernetes主节点将在--service-node-port-range标志指定的范围内分配端口(默认值:30000-32767),并且每个Node将代理该端口(每个节点上的端口号都相同)。
因此,Kubernetes将确保在托管此服务的所有节点上公开相同的端口号。在这种情况下,外部IP是节点的IP地址。
而Kubernetes则这样说External IPs:
如果有外部IP路由到一个或多个集群节点,则Kubernetes服务可以在这些外部IP上公开。使用服务端口上的外部IP(作为目标IP)进入群集的流量将被路由到服务端点之一。
externalIPs
不受Kubernetes的管理,由集群管理员负责。
NodePort
服务类型的缺点在于,就其本身而言,它不是可扩展的方法,并且缺乏服务可发现性。
如果您想通过单个IP地址向Kubernetes集群之外的使用者公开服务,则如果要部署公共云或混合云Kubernetes,则可能需要研究LoadBalancer
服务类型如果您有本地Kubernetes部署,则可能需要研究Ingress
。
答案 1 :(得分:0)
LoadBalacer
类型服务“分配”外部IP,但它是特定于云提供商的,因此将无法使用。除非您有一个指向群集的负载平衡器(当然是带有外部IP)。
在其他服务中,唯一的选择是NodePort
类型的服务,该服务会将您的pod端口映射到节点上的端口,因此可以从外部访问。丑陋的地方是它将要放在30021这样的端口上(介于30000-32767之间)。