Kubernetes 的 Ingress 对 nginx-ingress-controller 没有影响

Kubernetes's Ingress has no effect on nginx-ingress-controller

我已经部署了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

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

  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 集群中的一台机器中。

您的部署方式似乎不包含在 kubernetes 中监视 Ingress 资源所需的功能。

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

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

NGINX Ingress controller can be installed via Helm using the chart stable/nginx-ingress from the official charts repository. To install the chart with the release name my-nginx:

helm install stable/nginx-ingress --name my-nginx If the kubernetes cluster has RBAC enabled, then run:

helm install stable/nginx-ingress --name my-nginx --set rbac.create=true Detect installed version:

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 关于传递正确主机的上述回答 headers:

  1. Try running:

    curl -H 'Host: example.com' http://Node-IP:31111/jenkins
    
  2. Modify the /etc/hosts to have an entry Node-IP example.comfile on your machine and just browse to:

    http://example.com:31111/jenkins