【问题标题】:GKE Ingress Resource with NGINX Load Balancer shows strange IP?带有 NGINX 负载均衡器的 GKE 入口资源显示奇怪的 IP?
【发布时间】:2020-06-22 17:36:39
【问题描述】:

我在 GKE 上运行一个集群,其中入口配置为使用 NGINX,如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
      kubernetes.io/ingress.class: nginx
      nginx.ingress.kubernetes.io/ssl-redirect: "false"
      nginx.ingress.kubernetes.io/use-regex: "true"
....

我使用 Helm 在 CLI 上安装了 NGINX 负载均衡器。负载均衡器控制台仅显示 NGINX(而不是 Google 控制台),这很好,而且我的应用程序肯定会根据我的入口清单进行路由。但是,控制台中显示的我的 Ingress 具有属性:loadBalancerIP: xx.xxx.xxx.x,我无法识别它。它绝对不是 NGINX 负载均衡器使用的外部 IP,但它类似于(可能是公共 IP,而不是内部 IP)。它也响应 ping。此属性在通过管道时由 Google Cloud 添加到入口 yaml。这有什么好担心的吗?

【问题讨论】:

  • 我们部署了哪个图表Nginx?奇怪的IP是什么意思?您是否在 YAML 中的某处指定了它?你在使用StaticIP 这个LoadBalancer 吗?如果不是 GKE 将创建带有“可用”ExternalIP 地址的 LoadBalancer。你能分享你的配置 YAML 吗?在我看来,如果您没有在任何地方指定随机外部 IP 地址,您不应该担心它。
  • @PjoterS 我使用helm install --name nginx-ingress stable/nginx-ingress --set controller.service.loadBalancerIP=<my_static_regional-IP> 在 CLI 上部署。我使用的唯一 YAML 是定义我没有指定任何 IP 的入口。出现的“奇怪”是由 Google 添加到 status.loadBalancer.ingress.ip 下的入口 yaml 中的。但是,如果我在控制台中查看所有负载均衡器,则只会显示带有我的区域静态 IP 的 NGINX 一个。入口肯定会按照我的预期工作。但它仍然显示其他IP。
  • 我错了。在重现此行为期间,我发现您需要将 controller.publishService.enabled 设置为 true 以使 Nginx 服务和 Ingress 具有相同的 IP。我已经发布了一些澄清的答案。

标签: nginx kubernetes google-kubernetes-engine


【解决方案1】:

我能够重现这种行为。

1 如果您按照Nginx Docs 在 GKE 上部署Nginx Ingress,则它可以正常工作。 ServiceIngress 拥有相同的 IP。

kubectl create clusterrolebinding cluster-admin-binding \
  --clusterrole cluster-admin \
  --user $(gcloud config get-value account)
  
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud/deploy.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
configmap/ingress-nginx-controller created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
...

2 如果您将部署 Nginx Ingress Helm 图表而不进行任何更改 $ helm install ingress ingress-nginx/ingress-nginx 它将按照您的描述工作 Nginx ingress controller LoadBalancer service 将有一个 ExternalIPIngress 将有另一个 ExternalIP

$ kubectl get svc,ing
NAME                                            TYPE           CLUSTER-IP   EXTERNAL-IP    PORT(S)                      AGE
service/hello-v2-svc                            NodePort       10.8.2.119   <none>         8080:32492/TCP               58s
service/ingress-nginx-ingress-controller        LoadBalancer   10.8.5.90    34.72.141.41   80:32280/TCP,443:31670/TCP   108s
service/ingress-nginx-ingress-default-backend   ClusterIP      10.8.5.66    <none>         80/TCP                       108s
service/kubernetes                              ClusterIP      10.8.0.1     <none>         443/TCP                      169m
NAME                            HOSTS   ADDRESS         PORTS   AGE
ingress.extensions/my-ingress   *       34.66.191.241   80      58s

关于是否应该担心的部分取决于。这不会向您收费,因为 GKE 仅找到 1 个LoadBalancer,即Service LoadBalancer。您可以通过以下方式检查:

$ gcloud compute url-maps list
Listed 0 items.
user@cloudshell:~ (project)$ gcloud compute forwarding-rules list
NAME                              REGION       IP_ADDRESS    IP_PROTOCOL  TARGET
a655d3a06b55511ea89df42010a800fe  us-central1  34.72.141.41  TCP          us-central1/targetPools/a655d3a06b55511ea89df42010a800fe

3如果你想让你的IngressNginx LoadBalancer service有相同的ExternalIP,你必须在helm命令中设置参数controller.publishService.enabled为true。这个参数可以在Nginx Ingress文档中找到。

controller.publishService.enabled 如果为真,控制器将在入口对象上设置端点记录以反映服务上的记录为假

$ helm install ingress ingress-nginx/ingress-nginx --set controller.publishService.enabled=true

之后,您可以部署一些 YAML,例如:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-v2
spec:
  selector:
    matchLabels:
      app: hello-v2
  replicas: 1
  template:
    metadata:
      labels:
        app: hello-v2
    spec:
      containers:
      - name: hellov2
        image: "gcr.io/google-samples/hello-app:2.0"
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: hello-v2-svc
  labels: 
    app: hello-v2
spec:
  type: NodePort 
  selector:
    app: hello-v2
  ports:
  - port: 8080
    targetPort: 8080
    protocol: TCP
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata: 
  name: my-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - http:
      paths:
        - path: /hello-v2
          backend:
            serviceName: hello-v2-svc
            servicePort: 8080
            
$ kubectl apply -f hello.yaml
deployment.apps/hello-v2 created
service/hello-v2-svc created
ingress.extensions/my-ingress created

$ kubectl get svc,ing
NAME                                            TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE
service/hello-v2-svc                            NodePort       10.8.3.51     <none>          8080:30572/TCP               19m
service/ingress-nginx-ingress-controller        LoadBalancer   10.8.12.137   34.69.123.145   80:32720/TCP,443:31245/TCP   20m
service/ingress-nginx-ingress-default-backend   ClusterIP      10.8.1.65     <none>          80/TCP                       20m
service/kubernetes                              ClusterIP      10.8.0.1      <none>          443/TCP                      163m

NAME                            HOSTS   ADDRESS         PORTS   AGE
ingress.extensions/my-ingress   *       34.69.123.145   80      19m

$ curl 34.69.123.145/hello-v2
Hello, world!
Version: 2.0.0
Hostname: hello-v2-7cf9b75bbf-2cdj5

编辑

最近 Helm 图表 stable/nginx-ingress 已被弃用。请使用nginx-ingress/nginx-ingress。上面的命令,已经改变了。

【讨论】:

  • 哇,非常感谢!这是一个非常有帮助的答案。也许我应该继续按照 (1) 重新部署?
  • 如果您将使用选项 1 或 3 进行部署,结果将是相同的。唯一的区别是,如果您使用选项 1,您的入口将位于 ingress-nginx 命名空间中。
  • 我刚刚用那个额外的选项做了 Helm,它工作得很好。非常感谢。
猜你喜欢
  • 2019-01-12
  • 2021-10-27
  • 2020-07-29
  • 2021-03-18
  • 2019-06-22
  • 2022-10-14
  • 2022-01-03
  • 2019-09-14
  • 2019-06-20
相关资源
最近更新 更多