【问题标题】:minikube and ingress-nginx does not have port 80 openminikube 和 ingress-nginx 没有打开 80 端口
【发布时间】:2021-05-18 14:56:35
【问题描述】:

我是 ingress-nginx 的新手,我使用 minikube 使用 minikube addons enable ingress 启用了它。在寻找与ingress-nginx相关的服务时,我跑了kubectl get services -n kube-system,得到:

NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
ingress-nginx-controller-admission   ClusterIP   10.96.141.138   <none>        443/TCP                  16m
kube-dns                             ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP   16m

注意到我缺少 80 端口,我运行 kubectl describe service/ingress-nginx-controller-admission -n kube-system 并得到:

Name:              ingress-nginx-controller-admission
Namespace:         kube-system
Labels:            addonmanager.kubernetes.io/mode=Reconcile
                   app.kubernetes.io/component=controller
                   app.kubernetes.io/instance=ingress-nginx
                   app.kubernetes.io/name=ingress-nginx
Annotations:       <none>
Selector:          app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
Type:              ClusterIP
IP:                10.96.141.138
Port:              https-webhook  443/TCP
TargetPort:        webhook/TCP
Endpoints:         172.17.0.3:8443
Session Affinity:  None
Events:            <none>

当尝试访问端点 https://ingress-nginx-controller-admission.kube-system.svc.cluster.local/foo 时,我收到此错误:

FetchError: request to https://ingress-nginx-controller-admission.kube-system.svc.cluster.local/foo failed, reason: unable to verify the first certificate

,尽管通过入口从 pod 内到达端点 /foo 效果很好。我正在调查tls related documentation 无济于事。对此的任何帮助将不胜感激。

编辑:我为每个请求添加了kubectl get svc -A 的输出:

NAMESPACE     NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
default       auth-svc                             ClusterIP      10.100.218.231   <none>        4000/TCP                     13s
default       client-svc                           ClusterIP      10.106.143.107   <none>        3000/TCP                     12s
default       kubernetes                           ClusterIP      10.96.0.1        <none>        443/TCP                      37m
kube-system   ingress-nginx-controller-admission   ClusterIP      10.96.141.138    <none>        443/TCP                      36m
kube-system   kube-dns                             ClusterIP      10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP       37m

【问题讨论】:

  • 添加kubectl get svc -A的输出
  • @ArghyaSadhu 谢谢。我用该信息更新了原始帖子
  • minikube 的哪个版本? minikube 的驱动是什么?
  • @zigarn 我在 arch linux 上使用 minikube 版本 1.16.0。我没有指定驱动,所以我相信默认的。谢谢。

标签: docker nginx kubernetes


【解决方案1】:

顾名思义,您正在查看的服务是 minikube 入口插件的Admission Controller。
Ingress Controller 使用它来解析 Ingress 定义并配置底层 nginx(您可以查看minikube ingress addon deployment)

要访问您可能已定义的公开 Ingress,您需要点击 minikube 机器的端口 80 或 443(可通过 minikube ip 获得)。 (你可以通过minikube ssh -- docker container ls --filter label=app.kubernetes.io/name=ingress-nginx查看那些监听端口)

您需要的文档是这个:https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/

因此,如果您使用host=hello-world.info 和path=/foo 定义了一个Ingress,您将能够通过以下方式访问它:

curl --header 'Host: hello-world.info' http://`minikube ip`:80/foo

当然,最好定义一个 DNS 条目,将hello-world.info 映射到 minikube IP。

【讨论】:

  • 谢谢。我应该澄清一下,我可以访问hello-world.info 以及 minikube ip。我只是无法从其中一个 pod 中访问该 ip,这是我在尝试访问 https://ingress-nginx-controller-admission.kube-system.svc.cluster.local/foo 时尝试做的。希望这有助于澄清我的目标。谢谢!
  • Ingress 更多的是为集群外部提供服务;从集群内部,只需使用直接访问服务。服务ingress-nginx-controller-admission 并不意味着暴露入口控制器,它是用于入口的内部机制。如果您需要通过入口,则必须像从外部一样:添加可从您的 pod 获得的 DNS 条目,或者在部署 ingress-nginx-controller 的端口 80 上创建您自己的服务,但是那么服务的名称和Ingress的host必须匹配。
【解决方案2】:

运行 kubectl expose deployment ingress-nginx-controller --target-port=80 --type=NodePort -n kube-system 允许我从集群中的 pod 内访问入口。

【讨论】:

    【解决方案3】:

    minikube 上的 Nginx ingress 不使用服务来提供对 ingress pod 的访问。

    它使用主机端口。这是 ingres 控制器 pod 的 yaml 的一部分:

    $ kubectl get pod -n kube-system   ingress-nginx-controller-789d9c4dc-5wnc2 -oyaml
    
    [...]
    ports:
    - containerPort: 80
      hostPort: 80
      name: http
      protocol: TCP
    - containerPort: 443
      hostPort: 443
      name: https
      protocol: TCP
    - containerPort: 8443
      name: webhook
      protocol: TCP
    [...]
    

    它的行为记录在k8s api reference docs

    主机端口 要在主机上公开的端口数。如果指定,它必须是一个有效的端口号,0

    因此,可以通过以下方式轻松访问入口:

    curl $(minikube ip)
    

    【讨论】:

      猜你喜欢
      • 2015-12-03
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 2016-05-12
      • 2017-11-19
      相关资源
      最近更新 更多