Я думаю, что нашел проблему.
По какой-то причине для сервера по умолчанию force_ssl_redirect
установлено значение false при определении, следует ли перенаправить входящий запрос на HTTPS:
cat /etc/nginx/nginx.conf
уведомление о rewrite_by_lua_block
отправках force_ssl_redirect = false
...
## start server _
server {
server_name _ ;
listen 80 default_server reuseport backlog=511;
set $proxy_upstream_name "-";
set $pass_access_scheme $scheme;
set $pass_server_port $server_port;
set $best_http_host $http_host;
set $pass_port $pass_server_port;
listen 443 default_server reuseport backlog=511 ssl http2;
# PEM sha: 601213c2dd57a30b689e1ccdfaa291bf9cc264c3
ssl_certificate /etc/ingress-controller/ssl/default-fake-certificate.pem;
ssl_certificate_key /etc/ingress-controller/ssl/default-fake-certificate.pem;
ssl_certificate_by_lua_block {
certificate.call()
}
location / {
set $namespace "";
set $ingress_name "";
set $service_name "";
set $service_port "0";
set $location_path "/";
rewrite_by_lua_block {
lua_ingress.rewrite({
force_ssl_redirect = false,
use_port_in_redirects = false,
})
balancer.rewrite()
plugins.run()
}
...
Тогда для кода LUA требуется force_ssl_redirect
и redirect_to_https()
cat /etc/nginx/lua/lua_ingress.lua
...
if location_config.force_ssl_redirect and redirect_to_https() then
local uri = string_format("https://%s%s", redirect_host(), ngx.var.request_uri)
if location_config.use_port_in_redirects then
uri = string_format("https://%s:%s%s", redirect_host(), config.listen_ports.https, ngx.var.request_uri)
end
ngx_redirect(uri, config.http_redirect_code)
end
...
Из того, что я могу сказать, настройка force_ssl_redirect
контролируется только на уровне входящего ресурса через аннотацию nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
. Поскольку у меня нет настройки правил входа (это сервер по умолчанию для запросов, которые не соответствуют ни одному входу), я не могу изменить этот параметр.
Итак, я решил определить свой собственный пользовательский фрагмент сервера на другом порту, для которого force_ssl_redirect
установлено значение true, а затем указать Service Load Balancer на этот пользовательский сервер вместо значения по умолчанию. В частности:
Добавлено в ConfigMap
:
...
http-snippet: |
server {
server_name _ ;
listen 8080 default_server reuseport backlog=511;
set $proxy_upstream_name "-";
set $pass_access_scheme $scheme;
set $pass_server_port $server_port;
set $best_http_host $http_host;
set $pass_port $pass_server_port;
server_tokens off;
location / {
rewrite_by_lua_block {
lua_ingress.rewrite({
force_ssl_redirect = true,
use_port_in_redirects = false,
})
balancer.rewrite()
plugins.run()
}
}
location /healthz {
access_log off;
return 200;
}
}
server-snippet: |
more_set_headers "Strict-Transport-Security: max-age=31536000; includeSubDomains; preload";
Примечание Я также добавил server-snippet
, чтобы правильно включить HSTS. Я думаю, что из-за того, что трафик от ELB к NGINX - это HTTP, а не HTTPS, заголовки HSTS по умолчанию не добавляются правильно.
Добавлено в DaemonSet
:
...
ports:
- name: http
containerPort: 80
- name: http-redirect
containerPort: 8080
...
Изменено Service
:
...
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
...
ports:
- name: http
port: 80
targetPort: http-redirect
# The range of valid ports is 30000-32767
nodePort: 30080
- name: https
port: 443
targetPort: http
# The range of valid ports is 30000-32767
nodePort: 30443
...
И теперь, похоже, все работает. Я обновил Gist , так что он включает полную конфигурацию, которую я использую.