我能够重现这种行为。
1 如果您按照Nginx Docs 在 GKE 上部署Nginx Ingress,则它可以正常工作。 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 仅找到 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如果你想让你的Ingress和Nginx 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。上面的命令,已经改变了。