Да, хотя это может быть сделано, но его очень трудно достичь только с помощью докера.kubernetes сделает это очень легко, и все, как днс, отображение сервиса предоставляется из коробки.Я включу подходы docker и kubernetes:
Подход Docker: первый черновик будет выглядеть следующим образом, используйте регулярное выражение в nginx
server_name и задайте имена контейнеров docker с шаблоном.Создайте запись / etc / hosts для разных контейнеров, например: 172.16.0.1 v1.docker.container 172.16.0.2 v2.docker.container
И сервер nginx conf выглядит так:
server {
listen 80;
server_name "~^(?<ns>[a-z]+.+)\.myapp\.io";
resolver 127.0.0.1:53 valid=30s;
# make sure $ns.docker.container is resolved to container IP
set $proxyserver "$ns.docker.container";
location / {
try_files $uri @clusterproxy;
}
location @clusterproxy {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-IP $clientip;
proxy_set_header X-Forwarded-For $clientip;
proxy_set_header X-Real-IP $clientip;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-FORWARDED-PROTO 80;
proxy_pass http://$proxyserver:80;
}
}
Подход Kubernetes: создание разных служб и развертываний для разных версий в пространстве имен.Допустим, пространство имен - это «пространство имен приложения».Имена сервисов не требуют пояснений: версия приложения v1: v1-app-service версия приложения v2: v2-app-service
Чтобы сделать nginx более гибким, вы можете добавить имя сервиса в качестве пространства имен в $proxyserver
Правило Nginx:
server {
listen 80;
server_name "~^(?<version>[a-z]+.+)\.myapp\.io";
# you can replace this with kubernetes dns server IP
resolver 127.0.0.1:53 valid=30s;
# make sure $ns.docker.container is resolved to container IP
set $proxyserver "$version.app-namespace.svc.kubernetes";
location / {
try_files $uri @clusterproxy;
}
location @clusterproxy {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-IP $clientip;
proxy_set_header X-Forwarded-For $clientip;
proxy_set_header X-Real-IP $clientip;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-FORWARDED-PROTO 80;
proxy_pass http://$proxyserver:80;
}
}