當前位置:
首頁 > 知識 > 使用Kubespray部署生產可用的Kubernetes集群

使用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。

使用Kubespray部署生產可用的Kubernetes集群

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

gcc/g++ 鏈接庫的編譯與鏈接
Python項目中跟蹤系統導入Zipkin

TAG:程序員小新人學習 |