用Kubeadm-dind單機部署單節點k8s
- 1 前言
- 2 環境要求說明
- 3 部署步驟
-
- 3.1 解除安裝舊版本Docker
- 3.2 安裝Docker
-
- 3.2.1 安裝docker-ce-selinux
- 3.2.2 安裝指定版本Docker
- 3.2.3 設定docker鏡像
- 3.2.4 重新開機docker daemon
- 3.3 安裝kubectl
-
- 3.3.1 編輯kubernets.repo
- 3.3.2 安裝kubectl
- 3.4 使用kubeadm-dind部署單節點k8s叢集
-
- 3.4.1 下載下傳kubeadm-dind安裝腳本
- 3.4.2 設定腳本執行權限
- 3.4.3 設定環境變量
- 3.4.4 修改dashboard部署檔案
- 3.4.5 執行腳本部署叢集
- 4.問題總結
-
- 4.1 docker倉庫
- 4.2 關于dashboard版本
- 4.3 解決dashboard服務起來後,通路不了的問題
- 4.4 安裝失敗,如何重新安裝?
- 5.參考
- 6.其他比較不錯的資料(待驗證)
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方式。
現象:
- 通過指令kubectl get pod -n kube-system 可以發現dashboard已經處于running狀态
- 進入master節點裡面,發現可以通路10.244.0.5:9090。
- 主控端ping不通10.244.0.5
- 檢視路由發現沒有10.244.0.0/24的路由
解決:
- 添加一條到node裡面的路由
route add -net 10.244.0.0 netmask 255.255.255.0 gw 10.192.0.2
-
添加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.參考
- 在單機上使用Kubeadm-dind 部署多節點k8s叢集
- kubernetes中port、target port、node port的對比分析,以及kube-proxy代理
6.其他比較不錯的資料(待驗證)
- 深入玩轉K8S之使用kubeadm安裝Kubernetes v1.10以及常見問題解答
- 使用 kubeadmin 離線部署 kubernetes1.9