【问题标题】:Kubernetes's Ingress has no effect on nginx-ingress-controllerKubernetes 的 Ingress 对 nginx-ingress-controller 没有影响
【发布时间】:2018-09-26 18:56:39
【问题描述】:

我已经部署了 nginx:

kubectl run nginx --image=nginx

而且我暴露了 nginx

kubectl expose deployment nginx --port 80 --type NodePort

当执行这个命令时

kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE

nginx        NodePort    10.254.237.40   <none>        80:31111/TCP   22s

jenkins      ClusterIP   10.254.118.81   <none>        8080/TCP       45m

我部署了 Ingress 文件

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: example.com
      http:
        paths:
        - path: /jenkins
          backend:
            serviceName: jenkins
            servicePort: 8080

并且要知道入口的输出

-> kubectl apply -f ingress.yaml
ingress.extensions "nginx" configured
-> kubectl get ing
NAME      HOSTS           ADDRESS   PORTS     AGE
nginx     example.com             80        40m

而当浏览器

http://Node-IP:31111
Returns Nginx's Welcome Page

当浏览器

http://http://Node-IP:31111/jenkins
Returns 404 Not Found

有什么我不明白的吗?

以及如何解决这个问题?

谢谢你:D

【问题讨论】:

    标签: nginx kubernetes kubernetes-ingress nginx-ingress


    【解决方案1】:

    如果您想访问 jenkins 端点,您不应该使用 Node-IP。在这种情况下,您需要使用example.com。但是您需要第 7 层主机标头,以便入口能够理解它。要对其进行测试,您需要对其进行修改。有几种方法可以做到:

    1. 尝试运行:

      curl -H 'Host: example.com' http://Node-IP:31111/jenkins
      
    2. 修改/etc/hosts,在您的机器上添加一个Node-IP example.com文件,然后浏览到:

      http://example.com:31111/jenkins
      

    请注意,您正在使用NodePort 为您服务。您可以使用LoadBalancer 类型来避免指定端口。 (使用默认端口 80)。您也可以使用 clusterIP 10.254.237.40,但要访问它,您必须在 Kubernetes 集群中的一台机器上。

    【讨论】:

      【解决方案2】:

      您的部署方式似乎不包括在 kubernetes 中查看 Ingress 资源所需的功能。

      我建议你以官方建议的方式部署 nginx-ingress:https://kubernetes.github.io/ingress-nginx/deploy/#generic-deployment

      我个人推荐 helm chart 选项:https://kubernetes.github.io/ingress-nginx/deploy/#using-helm

      NGINX Ingress 控制器可以通过 Helm 使用图表安装 来自官方图表存储库的 stable/nginx-ingress。安装 发布名称为 my-nginx 的图表:

      helm install stable/nginx-ingress --name my-nginx 如果kubernetes 集群启用了 RBAC,然后运行:

      helm install stable/nginx-ingress --name my-nginx --set rbac.create=true 检测安装版本:

      POD_NAME=$(kubectl get pods -l app.kubernetes.io/name=ingress-nginx -o jsonpath='{.items[0].metadata.name}') kubectl exec -it $POD_NAME -- /nginx-ingress-controller --version

      此外,请参阅@Rico 关于传递正确主机标头的上述答案:

      1. 尝试运行:

        curl -H 'Host: example.com' http://Node-IP:31111/jenkins
        
      2. 修改/etc/hosts,在您的机器上添加一个Node-IP example.com文件,然后浏览到:

        http://example.com:31111/jenkins
        

      【讨论】:

      • 我尝试使用helm,但是失败了,你能看到这个吗? stackoverflow.com/questions/52535811/…
      • @AhmedMItman 嗨,我检查了你的问题,我看到你想通了:)。这很棒!如果我的回答有帮助,请将其标记为已接受,以便其他人知道如何继续。谢谢!
      猜你喜欢
      • 2020-01-16
      • 2019-02-24
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多