Have any Question?

***********

k8s集群中一个域名聚合多个服务的解决办法

一个域名聚合多个服务的典型场景是:web UI在domain/根路径下公开,api后端服务在domain/api下公开。

接下来我们就以这个场景为例简要介绍两种实现方式。

1 使用NGINX 在主服务的nginx中配置多个location (这个方式依赖k8s组件dns,且最好将同一域名下的所有服务部署到同一个命名空间)

代码如下

server {
  listen     80;
  server_name  _;
  # 注意:
  # 为了清晰说明一个域名聚合多个服务的用法,此例省略了其他非必要配置

  # proxy_pass 后的参数最后带不带/  决定着在向后端传递路径时 是否从路径上删除location后的值
  # 比如 location /_api { proxy_pass http://api-service:8080/;} 
  # 这种写法会使路径/api/a/b/c在传向api-service时变为/a/b/c

  location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
  }

  location ^~ /_api/ {
    proxy_pass http://inner-api.demo:8080/;
  }

  location ^~ /sub01/ {
    proxy_pass http://sub01.demo:80/;
  }

  location ^~ /sub01_api/ {
    proxy_pass http://sub01-api.demo:8080/;
  }

  location ^~ /sub02/ {
    proxy_pass http://sub02.demo:80/;
  }

  location ^~ /sub02_api/ {
    proxy_pass http://sub02-api.demo:8080/;
  }
}

2 使用 Ingress (可能需要通过配置注解 重写_api/user/login路径为/user/login)

拿nginx ingress举例 Prefix写法如下

Annotations-注释

键      值
nginx.ingress.kubernetes.io/rewrite-target    /$1
nginx.ingress.kubernetes.io/use-regex         true

参考文档:

Rewrite – Ingress-Nginx Controller (kubernetes.github.io)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注