比如访问 q.cnblogs.com 时自动转发请求到名称为 q-web 的 service ,示意配置文件如下:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: cnblogs-ingress
spec:
  rules:
  - host: {subdomain}.cnblogs.com
    http:
      paths:
      - backend:
          serviceName: {subdomain}-web
          servicePort: 80
请问如何实现?
通过 k8s ingress 规则无法实现,如果使用的是 nginx ingress controller ,可以通过添加 nginx 转发规则实现。
在 nginx-ingress 的 ConfigMap 中添加下面的配置,实测有效。
apiVersion: v1
data:
  http-snippets: |
    server {
      listen 80;
      server_name ~^(?<app>[a-zA-Z0-9-]+)\.cnblogs\.com$;
      access_log  off;
      location / {
          resolver 10.96.0.10;
          proxy_set_header Host $host;
          proxy_pass http://${app}-web.production.svc.cluster.local;
      }
    }
需要注意的地方:
resolver 指定 k8s 集群的 dns 服务器地址。proxy_pass 中指定的主机名一定要加后缀 .production.svc.cluster.local(production 是 namespace 名称)。这操作还是挺6的 但你这样改的就是全局参数了