在單機上使用Kubeadm-dind 部署多節點k8s叢集
近幾年Google的Kubernetes(簡稱k8s)已經成為分散式容器編排和管理領域事實上的標準,在基於容器的微服務架構下的分散式應用開發、部署和運維管理等領域,會有越來越多的使用者部署和使用k8s平臺。對於初學著來說,部署一個多機k8s叢集一來缺少環境、另外也相對比較複雜。為了滿足使用者嘗試和使用的便利性需要,可以使用兩種方法在一個單機環境下(物理機或者虛擬機器)部署一個k8s環境:
- Minikube: 這種方式是Google推薦的本地(單機)部署方法,它在一個虛擬機器(或物理機)上部署一個單節點k8s叢集,用於開發或測試。
- kubeadm-dind: 這種方式是在一個虛擬機器(或物理機)上部署一個多節點k8s叢集(Minikube是單節點),它要求在虛擬機器上有一個docker daemon執行。kubeadm-dind使用docker-in-docker(簡稱DinD)技術在虛擬機器上首先以容器的方式啟動k8s的多個節點(master節點和多個woker node節點),然後在節點內部再啟動若干容器執行k8s相應的元件以完成部署一個k8s叢集。
本文將向大家介紹kubeadm-dind方式的k8s部署的方法。使用這種方法部署成功後,大家就可以在自己的單機環境下學習和使用k8s了。後面,我會在另一篇文章中介紹TiDB部署到k8s的方法,需要大家先按照本文的描述部署好一個kubeadm-dind方式下的k8s叢集。
環境要求說明:
- 機器資源:一個VM,2 vCPU 、4GB 記憶體
- 作業系統:CentOS 7.3或更高
- Docker:17.03或更高
- Kubectl:1.10.5或更高
- 網路:國內由於對很多google的站點進行了遮蔽,很多容器映象無法直接下載,所以要採用變通的方法,具體描述見本文後面的描述。如果讀者有條件的化,可以購買阿里雲或者UCloud海外雲主機,也可以解決這一問題。
下面是具體的部署方法和一些注意事項:
1. 安裝Docker
這裡介紹在CentoOS 7.4上安裝Docker 17.03社群版本的方法:
(1) 這裡建議國內讀者使用阿里雲映象安裝
#先安裝docker-ce-selinux,否則會報錯。
https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm
#安裝指定版本
yum install https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm
systemctl enable docker.service
systemctl start docker.service
(2) 設定docker映象
進入/etc/docker目錄,再輸入ls檢視裡面的檔案,沒有daemon.json檔案,那麼就自己建立這個檔案。
vi daemon.json開啟檔案,輸入下面的josn程式碼,按Esc退出編輯,最後輸入:wq儲存並退出。
{
"registry-mirrors":["https://hub-mirror.c.163.com"]
}
(3) 重啟docker daemon
systemctl stop docker.service
systemctl daemon-reload
systemctl start docker.service
2. 安裝kubectl
在/etc/yum.repos.d目錄中編輯kubernets.repo檔案,內容如下:
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 #使用阿里 雲k8s yum源
enabled=1
gpgcheck=0
執行如下命令,安裝kubectl:
yum install kubectl-1.10.5
3. 使用kubeadm-dind部署多節點k8s叢集
在一個單機或一個虛擬機器上,可以使用kubeadm-dind部署一個多節點k8s叢集,用於開發和測試。下面是具體的方法: (1)下載kubeadm-dind安裝指令碼
wget https://cdn.rawgit.com/kubernetes-sigs/kubeadm-dind-cluster/master/fixed/dind-cluster-v1.10.sh
(2) 設定指令碼執行許可權
chmod +x dind-cluster-v1.10.sh
(3) 設定環境變數
export NUM_NODES=2 #除master外的工作節點個數
export CNI_PLUGIN=flannel
export DASHBOARD_URL="kubernetes-dashboard.yaml"
注意:在使用dind-cluster-v1.10.sh 拉起k8s叢集時,需要修改kubernetes-dashboard.yaml的定義(原指令碼是從遠端下載的):
a.先執行如下命令下載yaml檔案
wget https://rawgit.com/kubernetes/dashboard/bfab10151f012d1acc5dfb1979f3172e2400aa3c/src/deploy/kubernetes-dashboard.yaml
b.修改kubernetes-dashboard.yaml,把imagePullPolicy: Always修改為imagePullPolicy: IfNotPresent,並修改環境變數 (上面的第3個變數) 。
(4) 執行指令碼部署叢集
./dind-cluster-v1.10.sh up
注意:在執行dind-cluster-v1.10.sh時,會在kube-master節點和kube-node-n節點上下載k8s相應的某些映象。如果是國內使用者,由於網路遮蔽的原因,這時就需要在dind-cluster指令碼執行到某個特定時候執行下面的指令碼下載映象(如果是國外的主機,則不需要執行)。下圖是在宿主機上的指令碼目錄情況:
在宿主機上執行上圖中的dind-cluster-v1.10.sh時,當部署進展到提示 " [init] This often takes around a minute; or longer if the control plane images have to be pulled." 時,需要執行do_getm.sh指令碼,讓master節點下載需要的k8s映象。
當部署進展到提示如下是,需要執行do_getn.sh,依次在每個work node節點上下載需要的k8s映象。
* Waiting for kube-proxy and the nodes
.................................................
下面是為了解決google被遮蔽不能直接下載映象問題所用到的指令碼:
--geti.sh (被do_getm.sh指令碼呼叫,在master節點上下載k8s相關映象,解決google被遮蔽問題)
#!/bin/bash
docker pull quay.io/coreos/flannel:v0.10.0-amd64
images=(etcd-amd64:3.1.12 pause-amd64:3.1 k8s-dns-sidecar-amd64:1.14.8 k8s-dns-kube-dns-amd64:1.14.8 k8s-dns-dnsmasq-nanny-amd64:1.14.8 kubernetes-dashboard-amd64:v1.6.0)
for imageName in ${images[@]} ; do
docker pull keveon/$imageName
docker tag keveon/$imageName k8s.gcr.io/$imageName
docker rmi keveon/$imageName
done
docker tag k8s.gcr.io/kubernetes-dashboard-amd64:v1.6.0 gcr.io/google_containers/kubernetes-dashboard-amd64:v1.6.0
docker rmi k8s.gcr.io/kubernetes-dashboard-amd64:v1.6.0
-- do_getm.sh (在宿主機節點上執行)
#!/bin/bash
master_id=$(docker ps | grep -i master | awk '{print $1}')
docker cp /root/geti.sh ${master_id}:/root
docker exec ${master_id} /root/geti.sh
-- geti_w.sh (被do_getn.sh指令碼呼叫,在worker節點上下載k8s相關映象,解決google被遮蔽問題)
#!/bin/bash
docker pull quay.io/coreos/flannel:v0.10.0-amd64
images=(pause-amd64:3.1 k8s-dns-sidecar-amd64:1.14.8 k8s-dns-kube-dns-amd64:1.14.8 k8s-dns-dnsmasq-nanny-amd64:1.14.8 kubernetes-dashboard-amd64:v1.6.0)
for imageName in ${images[@]} ; do
docker pull keveon/$imageName
docker tag keveon/$imageName k8s.gcr.io/$imageName
docker rmi keveon/$imageName
done
docker tag k8s.gcr.io/kubernetes-dashboard-amd64:v1.6.0 gcr.io/google_containers/kubernetes-dashboard-amd64:v1.6.0
docker rmi k8s.gcr.io/kubernetes-dashboard-amd64:v1.6.0
--do_getn.sh (在宿主機節點上執行)
#!/bin/bash
for node_id in $(docker ps | grep -v master | grep -vi container | awk '{print $1}') ; do
echo $node_id
docker cp /root/geti_w.sh ${node_id}:/root/geti.sh
docker exec ${node_id} /root/geti.sh
done
4. 檢查k8s部署情況
在宿主機上執行成功執行完dind-cluster-v1.10.sh指令碼之後,可以執行kubectl get nodes檢視執行情況。下圖是本人機器的示例輸出:
執行 kubectl get pod -n kube-system -o wide,可以看到pod的執行情況