nginx - 带有 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。这有什么好担心的吗?
解决方案
我能够重现这种行为。
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 仅找到 1LoadBalancer
即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如果你想要你的Ingress
和Nginx 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
. 上面的命令,已经改变了。
推荐阅读
- javascript - fs.writeFile 每次调用时都开始新行
- javascript - 如何在课堂上访问“文档”?
- node.js - 使用 passport.js 的 Active Directory B2C 的 NodeJS 身份验证问题
- e-commerce - 为新网站推荐合适的电子商务平台
- python - 在 boolean == true 时运行循环
- google-cloud-platform - 下一期 - SuiteCRM
- python - 有人可以告诉我我的代码有什么问题吗?
- selenium - 如何使用 selenium web 驱动程序定位元素
- oauth-2.0 - 解析 jwt 令牌时需要澄清
- php - 数据库中的搜索字段(mqsql/php)