fix(admin-ui): envsubst FQDN с per-cluster DNS suffix

nginx resolver не использует search list, поэтому в proxy_pass нужен
FQDN. Cluster domain различается:
  - cluster.265 (staging): 265.local
  - srvaltum01 (prod):     altum.local
  - default kubespray:     cluster.local

Решение: nginx.conf — template с ${ORDINIS_NAMESPACE} и
${CLUSTER_DOMAIN}, обрабатывается официальным nginx entrypoint
(/docker-entrypoint.d/20-envsubst-on-templates.sh). Helm подставляет
ENV из fieldRef + values per-env.
This commit is contained in:
Александр Зимин
2026-05-04 01:21:34 +03:00
parent 8e97c50e6c
commit d5a747616a
2 changed files with 15 additions and 6 deletions
+7 -1
View File
@@ -8,5 +8,11 @@ RUN pnpm build
FROM repo.nstart.cloud/library/nginx:1.27-alpine FROM repo.nstart.cloud/library/nginx:1.27-alpine
COPY --from=build /app/dist /usr/share/nginx/html COPY --from=build /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf # Шаблон обрабатывается официальным entrypoint nginx-image:
# /docker-entrypoint.d/20-envsubst-on-templates.sh пробегает по
# /etc/nginx/templates/*.template и envsubst'ит ENV vars в /etc/nginx/conf.d/.
COPY nginx.conf /etc/nginx/templates/default.conf.template
ENV NGINX_ENVSUBST_TEMPLATE_DIR=/etc/nginx/templates \
NGINX_ENVSUBST_TEMPLATE_SUFFIX=.template \
NGINX_ENVSUBST_OUTPUT_DIR=/etc/nginx/conf.d
EXPOSE 80 EXPOSE 80
+8 -5
View File
@@ -2,9 +2,10 @@ server {
listen 80; listen 80;
server_name _; server_name _;
# Resolver для динамического k8s service DNS (proxy_pass с переменной). # Resolver — coredns (10.233.0.3 на kubespray-кластерах). nodelocal-dns
# 169.254.25.10 — nodelocal-dns на kubespray-кластерах (cluster.265 и .264). # (169.254.25.10) при первом cold lookup отвечает SERVFAIL, поэтому
resolver 169.254.25.10 1.1.1.1 valid=30s ipv6=off; # обращаемся напрямую к ClusterDNS service.
resolver ${RESOLVER_IP} valid=30s ipv6=off;
# Real client IP behind ingress-nginx. # Real client IP behind ingress-nginx.
set_real_ip_from 0.0.0.0/0; set_real_ip_from 0.0.0.0/0;
@@ -15,10 +16,12 @@ server {
index index.html; index index.html;
# GET → read-api, мутирующие → writer. # GET → read-api, мутирующие → writer.
# FQDN в proxy_pass нужен потому что nginx resolver не использует search list.
# Namespace и cluster-domain инжектятся через ENV (см. admin-ui Deployment).
location /api/v1/ { location /api/v1/ {
set $backend "ordinis-read-api"; set $backend "ordinis-read-api.${ORDINIS_NAMESPACE}.svc.${CLUSTER_DOMAIN}";
if ($request_method ~ ^(POST|PUT|PATCH|DELETE)$) { if ($request_method ~ ^(POST|PUT|PATCH|DELETE)$) {
set $backend "ordinis-app"; set $backend "ordinis-app.${ORDINIS_NAMESPACE}.svc.${CLUSTER_DOMAIN}";
} }
proxy_pass http://$backend; proxy_pass http://$backend;
proxy_http_version 1.1; proxy_http_version 1.1;