K8 Ingress 没有端点
K8 Ingress does not have an endpoint
我想使用入口控制器从 K8 集群外部访问服务。根据 Kubernetes Cookbook 中的 5.5,我 运行 这个清单:
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: nginx-public
annotations:
ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host:
http:
paths:
- path: /web
backend:
serviceName: nginx
servicePort: 80
Ingress 对象在 Kubernetes 仪表板中可见;但它没有指定的端点:
kubectl get ing
的输出:
NAME HOSTS ADDRESS PORTS AGE
nginx-public * 80 54m
更新
运行 kubectl describe ingress nginx-public
给出:
Name: nginx-public
Namespace: default
Address:
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
*
/web nginx:80 (<none>)
Annotations:
ingress.kubernetes.io/rewrite-target: /
Events: <none>
实际上这是 Kubernetes Dashboard 的问题,我们也有同样的问题。
即使没有显示,也不代表你的 ingress 不工作。首先,您应该使用 kubectl 检查入口(kubectl describe ingress nginx-public)并验证输出是否与此相似:
Name: test-ingress
Namespace: test
Address:
Default backend: default-http-backend:80 (<none>)
TLS:
test-ssl-secret terminates test.myorg.com
Rules:
Host Path Backends
---- ---- --------
test.myorg.com
/ test-service:80 (<none>)
之后您应该验证您的服务是否可以通过您指定的主机访问。
更新:
根据入口控制器前面的服务,你的服务应该可以通过 http://{serverip}:{nodeport-http-port}/web 访问,以防你的服务类型为 NodePort(你在 30000-39999 范围内获取 2 个外部端口,一个是 http 端口,另一个是 https 端口)或 http://{address-from-external-loadbalancer}/web 如果服务类型为 LoadBalancer。
第二次更新
在对该问题进行进一步调查后,我偶然发现了一个 bug issue 的 kubernetes-dashboard,它指出确实可以显示入口端点。问题实际上不是由仪表板引起的,而是入口部署中缺少参数。
对于 nginx-ingress-controller 其如下:
缺少的选项是--publish-service
如果使用helm部署controller需要添加参数--set controller.publishService.enabled=true
我想使用入口控制器从 K8 集群外部访问服务。根据 Kubernetes Cookbook 中的 5.5,我 运行 这个清单:
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: nginx-public
annotations:
ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host:
http:
paths:
- path: /web
backend:
serviceName: nginx
servicePort: 80
Ingress 对象在 Kubernetes 仪表板中可见;但它没有指定的端点:
kubectl get ing
的输出:
NAME HOSTS ADDRESS PORTS AGE
nginx-public * 80 54m
更新
运行 kubectl describe ingress nginx-public
给出:
Name: nginx-public
Namespace: default
Address:
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
*
/web nginx:80 (<none>)
Annotations:
ingress.kubernetes.io/rewrite-target: /
Events: <none>
实际上这是 Kubernetes Dashboard 的问题,我们也有同样的问题。
即使没有显示,也不代表你的 ingress 不工作。首先,您应该使用 kubectl 检查入口(kubectl describe ingress nginx-public)并验证输出是否与此相似:
Name: test-ingress
Namespace: test
Address:
Default backend: default-http-backend:80 (<none>)
TLS:
test-ssl-secret terminates test.myorg.com
Rules:
Host Path Backends
---- ---- --------
test.myorg.com
/ test-service:80 (<none>)
之后您应该验证您的服务是否可以通过您指定的主机访问。
更新:
根据入口控制器前面的服务,你的服务应该可以通过 http://{serverip}:{nodeport-http-port}/web 访问,以防你的服务类型为 NodePort(你在 30000-39999 范围内获取 2 个外部端口,一个是 http 端口,另一个是 https 端口)或 http://{address-from-external-loadbalancer}/web 如果服务类型为 LoadBalancer。
第二次更新
在对该问题进行进一步调查后,我偶然发现了一个 bug issue 的 kubernetes-dashboard,它指出确实可以显示入口端点。问题实际上不是由仪表板引起的,而是入口部署中缺少参数。
对于 nginx-ingress-controller 其如下:
缺少的选项是--publish-service 如果使用helm部署controller需要添加参数--set controller.publishService.enabled=true