離線安裝 k8s 1.5 高可用叢集
經常遇到全新初始安裝k8s叢集的問題,所以想著搞成離線模式,本著最小依賴原則,採用純shell指令碼編寫
基於Centos7-1503-minimal執行指令碼測試OK, 預設安裝docker1.12.3 etcd-v3.0.15 k8s-v1.5.1
本離線安裝所有的依賴都打包放到了 ofollow,noindex">百度網盤 ,不放心安全的,可自行打包替換,就是些映象tar包和rpms
簡要說明
- 基於kubeadm搭建的 kubernetes1.5 HA高可用叢集
- HA環境,需要先存在etcd叢集,可使用etcd目錄下的一鍵部署etcd叢集指令碼
- 預設master和etcd部署在同一臺裝置,共三臺相互冗餘
- master間通過keepalived做主-從-從冗餘, controller和scheduler通過自帶的–leader-elect選項
- 如果只想部署單master的話, 可以修改腳本里KUBE_HA=false
- 如果想部署kubeadm的預設模式,即全面容器化但都單例項的方式,可以參考 這裡
- [TODO]現在的keepalived和etcd叢集沒用容器執行,後面有時間會嘗試做到全面容器化
- 下圖是官方ha模型,除了LB部分是用的keepalived的VIP功能, 此專案和官方基本一致

第一步
離線安裝的基本思路是,在k8s-deploy目錄下,臨時啟個http server, 節點上會從此拉取所依賴映象和rpms
# python -m SimpleHTTPServer Serving HTTP on 0.0.0.0 port 8000 ...
windows上可以用hfs臨時啟個http server, 自行google如何使用
master側
執行以下命令,初始化master, master側如果是單核的話,會因資源不足, dns安裝失敗。
curl -L http://192.168.56.1:8000/k8s-deploy.sh | bash -s master \ --api-advertise-addresses=192.168.56.103 \ --external-etcd-endpoints=http://192.168.56.100:2379,http://192.168.56.101:2379,http://192.168.56.102:2379
- 192.168.56.1:8000 是我的http-server, 注意要將k8s-deploy.sh 裡的HTTP-SERVER變數也改下
- –api-advertise-addresses 是VIP地址
- –external-etcd-endpoints 是你的etcd叢集地址,這樣kubeadm將不再生成etcd.yaml manifest檔案
- 記錄下你的token輸出, minion側需要用到
- 安裝docker時,如果之前裝過“不乾淨的”東西,可能會遇到依賴問題,我這裡會遇到systemd-python依賴問題, 解除安裝之,即可 yum remove -y systemd-python
replica master側
在replica master側執行下面的命令,會自動和第一個master組成冗餘
最好和第一個master建立免祕鑰認證,此過程需要從master那裡拷貝配置
curl -L http://192.168.56.1:8000/k8s-deploy.sh | bash -s replica \ --api-advertise-addresses=192.168.56.103 \ --external-etcd-endpoints=http://192.168.56.100:2379,http://192.168.56.101:2379,http://192.168.56.102:2379
重複上面的步驟之後,會有一個3例項的HA叢集,執行下面命令的時候可關閉第一個master,以驗證高可用
- 驗證vip漂移的網路影響ping 192.168.56.103
- 驗證kube-apiserver故障影響
while true; do kubectl get po -n kube-system; sleep 1; done
minion側
視自己的情況而定, 使用第一個master側生成的token, 注意這裡的56.103是你的VIP地址
curl -L http://192.168.56.1:8000/k8s-deploy.sh | bash -s join --token=6c96b6.ca1d13745c237904 192.168.56.103
總結
- 指令碼如果中間執行出錯,就會自動退出,自己手動執行下退出前的地方,找原因,解決後,繼續執行一開始的命令curl -L … |bash -s …
- 1.5.1,預設關閉了匿名訪問,可通過帶token的方式訪問API,參考 這裡
,
TOKEN=$(kubectl describe secret $(kubectl get secrets | grep default | cut -f1 -d ' ') | grep -E '^token' | cut -f2 -d':' | tr -d '\t') curl -k --tlsv1 -H "Authorization: Bearer $TOKEN" https://192.168.56.103:6443/api
當然也可以通過更改apiserver的啟動引數來開啟匿名訪問,自行google
- 1.5 與 1.3給我感覺最大的變化是網路部分, 1.5啟用了cni網路外掛 不需要像以前一樣非要把flannel和docker綁在一起了(先啟flannel才能啟docker)。具體可以看 這裡
本文轉自中文社群- 離線安裝 k8s 1.5 高可用叢集