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 其如下:

NGINX Ingress CLI arguments

缺少的选项是--publish-service 如果使用helm部署controller需要添加参数--set controller.publishService.enabled=true