用Kubeadm-dind單機部署單節點Kubernetes(k8s)

1 前言

近幾年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集羣。

2 環境要求說明

  • 機器資源:一個VM,2 vCPU 、4GB 內存
  • 操作系統:CentOS 7.3或更高
  • Docker:17.03或更高
  • Kubectl:1.10.5或更高
  • 網絡:國內由於對很多google的站點進行了屏蔽,很多容器鏡像無法直接下載,所以要採用變通的方法,具體描述見本文後面的描述。如果讀者有條件的化,可以購買阿里雲或者UCloud海外雲主機,也可以解決這一問題。
    筆者環境:i7-2600(8核),8G,3.10.0-327.el7.x86_64

3 部署步驟

3.1 卸載舊版本Docker

舊版本的Docker命名爲docker或docker-engine,如果有安裝舊版本,先卸載舊版本

sudo yum remove -y docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

3.2 安裝Docker

這裏介紹在CentoOS 7.4上安裝Docker 17.03社區版本的方法:

3.2.1 安裝docker-ce-selinux

先安裝docker-ce-selinux,否則會報錯。

yum install 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

3.2.2 安裝指定版本Docker

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

3.2.3 設置docker鏡像

進入/etc/docker目錄,再輸入ls查看裏面的文件,沒有daemon.json文件,那麼就自己創建這個文件。
vi daemon.json打開文件,輸入下面的josn代碼,按Esc退出編輯,最後輸入:wq保存並退出。

{
"registry-mirrors":["https://hub-mirror.c.163.com"]
}

3.2.4 重啓docker daemon

systemctl stop docker.service 
systemctl daemon-reload
systemctl start docker.service

3.3 安裝kubectl

3.3.1 編輯kubernets.repo

在/etc/yum.repos.d目錄中編輯kubernets.repo文件,內容如下:

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0

3.3.2 安裝kubectl

執行如下命令,安裝kubectl

yum install kubectl-1.10.5

3.4 使用kubeadm-dind部署單節點k8s集羣

在一個單機或一個虛擬機上,可以使用kubeadm-dind部署一個單節點k8s集羣,用於開發和測試。下面是具體的方法:

3.4.1 下載kubeadm-dind安裝腳本

wget https://cdn.rawgit.com/kubernetes-sigs/kubeadm-dind-cluster/master/fixed/dind-cluster-v1.10.sh

下載不了的童鞋,後面我會把連接提供給大家!

3.4.2 設置腳本執行權限

chmod +x dind-cluster-v1.10.sh

3.4.3 設置環境變量

export NUM_NODES=0  #除master外的工作節點個數,由於我們是單節點,只保留master即可
export CNI_PLUGIN=flannel
export DASHBOARD_URL="kubernetes-dashboard.yaml"

3.4.4 修改dashboard部署文件

在使用dind-cluster-v1.10.sh拉起k8s集羣時,需要修改kubernetes-dashboard.yaml的定義

  • 先下載kubernetes-dashboard.yaml
wget https://rawgit.com/kubernetes/dashboard/bfab10151f012d1acc5dfb1979f3172e2400aa3c/src/deploy/kubernetes-dashboard.yaml

下載不了的童鞋,後面我會把連接提供給大家

  • 修改kubernetes-dashboard.yaml
    把imagePullPolicy: Always修改爲imagePullPolicy: IfNotPresent
imagePullPolicy: IfNotPresent

3.4.5 執行腳本部署集羣

./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鏡像。

腳本代碼如下:

  • geti.sh文件(被do_getm.sh腳本調用,在master節點上下載k8s相關鏡像,解決google被屏蔽問題)
#!/bin/bash
db_ver=v1.6.0                                                                                                                                                                                                     
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:$db_ver)
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:$db_ver gcr.io/google_containers/kubernetes-dashboard-amd64:$db_ver
docker rmi k8s.gcr.io/kubernetes-dashboard-amd64:$db_ver
  • do_getm.sh文件(在宿主機節點上執行)
#!/bin/bash
master_id=$(docker ps | grep -i master | awk '{print $1}')
docker cp geti.sh ${master_id}:/root                                                                                                                                                                              
docker exec ${master_id} /root/geti.sh

4.問題總結

4.1 docker倉庫

這裏用的是keveon的docker倉庫, 可以解決國內用戶不能正確下載鏡像的問題。

4.2 關於dashboard版本

實測:
1.6.0 英文界面
1.6.3 中文界面
1.8.3 中文界面
>>可以通過修改kubernetes-dashboard.yaml,geti.sh中的版本號實現對dashboard版本的修改!

4.3 解決dashboard服務起來後,訪問不了的問題

此例中使用的是Nodeport方式。
現象:

  1. 通過命令kubectl get pod -n kube-system 可以發現dashboard已經處於running狀態
  2. 進入master節點裏面,發現可以訪問10.244.0.5:9090。
  3. 宿主機ping不通10.244.0.5
  4. 查看路由發現沒有10.244.0.0/24的路由

解決:

  1. 添加一條到node裏面的路由
route add -net 10.244.0.0 netmask 255.255.255.0 gw 10.192.0.2 
  1. 添加dnat
    iptables -t nat -A PREROUTING -d 172.18.100.228 -p tcp -m tcp --dport 30001 -j DNAT --to-destination 10.244.0.5:9090

4.4 安裝失敗,如何重新安裝?

執行下面命令:

./dind-cluster-v1.10.sh down #關閉所有節點
./dind-cluster-v1.10.sh clean #清理

5.參考

  1. 在單機上使用Kubeadm-dind 部署多節點k8s集羣
  2. kubernetes中port、target port、node port的對比分析,以及kube-proxy代理

6.其他比較不錯的資料(待驗證)

  1. 深入玩轉K8S之使用kubeadm安裝Kubernetes v1.10以及常見問題解答
  2. 使用 kubeadmin 離線部署 kubernetes1.9
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章