天天看點

使用Kubespray 2.8.3部署生産可用的Kubernetes叢集(1.12.5)

使用Kubespray 2.8.3部署生産可用的Kubernetes叢集(1.12.5)

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,執行如下指令即可。

  1. ~]# setenforce 0

  2. ~]# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

1.2 網絡配置

在master機器上

  1. ~]# firewall-cmd --permanent --add-port=6443/tcp

  2. ~]# firewall-cmd --permanent --add-port=2379-2380/tcp

  3. ~]# firewall-cmd --permanent --add-port=10250/tcp

  4. ~]# firewall-cmd --permanent --add-port=10251/tcp

  5. ~]# firewall-cmd --permanent --add-port=10252/tcp

  6. ~]# firewall-cmd --permanent --add-port=10255/tcp

  7. ~]# firewall-cmd --reload

  8. ~]# modprobe br_netfilter

  9. ~]# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables

  10. ~]# sysctl -w net.ipv4.ip_forward=1

如果關閉了防火牆,則隻需執行最下面三行。

在node機器上

  1. ~]# firewall-cmd --permanent --add-port=10250/tcp

  2. ~]# firewall-cmd --permanent --add-port=10255/tcp

  3. ~]# firewall-cmd --permanent --add-port=30000-32767/tcp

  4. ~]# firewall-cmd --permanent --add-port=6783/tcp

  5. ~]# firewall-cmd --reload

  6. ~]# modprobe br_netfilter

  7. ~]# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables

  8. ~]# sysctl -w net.ipv4.ip_forward=1

如果關閉了防火牆,則隻需執行最下面兩行。

【可選】關閉防火牆

  1. systemctl stop firewalld

二、在ansible-client機器上安裝必備軟體

  1. # 安裝epel源

  2. ~]# sudo yum install -y epel-release

  3. # 安裝ansible

  4. ~]# sudo yum install -y ansible

  5. # 安裝Python 3.6

  6. ~]# sudo yum install –y python36

三、在ansible-client機器上配置免密登入其他機器

3.1 生成ssh公鑰和私鑰

在ansible-cilent機器上執行:

  1. ~]# ssh-keygen

然後三次回車,生成ssh公鑰和私鑰。

3.2 建立ssh單向通道

  1. ~]# ssh-copy-id [email protected] #将公鑰分發給88機器

  2. ~]# ssh-copy-id [email protected]

  3. ~]# ssh-copy-id [email protected]

  4. ~]# ssh-copy-id [email protected]

  5. ~]# 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分支。
  1. ~]# git clone https://github.com/kubernetes-incubator/kubespray.git

  2. ~]# cd kubespray

  3. ~]# git checkout v2.8.3

4.2 安裝kubespray需要的包:

  1. ~]# sudo pip install -r requirements.txt

4.3 拷貝 

inventory/sample

 ,命名為 

inventory/mycluster

 ,mycluster可以改為其他你喜歡的名字

  1. cp -rfp inventory/sample inventory/mycluster

4.4 使用inventory_builder,初始化inventory檔案

  1. ~]# declare -a IPS=(172.21.240.65 172.21.240.66 172.21.240.67 172.21.240.68 172.21.240.69)

  2. ~]# CONFIG_FILE=inventory/mycluster/hosts.ini python36 contrib/inventory_builder/inventory.py ${IPS[@]}

此時,會看到 

inventory/mycluster/host.ini

 檔案内容類似如下:

  1. [all]

  2. node1 ansible_host=172.21.240.65 ip=172.21.240.65

  3. node2 ansible_host=172.21.240.66 ip=172.21.240.66

  4. node3 ansible_host=172.21.240.67 ip=172.21.240.67

  5. node4 ansible_host=172.21.240.68 ip=172.21.240.68

  6. node5 ansible_host=172.21.240.69 ip=172.21.240.69

  7. [kube-master]

  8. node1

  9. node2

  10. [etcd]

  11. node1

  12. node2

  13. node3

  14. [kube-node]

  15. node1

  16. node2

  17. node3

  18. node4

  19. node5

  20. [k8s-cluster:children]

  21. kube-master

  22. kube-node

  23. [calico-rr]

  24. [vault]

  25. node1

  26. node2

  27. node3

4.5 使用ansible playbook部署kubespray

  1. ~]# ansible-playbook -i inventory/mycluster/hosts.ini --become --become-user=root cluster.yml

4.6 等待大概20分鐘左右,Kubernetes即可安裝完畢。

五、驗證

5.1 驗證1:檢視Node狀态

主要是驗證各個Node是否正常。

  1. ]# kubectl get nodes

  2. NAME STATUS ROLES AGE VERSION

  3. node1 Ready master,node 8m41s v1.12.5

  4. node2 Ready master,node 7m32s v1.12.5

  5. node3 Ready node 6m59s v1.12.5

  6. node4 Ready node 6m59s v1.12.5

  7. node5 Ready node 6m59s v1.12.5

每個node都是ready的,說明OK。

5.2 驗證2:部署一個NGINX

主要是驗證網絡等是否正常,步驟如下。

1 在Master所在節點(本文使用的是 

172.21.240.66

 ),準備一個名為 

nginx.yaml

 的檔案,内容如下:

  1. kind: Service

  2. apiVersion: v1

  3. metadata:

  4. name: nginx-service

  5. spec:

  6. selector:

  7. app: nginx

  8. type: NodePort

  9. ports:

  10. # 協定:

  11. - protocol: TCP

  12. # service的端口,随便寫

  13. port: 80

  14. targetPort: 80

  15. nodePort: 32000

  16. ---

  17. apiVersion: apps/v1

  18. kind: Deployment

  19. metadata:

  20. name: nginx-deployment

  21. # 描述Deployment的标簽,讓Deployment變得可讀

  22. labels:

  23. app: nginx

  24. spec:

  25. replicas: 3

  26. selector:

  27. # label selector 标簽選擇器,他會找到帶有app: nginx的所有pod

  28. matchLabels:

  29. app: nginx

  30. template:

  31. # Pod模闆開始

  32. metadata:

  33. # 定義這些pod帶有哪些标簽

  34. labels:

  35. app: nginx

  36. spec:

  37. containers:

  38. - name: nginx

  39. image: nginx:1.7.9

  40. ports:

  41. - containerPort: 80

2 在該檔案所在目錄執行如下指令建立Service以及Deployment

  1. kubectl create -f nginx.yaml

如内容所示,該NGINX以NodePort方式暴露到Kubernetes叢集外部,端口為32000。

3 執行如下指令驗證:

  1. # 檢視nginx服務詳情

  2. ~]# kubectl get svc nginx-service

  3. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

  4. nginx-service NodePort 10.233.59.132 <none> 80:32000/TCP 4m56s

  5. # 通路測試,如果能夠正常傳回NGINX首頁,說明正常

  6. ~]# curl 172.21.240.66:32000

六、解除安裝Kubespray

  1. ]# 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/

您的關注是對我最大的支援!

繼續閱讀