使用kubeadm部署k8s集羣08-配置LB指向kube-apiserver

使用kubeadm部署k8s集羣08-配置LB指向kube-apiserver

2018/1/4

配置 LB 指向 kube-apiserver

  • 小目標:在 3 個 master 節點前,還需配置一個 LB 來作爲 apiserver 的入口
    • LB -> master x3
  • 直接使用阿里雲內網 SLB L4 proxy 資源(本次實例是 4 層而不使用 7 層的原因是:跳過了處理證書的環節)
    • 申請下來資源後,將得到一個 vip 指向上述 3 個 master 節點的 IP 作爲後端真實服務器
    • 注意:做網絡聯通性測試時,不要在上述 3 個 master 節點上測試 vip 是否可用,因爲這和負載均衡TCP的實現機制有關
  • 利用 haproxy/nginx 來自建 LB(測試通過,但建議使用阿里雲到基礎組件,不要自己維護)
直接使用阿里雲內網 SLB L4 proxy 資源
### 申請的 SLB 資源
SLB instance id: lb-xxx, vip: 10.10.9.76

### 網絡聯通性測試
[root@tvm-04 ~]# for i in $(seq 1 10);do echo "------------$i";curl -k -If -m 3 https://10.10.9.76:6443;done
------------1
curl: (22) NSS: client certificate not found (nickname not specified)

### 符合預期。出現上述的異常,表示是證書相關的問題,可以通過域名解析到這個 vip 來繞過
### 選一個域名(之前在爲每個節點創建證書時,使用的附加信息中有幾個 DNS 可選)
### 例如:kubernetes.default.svc.cluster.local
### 後續集羣外需要訪問 apiserver 則請求到上述域名中,以此來規避 SLB 的 L4 proxy 沒有證書的問題
###(上述域名寫入目標測試節點的 hosts 中)
[root@tvm-04 ~]# vim /etc/hosts
(略)
### k8s apiserver SLB
10.10.9.76 kubernetes.default.svc.cluster.local

後續在配置 worker 節點時將會用到這裏的域名
利用 haproxy/nginx 來自建 LB
### 此處我們先配置一個單節點的 nginx L4 proxy 來測試(如果使用 L7 需要增加對應的證書)
[root@tvm-04 ~]# vim /etc/hosts
(略)
### k8s apiserver SLB
10.10.9.74 kubernetes.default.svc.cluster.local

### 在這臺機器上配置 nginx L4 stream
[root@tvm-03 ~]# yum -y install nginx
[root@tvm-03 ~]# nginx -v
nginx version: nginx/1.12.2
[root@tvm-03 ~]# mkdir -p /etc/nginx/stream.conf.d
[root@tvm-03 ~]# cat <<'_EOF' >>/etc/nginx/nginx.conf
stream {
    log_format proxy '$remote_addr [$time_local] '
                     '$protocol $status $bytes_sent $bytes_received '
                     '$session_time "$upstream_addr" '
                     '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
    access_log /var/log/nginx/stream.access.log proxy;
    include /etc/nginx/stream.conf.d/*.conf;
}
_EOF

[root@tvm-03 ~]# cat /etc/nginx/stream.conf.d/slb.test.apiserver.local.conf
#tcp: kubernetes.default.svc.cluster.local
upstream slb_test_apiserver_local {
    server 10.10.9.67:6443 weight=5 max_fails=3 fail_timeout=30s;
    server 10.10.9.68:6443 weight=5 max_fails=3 fail_timeout=30s;
    server 10.10.9.69:6443 weight=5 max_fails=3 fail_timeout=30s;
}

server {
    listen 7443;
    proxy_pass slb_test_apiserver_local;
    proxy_connect_timeout 1s;
    proxy_timeout 3s;
    access_log /var/log/nginx/slb_test_apiserver_local.log proxy;
}

### 啓動 proxy
[root@tvm-03 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
[root@tvm-03 ~]# systemctl start nginx.service
[root@tvm-03 ~]# systemctl enable nginx.service

###切換 apiserver 準備測試
[root@tvm-02 ~]# sed -i 's#10.10.9.69:6443#kubernetes.default.svc.cluster.local:7443#' ~/.kube/config
[root@tvm-02 ~]# kubectl get nodes
[root@tvm-02 ~]# kubectl get nodes
[root@tvm-02 ~]# grep kube /etc/hosts
10.10.9.74 kubernetes.default.svc.cluster.local
[root@tvm-02 ~]# kubectl cluster-info
Kubernetes master is running at https://kubernetes.default.svc.cluster.local:7443
KubeDNS is running at https://kubernetes.default.svc.cluster.local:7443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

### 查看 proxy 上的日誌
[root@tvm-03 ~]# tail /var/log/nginx/slb_test_apiserver_local.log
10.10.9.69 [03/Jan/2018:12:34:13 +0800] TCP 200 26209 1947 0.217 "10.10.9.68:6443" "1947" "26209" "0.000"
10.10.9.69 [03/Jan/2018:12:34:15 +0800] TCP 200 26209 1947 0.284 "10.10.9.69:6443" "1947" "26209" "0.000"

###符合預期,下一步可以配置這個 LB 的高可用,擴容到 2 節點,通過 keepalived 之類到服務來提供 vip 服務即可。

ZYXW、參考

  1. 阿里雲-SLB-後端服務器常見問題-後端ECS實例爲什麼訪問不了負載均衡服務?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章