使用kubeadm安装基于虚拟主机的Kubernetes 集群


介绍

Kubernetes是当下一个非常流行的容器调度工具,很多组织都在使用它。它是一个由云原生基金会(Cloud Native Computing Foundation)管理的开源软件。我们当中绝大多数人应该都知道如何安装和使用Kubernetes,典型的Kubernetes架构如下图:
h1.png

用户可以使用MinikubeKindMicrok8s在单机的电脑上部署一个单点Kubernetes集群。Katakoda也是一个不错的选择。这些都是一些很容易上手的部署工具。如果有人感兴趣可以去我之前的文章(https://dzone.com/articles/run ... -windhttps://dzone.com/articles/run ... -mini ),里面阐述了如何使用Minikube部署Kubernetes集群并运行Spring Boot。

然而,当谈到部署多点Kubernetes集群时,有些人会觉得不知所措。Playground就是一个不错的选择,这个工具可以帮助你创建一个多点集群,并在线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,安装文档在此可以找到。Virtual Box 作为整个环境的hypervisor层。另一个是VM的镜像,我们可以使用Ubuntu的镜像,可以在此下载20.04版本。

这两个是进行下一步的必要条件。

安装Master节点

这一步我们需要在Virtual Box中创建一个Master节点虚机。打开Virtual Box,按CTRL+N或者在菜单栏选择Machine->NEW。输入VM的名字作为Master,Type是Linux,版本为Ubuntu(64-bit)。下图作为参考。
h2.png

下一步选择内存的大小,一般最低2048MB。 下图作为参考。
h3.png

下一步,选择如下图所示的“Create a virtual hard disk now”。
h04.png

再下一步,选择硬盘的类型为VDI,如图:
h05.png

这里,选择硬盘尺寸为Fixed Size,如图:
h06.png

最后,硬盘的尺寸我们设定为15GB,如图:
h07.png

到这里,新建的VM应该在Virtual Box里已经可以显示出来了。再把下载好的Ubuntu ISO镜像文件添加上去。下面再设置网络和CPU。

添加镜像,选中VM,选择Settings->System->Processor,数量设定为3。如图:
h08.png

然后,单击Storage Option来设定镜像。 选择Storage->Controller:IDE->Empty,再点击蓝色CD图标,下一步去IDE:Secondary Master,然后选择Choose/Create a Virtual Optical Disk,选择Ubuntu.iso的文件路径。如图:
h09.png

下一步我们需要配置VM的网络,我们得设置两个网卡。第一个网卡配置为桥接网络(bridged network adapter)这样可以使虚机可以访问外部网络。
h10.png

第二个网卡设置为仅主机的类型(Host-only adapter),这样能使虚机和主机之间可以互相访问。
h11.png

当这些都配置完,按下OK即可以了。到这里,虚机的硬件部分就完成了。下一步我们开始安装Ubuntu操作系统以及创建用户名密码。在VirtualBox选中这个虚机,按下开始按钮。随后即进入Try Ubuntu和Install Ubuntu的图形界面。选中Install Ubuntu,进入下面的安装向导界面。
h12.png

选择最小化安装(Minimal Installation option),后面根据个人所需,再选择比较合适的选项。其中一步是创建用户名密码,输入虚机的主机名,用户名为master,密码和设置为master,当然你也可以自定义这个密码。随后就进入安装过程,最后安装完成重启即可。

下一步在master节点创建一些目录,然后安装Docker(容器引擎),kubeadm,kubelet以及kubectl(Kubernetes 客户端)。所有这些都需要在super user的模式下进行。打开一个终端然后再运行下面的命令就可以直接完成上面的步骤。当然,如有需要,可以参考Kubernetes有关运行时kubead的官方文档。
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。
h13.png

下一步选择模式为“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

输出的信息应该是类似这样的:
h14.png

如果所有的节点都是正常的,那么状态就是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集群的特性都有,同时在你主机的硬件性能可以支撑的前提下,集群的扩容和缩容都可以实现。

最后,祝愿大家玩的开心!

原文链接:How to set up a bare metal Kubernetes cluster using kubeadm(翻译:伊海峰)

0 个评论

要回复文章请先登录注册