• k8s~为服务添加ingress的实现


    ingress产生的原因

    ClusterIP的方式只能在集群内部访问
    NodePort方式的话,测试环境使用还行,当有几十上百的服务在集群中运行时,NodePort的端口管理是灾难。
    LoadBalance方式受限于云平台,且通常在云平台部署ELB还需要额外的费用。
    所幸k8s还提供了一种集群维度暴露服务的方式,也就是ingress。ingress可以简单理解为service的service,他通过独立的ingress对象来制定请求转发的规则,把请求路由到一个或多个service中。这样就把服务与请求规则解耦了,可以从业务维度统一考虑业务的暴露,而不用为每个service单独考虑,下面是一个简单的ingress应用图,实现了简单的请求转发

     ingress和ingress-controller

    ingress对象:
    指的是k8s中的一个api对象,一般用yaml配置。作用是定义请求如何转发到service的规则,可以理解为配置模板。
    ingress-controller:
    具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发。
    简单来说,ingress-controller才是负责具体转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到ingress-controller,而ingress对象是用来告诉ingress-controller该如何转发请求,比如哪些域名哪些path要转发到哪些服务等等。

    ingress-controller并不是k8s自带的组件,实际上ingress-controller只是一个统称,用户可以选择不同的ingress-controller实现,目前,由k8s维护的ingress-controller只有google云的GCE与ingress-nginx两个,其他还有很多第三方维护的ingress-controller,具体可以参考官方文档。但是不管哪一种ingress-controller,实现的机制都大同小异,只是在具体配置上有差异。一般来说,ingress-controller的形式都是一个pod,里面跑着daemon程序和反向代理程序。daemon负责不断监控集群的变化,根据ingress对象生成配置并应用新配置到反向代理,比如nginx-ingress就是动态生成nginx配置,动态更新upstream,并在需要的时候reload程序应用新配置。为了方便,后面的例子都以k8s官方维护的nginx-ingress为例。

    为服务添加ingress的实现

    1 当我们为指定的项目添加ingress支持之后,它会在“负载均衡”标签页出现,并显示出你的域名解析到的服务。

    2 我们的ingress是支持https的,所以需要为你的域名配置对应的证书,我们在配置文件里添加

     

    3 自动为ingress-controller里的配置文件添加nginx配置项,然后自动reload它,让它生效

    当有新的ingress服务注册之后,配置文件会发生变化

     4 你的服务对应的nginx是在自己服务的ymal里进行配置的,一般来说,微服务的网关层都应该建立 一个ingress-nginx来对外提供服务!

    下面说一下yaml的nginx部分的功能:
    1. 注明ingress的名称
    2. 填写之前建立的密文名称(ingress https 证书)
    3. 填写你的服务所在的namespace,不写默认为default
    4. 填写你要转发的服务的域名
    5. 填写你服务的名称和pod的端口
     
    ymal代码如下
    # 构建反射代理
    kind: Ingress
    apiVersion: extensions/v1beta1
    metadata:
      name: hello-world-ingress
      namespace: saas
      annotations:
        kubernetes.io/ingress.class: "nginx"
        nginx.ingress.kubernetes.io/use-regex: "true"
    spec:
      tls:
        - hosts:
            - www.abc.com
          secretName: saas-tls
      rules:
        - host: www.abc.com
          http:
            paths:
              - backend:
                  serviceName: hello-world
                  servicePort: 9001
    它在ingress-nginx里生成的完整配置如下
     ## start server www.abc.com
            server {
                    server_name www.abc.com ;
    
                    listen 80  ;
                    listen [::]:80  ;
                    listen 443  ssl http2 ;
                    listen [::]:443  ssl http2 ;
    
                    set $proxy_upstream_name "-";
    
                    # PEM sha: c24ba9e405ed77662c0fd7546a908ef45ca76066
                    ssl_certificate                         /etc/ingress-controller/ssl/default-fake-certificate.pem;
                    ssl_certificate_key                     /etc/ingress-controller/ssl/default-fake-certificate.pem;
    
                    ssl_certificate_by_lua_block {
                            certificate.call()
                    }
    
                    location ~* "^/" {
    
                            set $namespace      "saas";
                            set $ingress_name   "hello-world-ingress";
                            set $service_name   "hello-world";
                    set $service_port   "{0 9001 }";
                            set $location_path  "/";
    
                            rewrite_by_lua_block {
                                    lua_ingress.rewrite({
                                            force_ssl_redirect = true,
                                            use_port_in_redirects = false,
                                    })
                                    balancer.rewrite()
                                    plugins.run()
                            }
    
                            header_filter_by_lua_block {
    
                                    plugins.run()
                            }
                            body_filter_by_lua_block {
    
                            }
    
                            log_by_lua_block {
    
                                    balancer.log()
    
                                    monitor.call()
    
                                    plugins.run()
                            }
    
                            if ($scheme = https) {
                                    more_set_headers                        "Strict-Transport-Security: max-age=15724800; includeSubDomains";
                            }
    
                            port_in_redirect off;
    
                            set $balancer_ewma_score -1;
                            set $proxy_upstream_name    "saas-hello-world-9001";
                            set $proxy_host             $proxy_upstream_name;
                            set $pass_access_scheme $scheme;
                            set $pass_server_port $server_port;
                            set $best_http_host $http_host;
                            set $pass_port $pass_server_port;
    
                            set $proxy_alternative_upstream_name "";
    
                            client_max_body_size                    1m;
    
                            proxy_set_header Host                   $best_http_host;
    
                            # Pass the extracted client certificate to the backend
    
                            # Allow websocket connections
                            proxy_set_header                        Upgrade           $http_upgrade;
    
                            proxy_set_header                        Connection        $connection_upgrade;
    
                            proxy_set_header X-Request-ID           $req_id;
                            proxy_set_header X-Real-IP              $the_real_ip;
    
                            proxy_set_header X-Forwarded-For        $the_real_ip;
    
                            proxy_set_header X-Forwarded-Host       $best_http_host;
                            proxy_set_header X-Forwarded-Port       $pass_port;
                            proxy_set_header X-Forwarded-Proto      $pass_access_scheme;
    
                            proxy_set_header X-Original-URI         $request_uri;
    
                            proxy_set_header X-Scheme               $pass_access_scheme;
    
                            # Pass the original X-Forwarded-For
                            proxy_set_header X-Original-Forwarded-For $http_x_forwarded_for;
    
                            # mitigate HTTPoxy Vulnerability
                            # https://www.nginx.com/blog/mitigating-the-httpoxy-vulnerability-with-nginx/
                            proxy_set_header Proxy                  "";
    
                            # Custom headers to proxied server
    
                            proxy_connect_timeout                   5s;
                            proxy_send_timeout                      60s;
                            proxy_read_timeout                      60s;
    
                            proxy_buffering                         off;
                            proxy_buffer_size                       4k;
                            proxy_buffers                           4 4k;
                            proxy_request_buffering                 on;
                            proxy_http_version                      1.1;
    
                            proxy_cookie_domain                     off;
                            proxy_cookie_path                       off;
    
                            # In case of errors try the next upstream server before returning an error
                            proxy_next_upstream                     error timeout;
                            proxy_next_upstream_timeout             0;
                            proxy_next_upstream_tries               3;
    
                            proxy_pass http://upstream_balancer;
    
                            proxy_redirect                          off;
    
                    }
    
            }
            ## end server www.abc.com
    知识在于积累!
     


  • 相关阅读:
    Delphi TCXTreeList的一些操作
    Authentication failure. Retrying 彻底解决vagrant up时警告
    Linux查看mysql 安装路径和运行路径
    和重复搭建开发环境说 Bye Bye 之Vagrant
    怎样查看MySql数据库物理文件存放位置
    10分钟彻底理解Redis持久化和主从复制
    胡子决定编程语言运势
    总结: asp.net页面间数据传递(转)
    利用System.IO中的Directory类对目录进行基本操作
    SQL中读出表中字段
  • 原文地址:https://www.cnblogs.com/lori/p/12211244.html
Copyright © 2020-2023  润新知