暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

这就是k8s系列之四(kube-apiserver 负载均衡)

埋头过坎 2020-11-30
2365

    前面使用kubespray安装datalab k8s集群时, 规划节点时采用了2个节点作为master, 通过kubectl访问时, 一般会选择其中的一个节点(根据配置文件$HOME/.kube/config 中的server配置项), kubectl 的工作原理是通过命令行参数转换为对kube-apiserver的REST API调用,并将调用结果格式化输出。kube-apiserver对外提供了restful API, 完成一系列的功能, 除了通过 kubectl客户端调用, 也可以通过curl、浏览器或者编程调用。 本文主要是介绍了如何通过nginx来实现kube-apiserver的负载均衡。

    整体的流量示意图如上, 因为kube-apiserver提供的是https服务, nginx需要承担https的反向代理 , 该功能由stream模块提供, 需要在源码编译的时候带上该配置项, 如下:

    # configure and install
    ./configure --prefix=$RUN/nginx-1.18.0 --with-http_stub_status_module --with-http_ssl_module --with-stream
    make -j5 && make install

    安装完成后, 可以通过-V查看是否成功

      [root@host02 nginx-1.18.0]# sbin/nginx -V
      nginx version: nginx/1.18.0
      built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
      built with OpenSSL 1.0.2k-fips 26 Jan 2017
      TLS SNI support enabled
      configure arguments: --prefix=/home/xxx/nginx/run/nginx-1.18.0 --with-http_stub_status_module --with-http_ssl_module --with-stream

          k8s集群方面, 使用kubespary安装时, 需要修改下inventory/datalab/group_vars/all/all.yaml中关于loadbalancer的配置项,如下:

        (base) bash-4.1$ cat inventory/datalab/group_vars/all/all.yml |grep loadbalancer
        ## apiserver_loadbalancer_domain_name: "elb.some.domain"
        # loadbalancer_apiserver:
        ## Internal loadbalancers for apiservers
        loadbalancer_apiserver_localhost: true
        loadbalancer_apiserver_type: nginx # valid values "nginx" or "haproxy"
        ## Local loadbalancer should use this port
        loadbalancer_apiserver_port: 6443

            构建针对于https代理的nginx配置文件,如下:

          cat > kube-nginx.conf << \EOF
          stream {
          upstream apiserver {
          hash $remote_addr consistent;
          server kube-apiserver-01:6443 max_fails=3 fail_timeout=30s;
          server kube-apiserver-02:6443 max_fails=3 fail_timeout=30s;
          }
          server {
          listen 0.0.0.0:8443;
          proxy_connect_timeout 3s;
          proxy_pass apiserver;
          }
          }
          EOF

              修改nginx入口配置文件, 包含kube-nginx.conf配置文件,如下:

            [root@host01 nginx-1.18.0]# tail conf/nginx.conf
            index index.html index.htm;
            }
            error_page 500 502 503 504 50x.html;
            location = /50x.html {
            root html;
            }
            }
            }


            include /home/xxxnginx/run/nginx-1.18.0/conf/kube-nginx.conf;

                重启一下nginx即可生效。

                下面通过curl来快速验证一下效果:

              [root@host01 nginx-1.18.0]# curl --key /etc/kubernetes/ssl/apiserver-kubelet-client.key --cert /etc/kubernetes/ssl/apiserver-kubelet-lient.crt --cacert /etc/kubernetes/ssl/ca.crt https://127.0.0.1:8443/api/v1/namespaces
              {
              "kind": "NamespaceList",
              "apiVersion": "v1",
              "metadata": {
              "selfLink": "/api/v1/namespaces",
              "resourceVersion": "56817"
              },
              "items": [
              {
              "metadata": {
              "name": "ambassador",
              "selfLink": "/api/v1/namespaces/ambassador",
              "uid": "b6cf2faf-e6d2-4542-a974-f82fc90fc381",
              "resourceVersion": "4030",
              ... ...
              }
              }
              ]
              }

                  这里使用的key, crt、cacrt是/etc/kubernetes/ssl下面带的, 从返回结果来看, 已经生效了。

              文章转载自埋头过坎,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论