【问题标题】:kubernetes LoadBalancer service target port set as random in GCP instead of as configuredkubernetes LoadBalancer 服务目标端口在 GCP 中设置为随机而不是配置
【发布时间】:2021-11-17 08:29:23
【问题描述】:

这是直接来自文档的最简单的配置,但是当我创建服务时,kubectl 将目标端口列为随机的。在 YAML 中将目标端口设置为 1337:

apiVersion: v1
kind: Service
metadata:
  name: sails-svc
spec:
  selector:
    app: sails
  ports:
    - port: 1337
      targetPort: 1337
  type: LoadBalancer

这就是 k8s 为服务设置的内容:

kubectl get services
NAME           TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)          AGE
kubernetes     ClusterIP      <X.X.X.X>      <none>          443/TCP          23h
sails          LoadBalancer   <X.X.X.X>      <X.X.X.X>       1337:30203/TCP   3m6s
svc-postgres   ClusterIP      <X.X.X.X>      <none>          5432/TCP         3m7s

当我指定1337 时,为什么k8s 将目标端口设置为30203?如果我尝试其他端口号,它会做同样的事情,80 得到31887。我读过the docs,但禁用这些属性在 GCP 中没有任何作用。我没有正确配置什么?

【问题讨论】:

  • The GCP doc 我最初是通过 cli 命令创建它并且遇到了同样的问题,然后切换到 YAML。没有快乐。

标签: kubernetes google-cloud-platform kubectl


【解决方案1】:

Kubectl get services 输出包括 Port:NodePort:Protocol 信息。默认情况下,为方便起见,Kubernetes 控制平面将从默认范围内分配一个端口:30000-32767(参考这个documentation中的例子)

要获取 TargetPort 信息,请尝试使用

kubectl get service <your service name> --output yaml

此命令显示 loadBalancer:ingress: 下的所有端口详细信息和稳定的外部 IP 地址:

请参阅此documentation,了解有关创建服务类型负载均衡器的更多详细信息

【讨论】:

    【解决方案2】:

    也许由于一些我没有意识到正在发生的重定向,这让我感到更加困惑,但我用我的内部容器解决了一些问题,这很有效。

    产量:

    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)          AGE
    kubernetes     ClusterIP      10.3.240.1    <none>          443/TCP          28h
    sails          LoadBalancer   10.3.253.83   <X.X.X.X>       1337:30766/TCP   9m59s
    svc-postgres   ClusterIP      10.3.248.7    <none>          5432/TCP         12m
    

    我可以对着 EXTERNAL-IP:1337 卷曲。内部目标端口是让我绊倒的原因。我认为这意味着我的 pod 需要打开该端口,并且 pod 应用程序应该绑定到该端口(即 30766),但事实并非如此。该端口是到 pod 的一些内部端口映射,我还没有完全理解,但是 pod 仍然从 1337 端口获取外部流量到 pod 的 1337 端口。我想更好地了解那里发生了什么,因为我对文档的 k8s 网络部分有更多了解,或者是否有人可以启发我。

    【讨论】:

    • 如果您点击 my-service:1337(port),流量将被路由到容器的 1337(targetPort)。目标端口:这是您的应用程序在容器内运行的实际端口。 (source)
    • 但是这个 my-service:1337 是 Kubernetes 集群内部的,可以在一个应用程序想要与另一个应用程序通信时使用。因此,要从集群外部访问服务,需要在运行 kubernetes 的主机上公开端口,以便将流量重定向到容器的端口。这是节点端口(主机上暴露的端口)。从上面的示例中,您可以通过 host_ip:nodePort ex: x:x:x:x:30203 从集群外部(邮递员或任何休息客户端)访问服务
    猜你喜欢
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2022-10-20
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2019-02-18
    • 2022-01-16
    相关资源
    最近更新 更多