前面使用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-streammake -j5 && make install
安装完成后, 可以通过-V查看是否成功
[root@host02 nginx-1.18.0]# sbin/nginx -Vnginx version: nginx/1.18.0built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)built with OpenSSL 1.0.2k-fips 26 Jan 2017TLS SNI support enabledconfigure 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 apiserversloadbalancer_apiserver_localhost: trueloadbalancer_apiserver_type: nginx # valid values "nginx" or "haproxy"## Local loadbalancer should use this portloadbalancer_apiserver_port: 6443
构建针对于https代理的nginx配置文件,如下:
cat > kube-nginx.conf << \EOFstream {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.confindex 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




