阿里雲ECS搭建Kubernetes集羣踩坑記

阿里雲ECS搭建Kubernetes集羣踩坑記

[TOC]

1. 現有環境、資源

資源 數量 規格
EIP 1 5M帶寬
ECS 3 2 vCPU 16 GB內存 100G硬盤
ECS 3 2 vCPU 16 GB內存 150G硬盤
SLB 2 私網slb.s1.small

2. 規劃

坑:

  1. 上網問題,因爲只有一個EIP,所有其它節點只能通過代理上網;
  2. 負載均衡問題,因爲阿里不支持LVS,負載均衡TCP方式後端又不支持訪問負載均衡,HTTP和HTTPS方式,只支持後端協議爲HTTP;

爲了避免上面的坑,作以下規劃:

  1. Kubernetes master 3臺100G,硬盤掛載到/data下,/data/etcd作軟鏈接到/var/lib/etcd。節點不作調度分配一般POD;SLB設置kubeadm init這臺master1作爲後端,方式爲TCP,且在master1上docker中安裝haproxy和keepalived解決自己不能連接VIP問題;
  2. 3臺150G硬盤作爲ceph osd,機器也作爲Kubernetes nodes;
  3. EIP綁定到node5,安裝squid作爲所有節點上網代理,安裝ansible作爲管理分發文件,也作爲SSH管理跳板機;
  4. 生成一套ssh key, 複製ssh私鑰到所有節點,添加公鑰到所有節點,考慮到安全性,部署完成後,刪除除node5上的私鑰;
  5. 配置yum、docker ce使用代理上網;
  6. 版本信息
    操作系統:CentOS7
    Kubernetes:v1.12.3
    Docker CE:docker-ce-18.06.1.ce
    podSubnet:10.244.0.0/16
    網絡插件:canal

3. 部署

先解決上網問題:

  1. 將EIP綁定到node5,並安裝squid;
  2. 申請阿里內網免費SLB,將node5的3128端口使用TCP方式負載均衡;
  3. 在除node5的節點上,~/.bashrc後面添加以下內容:
    export http_proxy=http://squid_slb_ip:3128
    export https_proxy=http://squild_slb_ip:3128
    export no_proxy=''
  4. 在除node5的節點上執行以下命令(docker安裝後):
mkdir -p /etc/systemd/system/docker.service.d
cat >/etc/systemd/system/docker.service.d/http-proxy.conf<<EOF
[Service]
Environment="HTTP_PROXY=http://squid_slb_ip:3128" "HTTPS_PROXY=http://squid_slb_ip:3128" "NO_PROXY="
EOF

systemctl daemon-reload 
systemctl restart docker

3.1 master部署

先在阿里負載均衡申請內網免費SLB,設置master1的6443爲後端端口,8443爲監聽端口。
因Kubernetes apiserver爲https協議,阿里SLB中能負載均衡HTTPS的只有TCP方式,而TCP方式限制是負載均衡後端不能此負載均衡,所以爲了master1能訪問這個VIP,手動添加keepalived+haproxy:

先使用腳本初始化環境(需要能上網),腳本內變量INSTALL_CLUSTER="false",執行時詢問是否添加節點選否。
https://github.com/ygqygq2/kubernetes/blob/master/kubeadm/kubeadm_install_k8s.sh

mkdir /etc/haproxy
cat >/etc/haproxy/haproxy.cfg<<EOF
global
  log 127.0.0.1 local0 err
  maxconn 50000
  uid 99
  gid 99
  #daemon
  nbproc 1
  pidfile haproxy.pid

defaults
  mode http
  log 127.0.0.1 local0 err
  maxconn 50000
  retries 3
  timeout connect 5s
  timeout client 30s
  timeout server 30s
  timeout check 2s

listen admin_stats
  mode http
  bind 0.0.0.0:1080
  log 127.0.0.1 local0 err
  stats refresh 30s
  stats uri     /haproxy-status
  stats realm   Haproxy\ Statistics
  stats auth    admin:k8s
  stats hide-version
  stats admin if TRUE

frontend k8s-https
  bind 0.0.0.0:8443
  mode tcp
  #maxconn 50000
  default_backend k8s-https

backend k8s-https
  mode tcp
  balance roundrobin
  server lab1 master1_ip:6443 weight 1 maxconn 1000 check inter 2000 rise 2 fall 3  # 注意更換IP
EOF

docker run -d --name k8s-haproxy \
-v /etc/haproxy:/usr/local/etc/haproxy:ro \
-p 8443:8443 \
-p 1080:1080 \
--restart always \
haproxy:1.7.8-alpine

docker run --net=host --cap-add=NET_ADMIN \
-e KEEPALIVED_INTERFACE=eth0 \
-e KEEPALIVED_VIRTUAL_IPS="#PYTHON2BASH:['master_slb_ip']" \
-e KEEPALIVED_UNICAST_PEERS="#PYTHON2BASH:['maser1_ip'" \
-e KEEPALIVED_PASSWORD=k8s \
--name k8s-keepalived \
--restart always \
-d osixia/keepalived:1.4.4   

在master1上再次使用該腳本,設置好變量。
https://github.com/ygqygq2/kubernetes/blob/master/kubeadm/kubeadm_install_k8s.sh

INSTALL_CLUSTER="true"
# 是否安裝Keepalived+HAproxy
INSTALL_SLB="false"
# 定義Kubernetes信息
KUBEVERSION="v1.12.2"
DOCKERVERSION="docker-ce-18.06.1.ce"
# k8s master VIP(使用負載均衡IP)
k8s_master_vip="master_slb_ip"
# 主機名:IP,需要執行腳本前設置
server0="master1:master1_ip"
server1="master2:master2_ip"
server2="master3:master3_ip"

腳本執行後,至少是可以kubeadm init成功的,腳本過程中,會有命令提示,若master2和master3添加etcd集羣失敗,可手動按上面命令提示解決。

集羣健康後,修改master_slb的後端,添加master2和master3的6443。並將/etc/kubernetes/admin.conf~/.kube/config裏修改成
server: https://127.0.0.1:8443。因爲他們都爲master_slb後端,都不能訪問master_slb的IP了。而其它非master節點,則可以通過server: https://master_slb_ip:8443訪問。

3.2 添加node

將master1上的/etc/kubernetes/admin.conf拷貝爲node5上的~/.kube/config,並修改爲server: https://master_slb_ip:8443,這樣即可以node5上通過<br/>kubeadm token create --print-join-command獲取集羣添加命令。

在node5上繼續使用該腳本,設置好變量。
https://github.com/ygqygq2/kubernetes/blob/master/kubeadm/kubeadm_install_k8s.sh

INSTALL_CLUSTER="false"
# 可獲取kubeadm join命令的節點IP
k8s_join_ip="node5_ip"  # 腳本中是通過ssh到該IP變量獲取kubeadm join命令

執行腳本,即可添加節點成功。

4. 小結

因爲EIP只有一個,所以存在單點問題,當然可以通過添加EIP綁定ECS解決。因爲各種限制條件,沒有可以直接上網的私有云服務器好用,使用過程中,可能出現訪問不允許代理情況,或者部分地址不需要使用代理訪問。若後續Nginx ingress使用阿里SLB暴露服務,需要考慮nginx ingress是否爲HTTPS。總之,很折騰。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章