阿里雲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. 規劃
坑:
- 上網問題,因爲只有一個EIP,所有其它節點只能通過代理上網;
- 負載均衡問題,因爲阿里不支持LVS,負載均衡TCP方式後端又不支持訪問負載均衡,HTTP和HTTPS方式,只支持後端協議爲HTTP;
爲了避免上面的坑,作以下規劃:
- Kubernetes master 3臺100G,硬盤掛載到
/data
下,/data/etcd
作軟鏈接到/var/lib/etcd
。節點不作調度分配一般POD;SLB設置kubeadm init
這臺master1作爲後端,方式爲TCP,且在master1上docker中安裝haproxy和keepalived解決自己不能連接VIP問題; - 3臺150G硬盤作爲ceph osd,機器也作爲Kubernetes nodes;
- EIP綁定到node5,安裝squid作爲所有節點上網代理,安裝ansible作爲管理分發文件,也作爲SSH管理跳板機;
- 生成一套ssh key, 複製ssh私鑰到所有節點,添加公鑰到所有節點,考慮到安全性,部署完成後,刪除除node5上的私鑰;
- 配置yum、docker ce使用代理上網;
- 版本信息
操作系統:CentOS7
Kubernetes:v1.12.3
Docker CE:docker-ce-18.06.1.ce
podSubnet:10.244.0.0/16
網絡插件:canal
3. 部署
先解決上網問題:
- 將EIP綁定到node5,並安裝squid;
- 申請阿里內網免費SLB,將node5的3128端口使用TCP方式負載均衡;
- 在除node5的節點上,
~/.bashrc
後面添加以下內容:export http_proxy=http://squid_slb_ip:3128 export https_proxy=http://squild_slb_ip:3128 export no_proxy=''
- 在除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。總之,很折騰。