Kubernetes的安裝部署是難中之難,每個版本安裝方式都略有區別。筆者一直想找一種支持多平臺
、相對簡單
、適用於生產環境
的部署方案。經過一段時間的調研,有如下幾種解決方案進入筆者視野:
部署方案 | 優點 | 缺點 |
---|---|---|
Kubeadm | 官方出品 | 部署較麻煩、不夠透明 |
Kubespray | 官方出品、部署較簡單、懂Ansible就能上手 | 不夠透明 |
RKE | 部署較簡單、需要花一些時間瞭解RKE的cluster.yml配置文件 | 不夠透明 |
手動部署 第三方操作文檔 | 完全透明、可配置、便於理解K8s各組件之間的關係 | 部署非常麻煩,容易出錯 |
其他諸如Kops之類的方案,由於無法跨平臺,或者其他因素,被我pass了。
最終,筆者決定使用Kubespray部署Kubernetes集羣。也希望大家能夠一起討論,總結出更加好的部署方案。
廢話不多說,以下是操作步驟。
注:撰寫本文時,筆者臨時租賃了幾臺海外阿里雲機器,所以不存在無法連接gcr.io的問題。如果您的服務器在國內,請:
- 考慮科學上網
- 修改Kubespray中的gcr地址,改爲其他倉庫地址,例如阿里雲鏡像地址(修改
roles/download/defaults/main.yml
即可)- 先弄個海外環境,安裝完Kubernetes後,將鏡像
docker save
下來,再到國內的服務器上docker load
。
主機規劃
IP | 作用 |
---|---|
172.21.240.64 | ansible-client |
172.21.240.65 | master,node |
172.21.240.66 | master,node |
172.21.240.67 | node |
172.21.240.68 | node |
172.21.240.69 | node |
準備工作
關閉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
~]# modprobe br_netfilter
~]# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
~]# sysctl -w net.ipv4.ip_forward=1
如果關閉了防火牆,則只需執行最下面兩行。
【可選】關閉防火牆
systemctl stop firewalld
在ansible-client機器上安裝必備軟件
# 安裝epel源
~]# sudo yum install -y epel-release
# 安裝ansible
~]# sudo yum install -y ansible
# 安裝Python 3.6
~]# sudo yum install –y python36
在ansible-client機器上配置免密登錄其他機器
生成ssh公鑰和私鑰
在ansible-cilent機器上執行:
~]# ssh-keygen
然後三次回車,生成ssh公鑰和私鑰。
建立ssh單向通道
在ansible-cilent機器上執行:
~]# ssh-copy-id [email protected] #將公鑰分發給88機器
~]# ssh-copy-id [email protected]
~]# ssh-copy-id [email protected]
~]# ssh-copy-id [email protected]
~]# ssh-copy-id [email protected]
在ansible-client機器上安裝kubespray
-
下載kubespray
TIPS:
- 筆者撰寫本文時,最新的RELEASE是2.8.3,RELEASE版本下載地址:<https://github.com/kubernetes-incubator/kubespray/releases>)
- 強烈大家使用RELEASE分支進行部署,特別是在生產環境!Master分支不一定能部署成功,近日有童鞋無法成功部署就是因爲使用的Master分支。
~]# git clone https://github.com/kubernetes-incubator/kubespray.git ~]# cd kubespray ~]# git checkout v2.8.3
-
安裝kubespray需要的包:
~]# sudo pip install -r requirements.txt
-
拷貝
inventory/sample
,命名爲inventory/mycluster
,mycluster可以改爲其他你喜歡的名字cp -rfp inventory/sample inventory/mycluster
-
使用inventory_builder,初始化inventory文件
~]# declare -a IPS=(172.21.240.65 172.21.240.66 172.21.240.67 172.21.240.68 172.21.240.69) ~]# CONFIG_FILE=inventory/mycluster/hosts.ini python36 contrib/inventory_builder/inventory.py ${IPS[@]}
此時,會看到
inventory/mycluster/host.ini
文件內容類似如下:[all] node1 ansible_host=172.21.240.65 ip=172.21.240.65 node2 ansible_host=172.21.240.66 ip=172.21.240.66 node3 ansible_host=172.21.240.67 ip=172.21.240.67 node4 ansible_host=172.21.240.68 ip=172.21.240.68 node5 ansible_host=172.21.240.69 ip=172.21.240.69 [kube-master] node1 node2 [etcd] node1 node2 node3 [kube-node] node1 node2 node3 node4 node5 [k8s-cluster:children] kube-master kube-node [calico-rr] [vault] node1 node2 node3
-
使用ansible playbook部署kubespray
~]# ansible-playbook -i inventory/mycluster/hosts.ini --become --become-user=root cluster.yml
- 等待大概20分鐘左右,Kubernetes即可安裝完畢。
驗證
驗證1:查看Node狀態
主要是驗證各個Node是否正常。
]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready master,node 8m41s v1.12.5
node2 Ready master,node 7m32s v1.12.5
node3 Ready node 6m59s v1.12.5
node4 Ready node 6m59s v1.12.5
node5 Ready node 6m59s v1.12.5
每個node都是ready的,說明OK。
驗證2:部署一個NGINX
主要是驗證網絡等是否正常,步驟如下。
-
在Master所在節點(本文使用的是
172.21.240.66
),準備一個名爲nginx.yaml
的文件,內容如下:kind: Service apiVersion: v1 metadata: name: nginx-service spec: selector: app: nginx type: NodePort ports: # 協議: - protocol: TCP # service的端口,隨便寫 port: 80 targetPort: 80 nodePort: 32000 --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment # 描述Deployment的標籤,讓Deployment變得可讀 labels: app: nginx spec: replicas: 3 selector: # label selector 標籤選擇器,他會找到帶有app: nginx的所有pod matchLabels: app: nginx template: # Pod模板開始 metadata: # 定義這些pod帶有哪些標籤 labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
-
在該文件所在目錄執行如下命令創建Service以及Deployment
kubectl create -f nginx.yaml
如內容所示,該NGINX以NodePort方式暴露到Kubernetes集羣外部,端口爲32000。
-
執行如下命令驗證:
# 查看nginx服務詳情 ~]# kubectl get svc nginx-service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-service NodePort 10.233.59.132 <none> 80:32000/TCP 4m56s # 訪問測試,如果能夠正常返回NGINX首頁,說明正常 ~]# curl 172.21.240.66:32000
卸載Kubespray
]# ansible-playbook -i inventory/mycluster/hosts.ini reset.yml
參考文檔:
-
Kubespray – 10 Simple Steps for Installing a Production-Ready, Multi-Master HA Kubernetes Cluster:<https://dzone.com/articles/kubespray-10-simple-steps-for-installing-a-product>
TIPS:主要參考文檔,裏面還講解了Kubespray的一些配置、可能會遇到的問題及解決方案等。
-
使用Kubespray 部署kubernetes 高可用集羣:<https://yq.aliyun.com/articles/505382>
-
kubespray(ansible)自動化安裝k8s集羣:<https://www.cnblogs.com/iiiiher/p/8128184.html> / <https://www.jianshu.com/p/d8bee7c8a1e6>
TIPS:裏面有將如何替換gcr鏡像爲國內鏡像
- Installing Kubernetes On-premises/Cloud Providers with Kubespray:<https://kubernetes.io/docs/setup/custom-cloud/kubespray/>
Docker與Kubernetes開源書
本文首發
http://www.itmuch.com/install/kubernetes-deploy-by-kubespray2.8.3/