使用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认证考试,学员可多次参加培训,直到通过认证。点击下方图片或者阅读原文链接查看详情。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值