0

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

4

2 回答 2

3

Node-IP如果您想访问 jenkins 端点,则不应该使用。在这种情况下,您需要使用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 集群中的一台机器上。

于 2018-09-26T19:34:05.273 回答
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 使用官方图表存储库中的 chart 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 -控制器--版本

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

  1. 尝试运行:

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

    http://example.com:31111/jenkins
    
于 2018-09-27T04:31:09.980 回答