
18年9月,筆者撰寫了 使用Kubespray部署生産可用的Kubernetes叢集(1.11.2) ,當時Kubespray釋出到2.6.0,近日有童鞋回報,這篇文章對最新的Kubespray(2.8.3)無法完全适用。
故而編寫本文。
Kubernetes的安裝部署是難中之難,每個版本安裝方式都略有差別。筆者一直想找一種
支援多平台
、
相對簡單
、
适用于生産環境
的部署方案。經過一段時間的調研,有如下幾種解決方案進入筆者視野:
部署方案 | 優點 | 缺點 |
---|---|---|
Kubeadm(https://github.com/kubernetes/kubeadm) | 官方出品 | 部署較麻煩、不夠透明 |
Kubespray(https://github.com/kubernetes-sigs/kubespray) | 官方出品、部署較簡單、懂Ansible就能上手 | 不夠透明 |
RKE(https://github.com/rancher/rke) | 部署較簡單、需要花一些時間了解RKE的cluster.yml配置檔案 | |
手動部署,操作文檔(https://github.com/opsnull/follow-me-install-kubernetes-cluster) | 完全透明、可配置、便于了解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 | |
172.21.240.67 | node |
172.21.240.68 | |
172.21.240.69 |
一、準備工作
1.1 關閉selinux
所有機器都必須關閉selinux,執行如下指令即可。
-
~]# setenforce 0
-
~]# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
1.2 網絡配置
在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機器上配置免密登入其他機器
3.1 生成ssh公鑰和私鑰
在ansible-cilent機器上執行:
-
~]# ssh-keygen
然後三次回車,生成ssh公鑰和私鑰。
3.2 建立ssh單向通道
-
~]# 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
4.1 下載下傳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
4.2 安裝kubespray需要的包:
-
~]# sudo pip install -r requirements.txt
4.3 拷貝
inventory/sample
,命名為
inventory/mycluster
,mycluster可以改為其他你喜歡的名字
-
cp -rfp inventory/sample inventory/mycluster
4.4 使用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
4.5 使用ansible playbook部署kubespray
-
~]# ansible-playbook -i inventory/mycluster/hosts.ini --become --become-user=root cluster.yml
4.6 等待大概20分鐘左右,Kubernetes即可安裝完畢。
五、驗證
5.1 驗證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。
5.2 驗證2:部署一個NGINX
主要是驗證網絡等是否正常,步驟如下。
1 在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
2 在該檔案所在目錄執行如下指令建立Service以及Deployment
-
kubectl create -f nginx.yaml
如内容所示,該NGINX以NodePort方式暴露到Kubernetes叢集外部,端口為32000。
3 執行如下指令驗證:
-
# 檢視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
七、參考文檔
1 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的一些配置、可能會遇到的問題及解決方案等。
2 使用Kubespray 部署kubernetes 高可用叢集:https://yq.aliyun.com/articles/505382
TIPS:裡面有将如何替換gcr鏡像為國内鏡像
4 Installing Kubernetes On-premises/Cloud Providers with Kubespray:https://kubernetes.io/docs/setup/custom-cloud/kubespray/