在生产上我们发布的服务一般都是以这样的方式:

pod --> service --> ingress --> 云厂商LB --> CDN(With WAF)

这里从ingress开始都附带域名配置,ingress属于Kubernetes集群内部资源,这里我们使用ingress-nginx。

ingress-nginx来自nginx,但并不是nginx,很多nginx的配置ingress-nginx并不能直接使用,需要使用特定的annotations来个性化配置,这次我们除了用到这个,还需要自定义ingress-ngixn的Configmap。

1.自定义ingress-nginx Configmap

安装ingress-nginx后,会自动创建一个Configmap,但是默认里面是空的,因为这次我们需要配置多server_name,比如我需要新增5个,会导致server-name-hash-bucket-size过大,所以我们调整此大小至256,默认官网最高128,实测256也是支持的。

直接导入集群即可,ingress-nginx会自动读取。

% cat ingress-nginx-configmap.yaml

kind: ConfigMap
apiVersion: v1
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx
data:
  server-name-hash-bucket-size: "256"
  server-name-hash-max-size: "1024"

% kubectl apply -f ingress-nginx-configmap.yaml

进入ingress-nginx pod执行shell验证已经生效。

bash-5.0$ cat /etc/nginx/nginx.conf | grep hash
        types_hash_max_size             2048;
        server_names_hash_max_size      1024;
        server_names_hash_bucket_size   256;
        map_hash_bucket_size            64;
        proxy_headers_hash_max_size     512;
        proxy_headers_hash_bucket_size  64;
        variables_hash_bucket_size      256;
        variables_hash_max_size         2048;

2.配置多域名

我们使用ingress-nginx官方提供的[nginx.ingress.kubernetes.io/server-alias](http://nginx.ingress.kubernetes.io/server-alias)方案,默认格式为:

nginx.ingress.kubernetes.io/server-alias: "<server_name>,<server_name>"

所以我们针对我们的服务按照这样的格式即可:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/server-alias: "name.google.com,name.facebook.com"
  name: name
spec:
  rules:
  - host: name.spex.top
    http:
      paths:
      - backend:
          serviceName: name
          servicePort: 8080

这里我们指定发布的服务信息:

  • servicename: name
  • serviceport: 8080
  • hosts:

    • name.spex.top
    • name.google.com
    • name.facebook.com

当流量进入ingress-nginx,如果是以上3个hosts之一,则会路由到name:8080

Last modification:July 30th, 2020 at 03:59 pm