16

我从github做了 nginx 入口控制器教程并暴露了 kubernetes 仪表板

kubernetes-dashboard   NodePort    10.233.53.77    <none>        443:31925/TCP   20d

创建入口

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.org/ssl-backends: "kubernetes-dashboard"
    kubernetes.io/ingress.allow-http: "false"
  name: dashboard-ingress
  namespace: kube-system
spec:
  tls:
  - hosts:
    - serverdnsname
    secretName: kubernetes-dashboard-certs
  rules:
  - host: serverdnsname
    http:
      paths:
      - path: /dashboard
        backend:
          serviceName: kubernetes-dashboard
          servicePort: 443

ingress-nginx   ingress-nginx          NodePort    10.233.21.200   <none>        80:30827/TCP,443:32536/TCP   5h

https://serverdnsname:32536/dashboard 但仪表板抛出错误

2018/01/18 14:42:51 http: TLS handshake error from ipWhichEndsWith.77:52686: tls: first record does not look like a TLS handshake

和入口控制器日志

2018/01/18 14:42:51 [error] 864#864: *37 upstream sent no valid HTTP/1.0 header while reading response header from upstream, client: 10.233.82.1, server: serverdnsname, request: "GET /dashboard HTTP/2.0", upstream: "http://ipWhichEndsWith.249:8443/dashboard", host: "serverdnsname:32536"
10.233.82.1 - [10.233.82.1] - - [18/Jan/2018:14:42:51 +0000] "GET /dashboard HTTP/2.0" 009 7 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36 OPR/49.0.2725.64" 25 0.001 [kube-system-kubernetes-dashboard-443] ipWhichEndsWith.249:8443 7 0.001 200

在我看来,这与 nginx 重定向到上游有关:“ http://ipWhichEndsWith.249:8443/dashboard ”。尝试将控制器映像版本更新为 0.9.0-beta.19 - 没有帮助

感谢您的任何帮助。

4

5 回答 5

36

正如您所指出的,看起来 nginx 正在将您的 https 请求代理到ipWhichEndsWith.249:8443,这是一个 HTTPS 端点,使用httpas 协议。

您应该在 PodSpec 中添加以下注释:

最新的

添加此注释以替换自 0.18.0 以来已弃用的注释

#2871添加对 AJP 协议的支持

nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"

已弃用

此注释在 0.18.0 中已弃用,并在 0.20.0 发布后删除

#3203删除注释 grpc-backend 和 secure-backend 已弃用

nginx.ingress.kubernetes.io/secure-backends: "true"

这应该使 nginx 使用 https 将您的请求转发到 pod。

来源:https ://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md#backend-protocol

文档:https ://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#backend-protocol

于 2018-01-18T15:31:58.643 回答
6

仅供代码参考。有2个gtochas。设置正确的注释,因为仪表板使用 https 并为入口使用正确的命名空间。tls 配置是可选的。

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: dashboard-google
  namespace: kube-system
  annotations:
    nginx.ingress.kubernetes.io/secure-backends: "true"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
  tls:
    - hosts:
      - kube.mydomain.com
      secretName: tls-secret
  rules:
    - host: kube.mydomain.com
      http:
        paths:
        - path: /
          backend:
            serviceName: kubernetes-dashboard
            servicePort: 443
于 2019-03-14T15:22:49.870 回答
3

要保持此票证更新(如果用户使用 nginx 入口)以访问 Kubernetes 仪表板,您需要应用以下注释:

annotations:
  kubernetes.io/ingress.class: "nginx"
  nginx.ingress.kubernetes.io/ssl-passthrough: "true"
  nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"

不要secure-backends在高于image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1. 它被替换为backend-protocol

如果用户在非 https 端口中使用入口,例如 80 可以按照此处记录的方式完成TLS 终止(nging 入口文档)。

带有子域的完整代码示例:

apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: kubernetes-dashboard-ingress
        namespace: kubernetes-dashboard
        annotations:
          kubernetes.io/ingress.class: "nginx"
          nginx.ingress.kubernetes.io/ssl-passthrough: "true"
          nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
      spec:
        tls:
        - hosts:
            - "dashboard.my.example.com"
          secretName: kubernetes-dashboard-secret
        rules:
        - host: "dashboard.my.example.com"
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: kubernetes-dashboard
                  port:
                    number: 443

希望这可以帮助像我这样的其他初学者不要花太多时间来弄清楚如何去做。此外,用户应该考虑到入口控制器的外部负载平衡器配置。请记住将其设置为SSL Pass-Through您将转发的端口。

更新:如果用户想要使用另一个入口提供程序,例如Kubernetes Ingress Controller Documentation/HAProxy Kubernetes Ingress/Controller 1.4

带注释的代码示例:

apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: kubernetes-dashboard-ingress
        namespace: kubernetes-dashboard
        annotations:
          haproxy.org/server-ssl: "true"
      spec:
        tls:
        - hosts:
            - "dashboard.my.example.com"
          secretName: kubernetes-dashboard-secret
        rules:
          - host: "dashboard.my.example.com"
            http:
              paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: kubernetes-dashboard
                    port:
                      number: 443

用户不应忘记每个命名空间的秘密是唯一的。

于 2020-11-20T11:29:05.933 回答
2

您还可以使用此处提供的舵图

helm-chart/kubernetes-dashboard

然后设置您的values.yaml文件以覆盖ingress启用它之类的部分,并且可以添加主机。

于 2018-12-17T10:06:35.510 回答
0

这是适用于我的仪表板的入口。

    api版本:networking.k8s.io/v1
    种类:入口
    元数据:
      名称:kubernetes-dashboard
      命名空间:kube 系统
      注释:
        nginx.ingress.kubernetes.io/backend-protocol:“HTTPS”
        nginx.ingress.kubernetes.io/rewrite-target: /$2
        nginx.ingress.kubernetes.io/configuration-snippet: |
          重写 ^(/dashboard)$ $1/ 重定向;
    规格:
      ingressClassName: nginx
      tls:
      - 主机:
        - yourdomain.com
        秘密名称:kubernetes-dashboard-tls
      规则:
      - 主机:yourdomain.com
        网址:
            路径:
              - 路径:/dashboard(/|$)(.*)
                路径类型:前缀
                后端:
                  服务:
                    名称:kubernetes-dashboard
                    港口:
                      数量:443

于 2022-01-20T15:16:15.127 回答