【问题标题】:Kubernetes expose a service does not assign the external ipKubernetes暴露一个服务没有分配外部ip
【发布时间】:2018-06-29 03:45:16
【问题描述】:

我有一个通过第一个 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,我需要传递一个额外的标志吗?

【问题讨论】:

    标签: kubernetes kubectl


    【解决方案1】:

    根据Kubernetes docs

    如果您将 type 字段设置为 NodePort,Kubernetes master 将从 --service-node-port-range 标志指定的范围内分配一个端口(默认值:30000-32767),每个节点将代理该端口(每个节点上的相同端口号)到您的服务中。

    因此,Kubernetes 将确保在托管此服务的所有节点上公开相同的端口号。在这种情况下,外部 IP 是节点的 IP 地址。

    而 Kubernetes 是这么说的 External IPs:

    如果有路由到一个或多个集群节点的外部 IP,Kubernetes 服务可以在这些外部 IP 上公开。在服务端口上使用外部 IP(作为目标 IP)进入集群的流量将被路由到服务端点之一。 externalIPs 不由 Kubernetes 管理,由集群管理员负责。

    NodePort 服务类型的缺点是,它本身不是一种可扩展的方法并且缺乏服务可发现性。

    如果您想通过单个 IP 地址向 Kubernetes 集群外的消费者公开服务,如果有公共云或混合云 Kubernetes 部署,您可能需要查看 LoadBalancer 类型的服务,或者您可能希望如果您有本地 Kubernetes 部署,请查看 Ingress

    【讨论】:

    • 注意,对于 NodePort 类型的服务,如果您运行“kubectl get service”,该服务的“EXTERNAL-IP”列将为空。但是您可以使用集群中任何节点的 IP 地址和随机(但所有节点都相同)或 service spec.ports.port.nodePort 选项中指定的端口访问该服务。
    • 只想补充一点,Ingress 在公共云 Kubernetes 部署中也很有意义,与 LoadBalancer 服务类型相比。 LoadBalancer 服务类型,如果因为成本需要在集群外暴露多个服务,一般不使用。
    【解决方案2】:

    LoadBalacer 类型服务“分配”一个外部 IP,但它是特定于云提供商的,所以它不起作用。除非您有一个指向集群的负载均衡器(当然是使用外部 IP)。

    对于其他服务,您唯一的选择是NodePort 类型的服务,它将您的 pod 端口映射到节点上的端口,因此可以从外部访问它。丑陋的部分是它将位于像 30021 这样的端口上(在 30000-32767 之间)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-13
      • 2022-01-16
      • 1970-01-01
      • 2018-08-11
      • 2018-08-27
      • 2016-03-25
      • 2020-06-18
      • 1970-01-01
      相关资源
      最近更新 更多