使用 nginx 入口控制器的 minikube Kubernetes 集群上没有入口地址

Posted

技术标签:

【中文标题】使用 nginx 入口控制器的 minikube Kubernetes 集群上没有入口地址【英文标题】:No ingress address on minikube Kubernetes cluster with nginx ingress controller 【发布时间】:2018-07-09 10:45:35 【问题描述】:

我有以下内容:

ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: abcxyz
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: abcxyz
    http:
      paths:
      - path: /a/
        backend:
          serviceName: service-a
          servicePort: 80
      - path: /b/
        backend:
          serviceName: service-b
          servicePort: 80

kubectl describe ingress abcxyz的输出:

Name:             abcxyz
Namespace:        default
Address:          
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host    Path  Backends
  ----    ----  --------
  abcxyz  
          /a/   service-a:80 (<none>)
          /b/   service-b:80 (<none>)
Annotations:
Events:
  Type    Reason  Age                From                      Message
  ----    ------  ----               ----                      -------
  Normal  CREATE  16m                nginx-ingress-controller  Ingress default/abcxyz
  Normal  UPDATE  12m (x2 over 15m)  nginx-ingress-controller  Ingress default/abcxyz

为什么地址是空的?我已经使用 helm install stable/nginx-ingress 通过 helm 安装了“nginx 入口控制器”-所有相关的 pod 似乎都运行良好。

如何提供对 ingress 的访问权限?

【问题讨论】:

主机名 abcxyz 是否解析为实际的 IP 地址? 不,它没有,它应该指向什么IP? 到nginx-ingress-controller的静态ip。它应该是 LoadBalancer 类型的服务。所以主机名应该指向负载均衡器的前面。 因为 minikube 将主机名指向您的 minikube 集群,如果您使用的是 nix 系统,请在 /etc/hosts 中添加一个条目。 【参考方案1】:

我的解决方案是:

minikube addons enable ingress

【讨论】:

【参考方案2】:

类型

minikube ip

检索主 IP。例如:

bash-3.2$ minikube ip
192.168.1.100

提供 Kubernetes 集群信息的命令是:

bash-3.2$ kubectl cluster-info
Kubernetes master is running at https://192.168.1.100:8443
KubeDNS is running at https://192.168.1.100:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

您可以使用curl 从主机测试入口控制器:

bash-3.2$ curl http://192.168.1.100:80
default backend - 404

最后,添加一个主机条目,以便能够使用名称来引用集群 IP 地址

/etc/hosts 中添加:

192.168.1.100   abcxyz

【讨论】:

【参考方案3】:

https://helm.nginx.com/stable 中似乎存在一个错误,导致它无法绑定到 minikube 中的地址。

对我有用的解决方案是改用https://kubernetes.github.io/ingress-nginx NGINX ingress 的 kubernetes 版本的安装说明在这里:https://kubernetes.github.io/ingress-nginx/deploy/,但这里是要点:

头盔

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

helm install ingress-nginx ingress-nginx/ingress-nginx

Minikube

minikube addons enable ingress

microk8s

microk8s enable ingress

还要注意,"bare metal" installation instructions 使用 NodePort。但大多数 IaaS 提供商都有自己分配 IP 的方式,因此他们为每个提供商都有特定的instructions。

# Source: ingress-nginx/templates/controller-service.yaml
apiVersion: v1
kind: Service
metadata:
  annotations:
  labels:
    helm.sh/chart: ingress-nginx-3.33.0
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 0.47.0
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
    - name: https
      port: 443
      protocol: TCP
      targetPort: https
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/component: controller

【讨论】:

以上是关于使用 nginx 入口控制器的 minikube Kubernetes 集群上没有入口地址的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 入口控制器返回 404 Kubernetes

Minikube上的入口控制器未正确路由烧瓶POST请求

k8s nginx 入口重写目标注释未按预期工作

minikube:无法连接本地部署的 nginx 服务

具有多个入口资源对象的 Kubernetes nginx 入口控制器

Nginx 入口控制器 - 调用 Webhook 失败