Конфигурация входа для приборной панели

Я сделал nginx учебник по входному контроллеру с github и открыл панель управления 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: // имя_сервера: 32536 / приборная панель, но приборная панель выдает ошибку

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 в upstream: " http://ipwhichendswith.249:8443/dashboard". попытался обновить версию образа контроллера до 0.9.0-beta.19 - не помогло

Спасибо за любую помощь.

6 ответов

Решение

Как вы указали, похоже, что nginx передает ваш https запрос на ipWhichEndsWith.249:8443, которая является конечной точкой HTTPS, используя http как протокол.

Вы должны добавить следующую аннотацию к вашему PodSpec:

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

Это должно заставить nginx переслать ваш запрос в стручки с https.

Источник: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/annotations.md#secure-backends

Просто для справки кода. Есть 2 гточа. Установка правильных аннотаций, поскольку приборная панель сообщает 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

Чтобы этот тикет обновлялся (если пользователь использует nginx ingress) для доступа к панели инструментов 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 (входящая документация).

Пример полного кода с поддоменом:

       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 /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

Пользователь не должен забывать, что секреты уникальны для каждого пространства имен.

Вы также можете использовать схемы рулевого управления, доступные здесь

https://github.com/helm/charts/tree/master/stable/kubernetes-dashboard

Затем настройте свой values.yaml файл для переопределения ingress Части, как включить его, и добавление хостов доступны.

Вот вход для приборной панели, которая работает для меня.

    Версия API: networking.k8s.io/v1
    вид: Вход
    метаданные:
      имя: kubernetes-dashboard
      пространство имен: kube-система
      аннотации:
        nginx.ingress.kubernetes.io/backend-протокол: «HTTPS»
        nginx.ingress.kubernetes.io/rewrite-target: /$2
        nginx.ingress.kubernetes.io/configuration-snippet: |
          переписать ^(/dashboard)$ $1/ перенаправить;
    спецификация:
      ingressClassName: nginx
      тлс:
      - хозяева:
        - вашдомен.com
        secretName: kubernetes-dashboard-tls
      правила:
      - хост: yourdomain.com
        http:
            пути:
              - путь: /dashboard(/|$)(.*)
                тип пути: префикс
                серверная часть:
                  оказание услуг:
                    имя: kubernetes-dashboard
                    порт:
                      номер: 443

Это должно быть исправлено при развертывании путем установки SERVER_BASEPATH и SERVER_REWRITEBASEPATH, перенаправление на входном уровне будет плавным.

Файл развертывания

      ---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: osd-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: osd
  template:
    metadata:
      labels:
        app: osd
    spec:
      containers:
        - name: osd
          imagePullPolicy: Never
          image: 
          env:
            - name: server.ssl.enabled
              value: "false"
            - name: OPENSEARCH_HOSTS
              value: http://opensearch-service:9200
            - name: SERVER_BASEPATH
              value: /dashboard
            - name: SERVER_REWRITEBASEPATH
              value: "true"              
          ports:
            - containerPort: 5601
              name: http

Сервисный файл:

      ---
apiVersion: v1
kind: Service
metadata:
  name: osd-service
spec:
  selector:
    app: osd
  type: ClusterIP
  ports:
    - name: port5601
      protocol: TCP
      port: 5601
      targetPort: 5601

Входной файл:

      apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: osd-ingress
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: HTTP
    nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"  
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /dashboard
        pathType: Prefix
        backend:
          service:
            name: osd-service
            port:
              number: 5601  
Другие вопросы по тегам