1. 程式人生 > >在單機上使用Kubeadm-dind 部署多節點k8s叢集

在單機上使用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的執行情況