使用Kubespray部署生產可用的Kubernetes集群
Kubernetes的安裝部署是難中之難,每個版本安裝方式都略有區別。筆者一直想找一種支持多平台 、相對簡單 、適用於生產環境 的部署方案。經過一段時間的調研,有如下幾種解決方案進入筆者視野:
部署方案優點缺點Kubeadm官方出品部署較麻煩、不夠透明Kubespray官方出品、部署較簡單、懂Ansible就能上手不夠透明RKE部署較簡單、需要花一些時間了解RKE的cluster.yml配置文件不夠透明手動部署 第三方操作文檔完全透明、可配置、便於理解K8s各組件之間的關係部署非常麻煩,容易出錯
其他諸如Kops之類的方案,由於無法跨平台,或者其他因素,被我pass了。
最終,筆者決定使用Kubespray部署Kubernetes集群。也希望大家能夠一起討論,總結出更加好的部署方案。
廢話不多說,以下是操作步驟。
<!-- more -->
註:撰寫本文時,筆者臨時租賃了幾台海外阿里雲機器,實現了科學上網。如果您的機器在國內,請:
- 考慮科學上網
- 或修改Kubespray中的gcr地址,改為其他倉庫地址,例如阿里雲鏡像地址。
主機規劃
IP作用172.20.0.87ansible-client172.20.0.88master,node172.20.0.89master,node172.20.0.90node172.20.0.91node172.20.0.92node
準備工作關閉selinux所有機器都必須關閉selinux,執行如下命令即可。
~]# setenforce 0
~]# sed -i --follow-symlinks "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux
網路配置在master機器上
~]# firewall-cmd --permanent --add-port=6443/tcp
~]# firewall-cmd --permanent --add-port=2379-2380/tcp
~]# firewall-cmd --permanent --add-port=10250/tcp
~]# firewall-cmd --permanent --add-port=10251/tcp
~]# firewall-cmd --permanent --add-port=10252/tcp
~]# firewall-cmd --permanent --add-port=10255/tcp
~]# firewall-cmd --reload
~]# modprobe br_netfilter
~]# echo "1" > /proc/sys/net/bridge/bridge-nf-call-iptables
~]# sysctl -w net.ipv4.ip_forward=1
如果關閉了防火牆,則只需執行最下面三行。
在node機器上~]# firewall-cmd --permanent --add-port=10250/tcp
~]# firewall-cmd --permanent --add-port=10255/tcp
~]# firewall-cmd --permanent --add-port=30000-32767/tcp
~]# firewall-cmd --permanent --add-port=6783/tcp
~]# firewall-cmd --reload
~]# echo "1" > /proc/sys/net/bridge/bridge-nf-call-iptables
~]# sysctl -w net.ipv4.ip_forward=1
如果關閉了防火牆,則只需執行最下面兩行。
【可選】關閉防火牆systemctl stop firewalld
在ansible-client機器上安裝ansible安裝ansible
~]# sudo yum install epel-release
~]# sudo yum install ansible
安裝jinja2
~]# easy_install pip
~]# pip2 install jinja2 --upgrade
如果執行pip2 install jinja2 --upgrade 出現類似如下的提示:
You are using pip version 9.0.1, however version 18.0 is available.
You should consider upgrading via the "pip install --upgrade pip" command.
則執行pip install --upgrade pip 升級pip,再執行pip2 install jinja2 --upgrade
安裝Python 3.6~]# sudo yum install python36 –y
在ansible-client機器上配置免密登錄生成ssh公鑰和私鑰
在ansible-cilent機器上執行:
~]# ssh-keygen
然後三次回車,生成ssh公鑰和私鑰。
建立ssh單向通道在ansible-cilent機器上執行:
~]# ssh-copy-id root@172.20.0.88 #將公鑰分發給88機器
~]# ssh-copy-id root@172.20.0.89
~]# ssh-copy-id root@172.20.0.90
~]# ssh-copy-id root@172.20.0.91
~]# ssh-copy-id root@172.20.0.92
在ansible-client機器上安裝kubespray
1 下載kubespray
TIPS:本文下載的是master分支,如果大家要部署到線上環境,建議下載RELEASE分支。筆者撰寫本文時,最新的RELEASE是2.6.0,RELEASE版本下載地址:https://github.com/kubernetes-incubator/kubespray/releases)
~]# git clone https://github.com/kubernetes-incubator/kubespray.git
2 安裝kubespray需要的包:
~]# cd kubespray
~]# sudo pip install -r requirements.txt
3 拷貝inventory/sample ,命名為inventory/mycluster ,mycluster可以改為其他你喜歡的名字
cp -r inventory/sample inventory/mycluster
4 使用inventory_builder,初始化inventory文件
~]# declare -a IPS=(172.20.0.88 172.20.0.89 172.20.0.90 172.20.0.91 172.20.0.92)
~]# CONFIG_FILE=inventory/mycluster/hosts.ini python36 contrib/inventory_builder/inventory.py ${IPS[@]}
此時,會看到inventory/mycluster/host.ini 文件內容類似如下:
[k8s-cluster:children]
kube-master
kube-node
[all]
node1 ansible_host=172.20.0.88 ip=172.20.0.88
node2 ansible_host=172.20.0.89 ip=172.20.0.89
node3 ansible_host=172.20.0.90 ip=172.20.0.90
node4 ansible_host=172.20.0.91 ip=172.20.0.91
node5 ansible_host=172.20.0.92 ip=172.20.0.92
[kube-master]
node1
node2
[kube-node]
node1
node2
node3
node4
node5
[etcd]
node1
node2
node3
[calico-rr]
[vault]
node1
node2
node3
5 使用ansible playbook部署kubespray
~]# ansible-playbook -i inventory/mycluster/hosts.ini cluster.yml
6 大概20分鐘左右,Kubernetes即可安裝完畢。
驗證驗證1:查看Node狀態
]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready master,node 2m v1.11.2
node2 Ready master,node 2m v1.11.2
node3 Ready node 2m v1.11.2
node4 Ready node 2m v1.11.2
node5 Ready node 2m v1.11.2
每個node都是ready的,說明OK。
驗證2:部署一個NGINX
# 啟動一個單節點nginx
]# kubectl run nginx --image=nginx:1.7.9 --port=80
# 為「nginx」服務暴露埠
]# kubectl expose deployment nginx --type=NodePort
# 查看nginx服務詳情
]# kubectl get svc nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx NodePort 10.233.29.96 <none> 80:32345/TCP 14s
# 訪問測試,如果能夠正常返回NGINX首頁,說明正常
]# curl localhost:32345
卸載
]# ansible-playbook -i inventory/mycluster/hosts.ini reset.yml
遇到的問題
Calico網路插件部署失效。這是Calico 3.2所帶來的問題,原因詳見:https://github.com/kubernetes-incubator/kubespray/issues/3223
解決方法:https://github.com/wilmardo/kubespray/commit/1c87a49d1443bcdd237500a714f1a60d680c1ad8 ,即:將Calico降級到3.1.3。
※gcc/g++ 鏈接庫的編譯與鏈接
※Python項目中跟蹤系統導入Zipkin
TAG:程序員小新人學習 |