使用kubeadm安裝基於虛擬主機的Kubernetes集羣

介紹

Kubernetes是當下一個非常流行的容器調度工具,很多組織都在使用它。它是一個由雲原生基金會(Cloud Native Computing Foundation)管理的開源軟件。我們當中絕大多數人應該都知道如何安裝和使用Kubernetes,典型的Kubernetes架構如下圖:

用戶可以使用Minikube,Kind和Microk8s在單機的電腦上部署一個單點Kubernetes集羣。Katakoda也是一個不錯的選擇。這些都是一些很容易上手的部署工具。如果有人感興趣可以去我之前的文章(1, 2),裏面闡述瞭如何使用Minikube部署Kubernetes集羣並運行Spring Boot。

然而,當談到部署多點Kubernetes集羣時,有些人會覺得不知所措。Playground[3]就是一個不錯的選擇,這個工具可以幫助你創建一個多點集羣,並在線4個小時。雖然大部分創建的過程都是抽象的,但是我們還是能從中得到一些體驗的。如果希望在學習Kubernetes集羣時,有一個比較穩定的實驗環境,可以選擇一些公有云的產品,例如AWS的EKS,VMWare的Tanzu,Redhat的OpenShift或者Google的GKE。這些產品一般都會提供一段時間的試用期,或者一些初始使用的免費額度,這能讓一些程序員先屬性一下整個環境先,然後再考慮付費的事。但是,對自學的人來說,成本還是比較高的。

因此,對於這樣一類人羣,我覺得通過發佈這篇文章,應該能給他們提供一些幫助,幫助他們在自己的電腦上安裝配置一套多節點的基於虛擬主機Kubernetes集羣。整個流程是:先創建一個VM給Master節點,一個VM給Worker節點,然後初始化集羣,在集羣上部署工作負載,最後在集羣外訪問這些工作負載。下面是詳細步驟。

前期準備

硬件

需要創建集羣的個人電腦至少有100G硬盤空間,16GB內存。上面曾經提到的VM的最低配置如下:1個Master Node (15GB 硬盤和5GB內存),1個Worker Node (15GB 硬盤和4GB內存)。如果想添加更多的VM節點,電腦的資源又比較緊張,也可以嘗試把硬盤降到10GB,內存降到3GB。

軟件

電腦上還需要安裝兩個軟件,一個是Oracle的Virtual Box,安裝文檔在此[4]可以找到。Virtual Box 作爲整個環境的hypervisor層。另一個是VM的鏡像,我們可以使用Ubuntu的鏡像,可以在此[5]下載20.04版本。

這兩個是進行下一步的必要條件。

安裝Master節點

這一步我們需要在Virtual Box中創建一個Master節點虛機。打開Virtual Box,按CTRL+N或者在菜單欄選擇Machine->NEW。輸入VM的名字作爲Master,Type是Linux,版本爲Ubuntu(64-bit)。下圖作爲參考。

下一步選擇內存的大小,一般最低2048MB。下圖作爲參考。

下一步,選擇如下圖所示的“Create a virtual hard disk now”。

再下一步,選擇硬盤的類型爲VDI,如圖:

這裏,選擇硬盤尺寸爲Fixed Size,如圖:

最後,硬盤的尺寸我們設定爲15GB,如圖:

到這裏,新建的VM應該在Virtual Box裏已經可以顯示出來了。再把下載好的Ubuntu ISO鏡像文件添加上去。下面再設置網絡和CPU。

添加鏡像,選中VM,選擇Settings->System->Processor,數量設定爲3。如圖:

然後,單擊Storage Option來設定鏡像。選擇Storage->Controller:IDE->Empty,再點擊藍色CD圖標,下一步去IDE:Secondary Master,然後選擇Choose/Create a Virtual Optical Disk,選擇Ubuntu.iso的文件路徑。如圖:

下一步我們需要配置VM的網絡,我們得設置兩個網卡。第一個網卡配置爲橋接網絡(bridged network adapter)這樣可以使虛機可以訪問外部網絡。

第二個網卡設置爲僅主機的類型(Host-only adapter),這樣能使虛機和主機之間可以互相訪問。

當這些都配置完,按下OK即可以了。到這裏,虛機的硬件部分就完成了。下一步我們開始安裝Ubuntu操作系統以及創建用戶名密碼。在VirtualBox選中這個虛機,按下開始按鈕。隨後即進入Try Ubuntu和Install Ubuntu的圖形界面。選中Install Ubuntu,進入下面的安裝嚮導界面。

選擇最小化安裝(Minimal Installation option),後面根據個人所需,再選擇比較合適的選項。其中一步是創建用戶名密碼,輸入虛機的主機名,用戶名爲master,密碼和設置爲master,當然你也可以自定義這個密碼。隨後就進入安裝過程,最後安裝完成重啓即可。

下一步在master節點創建一些目錄,然後安裝Docker(容器引擎),kubeadm,kubelet以及kubectl(Kubernetes 客戶端)。所有這些都需要在super user的模式下進行。打開一個終端然後再運行下面的命令就可以直接完成上面的步驟。當然,如有需要,可以參考Kubernetes有關運行時[6]和kubead[7]的官方文檔。

sudo su #[Press Enter and provide the root user password]
mkdir -p /etc/apt/trusted.gpd.d
touch /etc/apt/trusted.gpd.d/docker.gpg

##Install Docker Repository
sudo apt-get update && sudo apt-get install -y \
 apt-transport-https ca-certificates curl software-properties-common gnupg2

##Install Repository Key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key --keyring
/etc/apt/trusted.gpg.d/docker.gpg add -

##Install the apt Repository
sudo add-apt-repository \
 "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
 $(lsb_release -cs) \
 Stable"

##Install the Docker Container Engine
sudo apt-get update && sudo apt-get install -y \
 containerd.io=1.2.13-2 \
 docker-ce=5:19.03.11~3-0~ubuntu-$(lsb_release -cs) \
 docker-ce-cli=5:19.03.11~3-0~ubuntu-$(lsb_release -cs)
 
##Set up Docker Daemon
cat <<EOF | sudo tee /etc/docker/daemon.json
{
 "exec-opts": ["native.cgroupdriver=systemd"],
 "log-driver": "json-file",
 "log-opts": {
 "max-size": "100m"
 },
 "storage-driver": "overlay2"
}
EOF  
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
echo ‘alias k=kubectl’ >> ~/.bashrc
echo ‘swapoff -a’ >> ~/.bashrc

安裝完Docker,我們就可以安裝kubeadm,kubelet和kubectl。在super user模式下,運行下面的命令。

sudo su [Enter the root password]

##iptable set up
 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
 net.bridge.bridge-nf-call-ip6tables = 1
 net.bridge.bridge-nf-call-iptables = 1
 EOF

 sudo sysctl –system

## Setting up the tools
 sudo apt-get update && sudo apt-get install -y apt-transport-https curl
 
 curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
 cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
 deb https://apt.kubernetes.io/ kubernetes-xenial main
 EOF

 sudo apt-get update

 sudo apt-get install -y kubelet kubeadm kubectl
 sudo apt-mark hold kubelet kubeadm kubectl

##kubelet restart

 systemctl daemon-reload
 systemctl restart kubelet

##Install Net tools
 apt install net-tools

到這裏,Docker,kubeadm,kubelet和kubectl已經安裝完成。Master和Worker節點需要再創建一些目錄。當然也需要在su模式下,命令行如下:

sudo su 
mkdir -p /var/lib/calico 
touch /var/lib/calico/nodename 
mkdir -p /var/run/bird 
touch /var/run/bird/bird.ctl

Master節點完成,現在開始配置Worker節點。

配置Worker節點

Master節點全部做完,關掉虛機。我們可以直接使用Master去創建Worker節點,這樣就不需要從頭一步一步的創建Worker虛機。方法就是直接clone。選中master VM,按CTRL+0直接打開clone的畫面,把虛機命名爲node01。

下一步選擇模式爲“Hard Clone”,按照嚮導一步一步操作即可。啓動虛機,用戶名和密碼應該和master的一樣。把hostname改成node01,一樣需要在終端裏並在su模式下運行。

sudo su #[Enter root password] 
cat node01 > /etc/hostname

這樣就可以把主機名從master改成node01。做完關掉虛機,如果想再加幾個worker節點,就可以重複上面的步驟即可。

下一步我們就該在master虛機裏創建控制面(control plane)。

創建Control Plane

開啓master並登陸。作爲創建控制檯的一部分,我們需要創建控制檯,再初始化單節點的集羣。首先得部署一個基於容器網絡接口(Container Network Interface CNI)的Pod網絡插件,這樣Pod之間才能互相溝通。因此,我們先來裝一個Calico Pod網絡。先來看一下主機的IP地址,Linux下運行“ifconfig”即可,記錄一下“192.168.xx.xx”,虛機的網絡應該也是同一個網段的。

再打開Linux終端,在su模式下運行下面的命令:

sudo su [Enter root password]

 ifconfig   [It will give you a list of ip addresses, note down the address which is of the pattern 
 192.168.x.xxx. That is the ip address of the VM]

 kubeadm config images pull
 kubeadm init –apiserver-advertise-address= --pod-network-cidr=192.168.0.0/16 [Copy the last part of the output. That would be used by worker nodes to join the master node]

 mkdir -p $HOME/.kube
 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 sudo chown $(id -u):$(id -g) $HOME/.kube/config

##Install the pod network calico
 kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
 kubectl get nodes -w [This will provide details about the master node only]

## Currently no workload could be scheduled on the master node. We need to remove the taint on the master node to schedule pods on it
 kubectl taint nodes --all node-role.kubernetes.io/master-

最後一步的kubeadm join會輸出類似的信息“kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>”,複製這段命令,因爲我們在worker node加入控制檯的時候要用到。

Worker節點加入Master

開啓worker節點的虛機,用linux 終端登陸並在su模式下運行:

sudo su [Enter root password]
 
##Enter the kubeadm join command copied from the master node vm which would of below pattern
 kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

這樣worker節點應該就能加入控制檯了,Pod也應該可以在這些worker節點上編排運行了。如果還有其他節點,重複上面的步驟就可以了。

部署和發佈工作負載

首先su的模式下,master節點上運行下面的命令驗證一下集羣的狀態。

sudo su 
 kubectl get nodes -o wide

輸出的信息應該是類似這樣的:

如果所有的節點都是正常的,那麼狀態就是Ready,如果有NotReady的,需要再等幾分鐘。記錄下每個節點的Internal-IP,因爲訪問Pod的時候我們需要用到。現在,我們需要運行下面的命令行去創建namespace(名稱空間),一個deployment(部署)和一個service(服務)來發布這個 deployment,同時從集羣外訪問這個應用。

##Create namespace called alpha
 kubectl create namespace alpha  
 kubectl config set-context –current –namespace alpha
 
 
##Create deployment called pages
 kubectl apply -f https://raw.githubusercontent.com/aditya-bhuyan/kube-ws-configs/master/YAML/probe/log-persistent-volumes.yml
 
 
##Create a NodePort service to expose the deployment  
 kubectl expose deploy pages –type=Nodeport –port=8080
 
 
##Verify all objects are created
 kubectl get all
 
 
##Verify the service 
 kubectl get service pages

最後一個命令會輸出service的Port信息。記下這個端口號,應該在30000-32767之間。因此,我們應該是可以使用url http://<worker節點的internal-IP>:<node-port>就可以訪問這個應用了。所以,在瀏覽器裏打開這個url試試吧。

如果都成功了,那麼恭喜你,你剛剛已經部署一個多節點的Kubernetes集羣併成功部署了一個工作負載了。

結論

上面的場景,在主機環境下可以做各種實驗,但是有一個限制,就是你無法從主機外的環境下訪問這個集羣。但從學習和實驗的角度來說,已經足夠了。所有的Kubernetes集羣的特性都有,同時在你主機的硬件性能可以支撐的前提下,集羣的擴容和縮容都可以實現。

最後,祝願大家玩的開心!

相關鏈接:

  1. https://dzone.com/articles/running-spring-boot-on-kubernetes-minikube-on-wind

  2. https://dzone.com/articles/running-spring-boot-application-on-kubernetes-mini

  3. https://labs.play-with-k8s.com/

  4. https://www.virtualbox.org/manual/ch02.html

  5. https://releases.ubuntu.com/20.04/ubuntu-20.04.1-desktop-amd64.iso

  6. https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker

  7. https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

原文鏈接:https://adityascrepuscularrays.wordpress.com/2020/11/05/how-to-set-up-a-bare-metal-kubernetes-cluster-using-kubeadm/

Kubernetes管理員認證(CKA)培訓

本次CKA培訓在北京開班,基於最新考綱,通過線下授課、考題解讀、模擬演練等方式,幫助學員快速掌握Kubernetes的理論知識和專業技能,並針對考試做特別強化訓練,讓學員能從容面對CKA認證考試,使學員既能掌握Kubernetes相關知識,又能通過CKA認證考試,學員可多次參加培訓,直到通過認證。點擊下方圖片或者閱讀原文鏈接查看詳情。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章