Конфигурация входа для приборной панели
Я сделал 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.
Просто для справки кода. Есть 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