16

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

 3 years ago
source link: http://dockone.io/article/1448843
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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


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

用户可以使用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)。下图作为参考。

下一步选择内存的大小,一般最低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有关运行时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。

下一步选择模式为“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集群的特性都有,同时在你主机的硬件性能可以支撑的前提下,集群的扩容和缩容都可以实现。

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

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

Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK