#redirect #kubernetes-ingress #nginx-ingress
#перенаправление #kubernetes-ingress #nginx-ingress
Вопрос:
Я пытаюсь получить URL www.example.com чтобы перенаправить себя на example.com сохраняя все об исходном запросе в k8s 1.11.1
Я пытаюсь сделать это с помощью простого входа, а затем использую аннотации для его перенаправления.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/tls-acme: "true"
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/permanent-redirect: https://example.com
nginx.ingress.kubernetes.io/ssl-redirect: "True"
name: example-redirect
spec:
tls:
- hosts:
- www.example.com
secretName: example-tls
rules:
- host: www.example.com
http:
paths:
- backend:
serviceName: example
servicePort: http
Проблема здесь в том, что я не хочу иметь никаких правил / серверной части. Я просто хочу перенаправить www.example.com для example.com используя вход, но входы k8s требуют от меня наличия правил. Существуют ли здесь какие-либо обходные пути?
Ответ №1:
На самом деле, ресурс Ingress имеет строго определенные предпосылки для соответствующей спецификации API. Вы можете исключить rules:
поле из общей конфигурации, однако backend:
оно должно быть определенно указано таким образом, чтобы входной контроллер Nginx мог направлять сетевой трафик к целевой конечной точке в случае, если правила не объявлены или не совпадают.
Всякий раз, когда вы создаете какие-либо конкретные настройки для Nginx Ingress controller с помощью аннотаций или конфигурационных карт, оба параметра выполняют одну и ту же работу по применению некоторой конкретной конфигурации к базовому nginx.conf
файлу, который находится в nginx-ingress-controller
Pod. Это означает, что Ingress controller применяет server {}
и location {}
блокирует соответствующий модуль веб-сервера Nginx для конкретного хоста:
server {
server_name www.example.com ;
listen 80;
listen [::]:80;
set $proxy_upstream_name "-";
listen 443 ssl http2;
listen [::]:443 ssl http2;
.............
location / {
set $namespace "default";
set $ingress_name "example-redirect";
set $service_name "example";
set $service_port "http";
set $location_path "/";
......................
}
}
Поэтому я полагаю, что вы можете захватить nginx.conf
файл на основе конфигурации ресурса Ingress, а затем независимо применить его внутри модуля Ingress controller Pod.
Я предполагаю, что вы можете также рассмотреть возможность использования nginx.ingress.kubernetes.io/from-to-www-redirect: "true"
аннотации для достижения цели в текущем сценарии.
Ответ №2:
Следующее должно сделать:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/tls-acme: "true"
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/configuration-snippet: |
if ($host = 'www.example.com' ) {
rewrite ^ https://example.com$request_uri permanent;
}
name: example-redirect
spec:
tls:
- hosts:
- www.example.com
secretName: example-tls
rules:
- host: www.example.com
http:
paths:
- backend:
serviceName: example
servicePort: http