【问题标题】:Service won't come up when using static IP on GKE在 GKE 上使用静态 IP 时服务不会出现
【发布时间】:2017-04-15 07:22:02
【问题描述】:

我已在我的 GCP 帐户上分配了一个静态 IP。然后,我更新了我的应用程序的服务定义以在负载均衡器中使用它,如下所示:

kind: Service
apiVersion: v1
metadata:
  # Unique key of the Service instance
  name: my-app-service
spec:
  ports:
    # Accept traffic sent to port 80
    - name: http
      port: 80
      targetPort: 5000
  selector:
    # Loadbalance traffic across Pods matching
    # this label selector
    app: web
  # Create an HA proxy in the cloud provider
  # with an External IP address - *Only supported
  # by some cloud providers*
  type: LoadBalancer
  # Use the static IP allocated
  loadBalancerIP: 35.186.xxx.xxx

如果我注释掉最后一行并让 GKE 分配一个临时公共 IP,服务就会正常运行。任何想法我做错了什么?

根据回答中的建议,我创建了一个Ingress,如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myapp
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "myapp"
spec:
  backend:
    serviceName: my-app-service
    servicePort: 80

现在,我看到 Ingress 被分配了正确的静态 IP。但是,我的 Service 也被分配了一个(不同的)公共 IP。 IngressService 未连接。如果我注释掉 type: LoadBalancer 行,Service 没有分配公共 IP,但 Ingress 仍然无法连接。访问静态 IP 时,我收到 default backend - 404 响应。我尝试以不同的顺序创建服务和入口,但也没有帮助。

如果我将其保留足够长的时间,静态 IP 会将流量路由到我的服务,但服务本身仍停留在外部 IP 分配中:

$ kubectl get service my-app-service
NAME                   CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
my-app-service          10.x.x.x        <pending>     80:31432/TCP   12m

【问题讨论】:

    标签: kubernetes google-cloud-platform google-kubernetes-engine


    【解决方案1】:

    您需要在 Ingress 上创建一个 Ingress 并使用 kubernetes.io/ingress.global-static-ip-name: "name-of-your-ip" 注释,以便 Kubernetes 能够找到它。

    您可以在这里找到教程:https://github.com/kelseyhightower/ingress-with-static-ip#tutorial

    【讨论】:

    • 谢谢艾哈迈德。我创建了入口,我看到它成功链接到静态 IP。但是,它似乎与我的服务无关。如果我将type:LoadBalancer 留在那里,那么我的服务会被分配一个与入口不同的IP。服务公共 IP 访问了我的应用程序,入口返回 404。如果我注释掉type:LoadBalancer,那么我的服务没有外部IP,并且入口仍在404 上。有什么想法吗?
    • @Raj,我建议从头到尾按照上面的教程进行操作,看看它是否有效。如果没有,我们可能应该向 repo 打开一个问题并修复它。最终,您问题的答案应该是我发布的链接。
    • 谢谢艾哈迈德。本教程公开了一个NodePort 服务。我正在尝试LoadBalancer 服务。我在上面明确更改了我的 YAML 以设置 type: NodePort 并且在访问外部 IP 时仍然得到 404。我现在已经创建了这个缺陷:github.com/kubernetes/kubernetes/issues/44521
    • 我认为外部 IP 最终会向我的服务发送流量,无论是 LoadBalancer 还是 NodePort,但开始执行此操作需要很长时间,例如 7-8 分钟。静态 IP 最初返回 HTTP 404,然后是 502,最后几分钟后,我看到了我的应用程序。我猜这是一个 k8s/GKE 错误
    • @Raj 这实际上是因为 Google Cloud 正在全球所有边缘位置配置负载均衡器,这需要时间。 GCP 的负载均衡器不是区域性的,能够在世界各地的边缘位置接受流量,然后通过 Google 的内部网络转发到您的应用程序。这就是gce ingress 需要大约 5 分钟才能实际工作的原因。我也对自己感到困惑。
    猜你喜欢
    • 1970-01-01
    • 2020-04-23
    • 2019-01-13
    • 2021-08-04
    • 1970-01-01
    • 2016-01-18
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多