nginx-ingress无法转发到仪表板

时间:2019-09-05 22:18:59

标签: kubernetes kubernetes-ingress nginx-ingress kubernetes-dashboard

您好,谢谢您抽出宝贵时间阅读我的问题。

首先,我有一个EKS群集设置,可以使用公共和专用子网。

我按照https://docs.aws.amazon.com/eks/latest/userguide/getting-started-console.html#vpc-create

所述使用cloudformation生成了集群。

然后我通过kubectl apply -f (below file)创建分till的服务帐户来初始化头盔:

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system

,然后helm init --service-account=tiller 跟着helm repo update

然后我使用头盔通过以下方式安装nginx-ingress控制器:

helm install --name nginx-ingress \
        --namespace nginx-project \
        stable/nginx-ingress \
        -f nginx-ingress-values.yaml

我的nginx-ingress-values.yaml是:

controller:
  service:
    annotations:
      service.beta.kubernetes.io/aws-load-balancer-access-log-emit-interval: "60"
      service.beta.kubernetes.io/aws-load-balancer-access-log-enabled: "true"
      service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-name: "abc-us-west-2-elb-access-logs"
      service.beta.kubernetes.io/aws-load-balancer-access-log-s3-bucket-prefix: "vault-cluster/nginx"
      service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:us-west-2:123456789:certificate/bb35b4c4-..."
      service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
      service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
      service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: "60"

到目前为止,一切看起来都很不错,我看到ELB已创建并连接起来,可将acm用于https

然后我通过以下方式安装kubernetes-dashboard:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

我可以通过kubectl proxy

访问它

但是当我通过以下方式为仪表板添加入口规则时: kubectl apply -f dashboard-ingress.yaml 其中dashboard-ingress.yaml是:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: dashboard
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
  namespace: kube-system
spec:
#  tls:
#  - hosts:
#    - abc.def.com
  rules:
  - host: abc.def.com
    http:
      paths:
      - path: /dashboard
        backend:
          serviceName: kubernetes-dashboard
          servicePort: 8443

然后,当我尝试进入http://abc.def.com/时,我陷入了无限重定向循环。

https://abc.def.com/相同 和 http://abc.def.com/dashboard

我是kubernetes的新手,对它一无所知。任何帮助将不胜感激

更新-9/5/2019: 当我从ingress.yaml中取出tls块时,我得到了

到nginx后端,但是http://abc.def.com将我转发到https://abc.def.com,我从openresty / 1.15.8.1获得502错误网关

然后我尝试去https://abc.def.com/dashboard

我得到“ 404页面未找到”,这是我理解的nginx-ingress控制器的响应。

更新-9/6/2019: 非常感谢mk_sta提供的以下答案,这些答案有助于我了解自己所缺少的内容。

对于以后阅读此书的任何人,我通过头盔进行的nginx-ingress安装均能按预期工作,但是我的kubernetes-dashboard安装缺少一些关键注释。最后,我能够通过以下方式配置头盔以安装kubernetes-dashboard:

helm install --name kubernetes-dashboard \
    --namespace kube-system \
    stable/kubernetes-dashboard \
    -f kubernetes-dashboard-values.yaml

其中kubernetes-dashboard-values.yaml是:

ingress:
  enabled: true
  hosts: [abc.def.com]
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  paths: [/dashboard(/|$)(.*)]

然后我可以访问http://abc.def.com/dashboard/https://abc.def.com/dashboard/上的信息中心

由于某种原因,如果我不使用斜杠,那么它将不起作用。

这对我来说已经足够了。

2 个答案:

答案 0 :(得分:1)

在我看来,您在来源/dashboard配置中使用了错误的位置路径Ingress,甚至暴露了相关的 K8s dashboard UI 端点无论您何时未自定义此设置,默认情况下都将在443端口上跨相应的K8s Service资源。

ports:
- port: 443
  protocol: TCP
  targetPort: 8443

为了获得基于routing的正确路径,请使用以下参数覆盖现有参数:

paths:
- path: /
  backend:
    serviceName: kubernetes-dashboard
    servicePort: 443

一旦您决定通过间接路径持有者URL( https://abc.def.com/dashboard )访问 K8s仪表板用户界面,就可以在其中应用Rewrite规则为了透明地更改真实URL的一部分并将请求传输到忠实的目标路径。实际上, Nginx入口控制器通过特定的nginx.ingress.kubernetes.io/rewrite-target annotation添加了此功能:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: dashboard
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  namespace: kube-system
spec:
#  tls:
#  - hosts:
#    - abc.def.com
  rules:
  - host: abc.def.com
    http:
      paths:
      - path: /dashboard(/|$)(.*)
        backend:
          serviceName: kubernetes-dashboard
          servicePort: 443

答案 1 :(得分:0)

如果您的集群没有将nginx作为默认入口类,并且入口清单未指定一个,则可能会发生这种情况。

您可以尝试以下方法之一: -在将controller.ingressClass设置为nginx的情况下升级NGINX-inress安装(默认情况下,所有创建的入口将使用NGINX-inress) -将kubernetes.io/ingress.class: nginx注释添加到您的入口Yaml中,以指定您希望NGINX入口处理它。