首页 > 解决方案 > 带有 NGINX 负载均衡器的 GKE 入口资源显示奇怪的 IP?

问题描述

我在 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。这有什么好担心的吗?

标签: nginxkubernetesgoogle-kubernetes-engine

解决方案


我能够重现这种行为。

1如果您将Nginx Ingress按照Nginx Docs部署在 GKE 上,则它可以正常工作。Service并且Ingress拥有相同的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将有一个ExternalIP并且Ingress会有另一个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 仅找到 1LoadBalancerService 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有相同的,你必须在helm命令ExternalIP中将参数设置为true。controller.publishService.enabled这个参数可以在Nginx Ingress文档中找到。

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

$ 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 chart stable/nginx-ingress已被弃用。请使用nginx-ingress/nginx-ingress. 上面的命令,已经改变了。


推荐阅读