65.9K
CodeProject 正在变化。 阅读更多。
Home

用于家庭实验室的 3 节点 Kubernetes 集群 - 快速而粗糙!

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (4投票s)

2019年6月7日

CPOL

9分钟阅读

viewsIcon

23420

为家庭实验室设置 3 节点 Kubernetes 集群 - 快速而粗糙!

引言

容器和编排是本世纪的流行词。它既有趣又充满挑战。
学习应该完全是动手实践的,这需要一个良好的家庭实验室。我将在系列博客中引导您完成我已搭建好的家庭实验室,并提供一些深入理解的优秀参考资料——这还在进行中,我会及时更新。

背景

有在线的云端选项,但长远来看并不便宜,应该避免任何意外惊喜(您可能会忘记关闭虚拟机)——我希望我的 Kubernetes 集群能 24/7 运行,除了电费之外不支付任何费用。

仔细想想,创建自己的 Kubernetes 集群并维护它将为您提供巨大的洞察力,这是在使用 AWS、Azure 或 Google 的 k8s 服务时无法获得的。

另外:这也很好的机会来锻炼您的虚拟化技能。我将尝试快速概述您需要熟悉哪些内容才能开始 Kubernetes 家庭实验室。

裸金属

这很关键——这取决于您想学什么以及如何学。

Type 2 hypervisor - 类似于 VirtualBox,这是一个很好的开始方式,但这只是为了热身您的基础知识,在您进行实践学习时——我将在下一节提供一些快速步骤,让您在一小时内搭建好一个 3 节点 k8s 集群。

Type 1 hypervisor,例如 VMware ESXi - 这是真正的东西,也是我的最终目标。

您需要一些强大的设备,例如 Dell PowerEdge R820(或以前几代的服务器),在 eBay 上价格非常便宜(关注这个系列——我会有一些有趣的内容)。

这里有一篇关于这两种虚拟机监控器区别的非常好的文章。

您需要一台好机器——参考我之前的博客“打造您自己的强大台式机”(对于 Type 2 hypervisor,您不需要服务器级机器,但需要支持超线程、足够的核心和线程、大量内存的机器)。

具体到这个设置,以下配置是理想的(以下节点可以是实际机器或虚拟机,或两者的混合,这无关紧要)。

一个主节点 - 4 vCPU,4 GB 以上内存,30 GB 磁盘空间

两个工作节点 - 2 vCPU,2 GB 以上内存,20 GB 磁盘空间

网络

了解您的家庭网络很重要,同样重要的是了解 VirtualBox 网络选项

在文章的后面(或下一部分),我将提供一些关于 Docker 和 Kubernetes 网络的好参考资料——但这对于设置实验室来说并不重要。

以下是我的家庭设置(我确实有软件 VPN 和端点保护,但为了避免复杂性,不包括在内)。

(如果您使用 VirtualBox 或某种其他 Type 2 hypervisor,并且使用“host only”或“NATed”网络,请跳过此部分。)

了解您的家庭网络以及如何最好地利用您的设备

您可能有一个集调制解调器和路由器于一体的设备(大多数 ISP 都提供这种设备),或者像我一样,您可以拥有两个独立的设备。我有一个 Google Wi-Fi 路由器——它有其优点(您可以围绕您的家庭构建无线网状网络,因此可以将耗电的服务器放在地下室,并从您的主工作站远程连接)。

确定您的 DHCP 提供商(服务器)——在我的例子中,是我的 Google 路由器,它为我的所有家庭设备分配 IP 地址。

交换机非常方便——如果您有许多设备,带有以太网选项的 Wi-Fi 路由器可以方便您同时访问所有无线和有线设备。此时,请确保每个设备(稍后我们将讨论 VM 访问)都可以互相 ping 通——这应该是默认的,但您可能需要在防火墙/防病毒端点保护和 VPN(如果您正在使用)中进行一些更改。

  1. 如果您设备上有防病毒软件,它将管理防火墙——即使您的所有设备都连接到私人/家庭网络,例如 Bitdefender,以下 链接 提供了详细的步骤说明,请确保您也这样配置了防火墙保护。
  2. 如果您有 VPN,请确保启用了本地网络共享。

那么为什么我不喜欢 NAT 或 Host Only 呢?那些是最容易让任意数量的虚拟机在私有网络中运行的方式——是的,这是真的,但它在许多方面都不可扩展,也不能让您充分利用所有设备。

注意:我将跳过下载、安装 VirtualBox、配置虚拟机,并假定您已经掌握了基础知识。

首先是可扩展性(和使用)

3 个虚拟机将使用 8 vCPU(4 个 CPU 核心),您的工作站将处于高 CPU 使用率状态。

如果您想添加更多节点、主节点的高可用性等,可扩展性将成为问题,您将耗尽可用的线程数量、内存,并且请记住这是您的工作站,而不是专用服务器,您还要做其他事情!!

我甚至可以在配置非常好的机器上(在此处查看我的配置 这里)同时玩游戏(和工作)——当您玩 Ghost Recon 时,已经使用了 6vCPU(总共 12 个),您正在不必要地引入节流。

其次是最大限度地利用闲置和旧设备

  1. 我有 3 台笔记本电脑
  2. 一台 11 年的 Dell Inspiron(我本来要扔掉的——2/2 核-3 GB)
  3. 一台 Chromebook(我可以双启动 Linux——2/4-8 GB)
  4. 另一台装有 Linux Mint 的 Dell 笔记本(2/4-8 GB)
  5. 一台 6 核 PC(12 vCPU-32 GB)
  6. 一些闲置的手机和平板电脑——我可以(非官方地)在 Android 手机和平板电脑上启动 Linux,并将它们添加到集群(实验性的——以前从未尝试过,但我可以从集群连接所有无线设备——请等待我的下一篇报道)。

总而言之,我可以在所有有线或无线设备上挤出大约 24-26 个 CPU 线程,而不会让任何一个设备过载。

优势

我那台本来要扔掉的旧笔记本电脑——现在是我的主节点,我可以 24/7 运行它——我除了这个用途之外不会用它做其他事情。我的妻子使用的 Chromebook 可以在公寓里到处走动,它也可以默默地运行一个工作节点。第三台笔记本电脑可能用于主节点的高可用性,而我的 PC 用于突发使用——如果某天我需要大量的额外工作节点,我可以按需创建和销毁它们。而且,我有可能将我的旧 Android 手机添加到集群。

因此,最佳选择是混合搭配实际机器或虚拟机,这只有在您创建虚拟机时使用桥接网络(桥接网络通过使用主机系统的网络适配器将虚拟机连接到网络。如果主机系统位于网络上,桥接网络通常是让虚拟机访问该网络的简便方法。在 Windows 或 Linux 主机系统上安装 Workstation 时,会为您设置一个桥接网络(VMnet0))才有可能。

理论知识掌握后,开始动手吧

以下步骤和脚本已在 Ubuntu-18.04.2 上进行了测试。今后,我将把 VM/Machine 称为节点。

步骤 1

配置 3 个节点,并在 2 个工作节点上安装 Ubuntu Server,在主节点上安装 Ubuntu Server + GUI。

我将跳过如何在 VM 或实际硬件上安装 Ubuntu 的步骤——这只需要谷歌一下。确保在每个节点上都安装 SSH 服务器,并且不要创建 SWAP 分区。

理想情况下,您应该为所有 3 个节点创建 Ubuntu Server 的基础映像(没有 GUI)。

完成以下初始化,然后克隆到 3 个不同的节点。操作系统安装完成后,运行

sudo apt update && sudo apt upgrade (apt-get not require)

如果任何节点是 VirtualBox VM,请安装 Guest Additions,将 Guest Edition 光盘添加到 VM 中并运行

sudo mount /dev/cdrom /mnt

cd /mnt

sudo apt-get install -y dkms build-essential linux-headers-generic linux-headers-$(uname -r)
sudo ./VBoxLinuxAdditions.run

sudo swapoff -a (in case you have swap)

此时,请拍摄快照并克隆映像到 3 个不同的节点(如果是实际硬件,您可能需要单独安装),请记住为每个节点配置指定数量的 CPU 核心、硬盘大小、内存,并选择桥接适配器。

快照可以为您节省大量时间,以防万一出现问题,因此在初始化节点时,每当您认为自己达到了一个里程碑时,就请继续拍摄快照。

第二步

配置所有节点,运行 `ifconfig` 并记下 IP 地址。

确保您可以 SSH 到所有节点,并且它们之间可以互相 ping 通(之前我已解释了您可能遇到的挑战和解决方案)。

利用任何有用的终端管理器——这样管理起来更容易,您需要运行大量命令,并且需要维护大量的终端窗口。我使用 Mobaxterm——非常好用。

步骤 3(适用于所有节点)

每个节点都应该通过名称知道其他节点,因此您需要考虑节点的命名约定——我有以下名称,主节点 - k8s-master / 工作节点 - k8s-node01, k8s-node02…

检查主机名(如果需要,请更改)

sudo nano /etc/hostname (edit host names accordingly save and exit)

sudo nano /etc/hosts

And append following

<master node ip> k8s-master
<node1 ip>       k8s-node01
<node1 ip>       k8s-node02

保存并退出。

步骤 4:(安装 Docker - 适用于所有节点)

​​​​​make sure to remove existing docker installation-
sudo apt-get remove docker docker-engine docker.io containerd runc 

sudo apt install \apt-transport-https \ca-certificates \curl \gnupg-agent 
\software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

sudo apt-get update

sudo add-apt-repository 
"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

sudo apt-get install docker-ce docker-ce-cli containerd.io

sudo apt-cache policy docker-ce

sudo systemctl status docker (check the status)

sudo systemctl enable docker (enable docker)

拍摄快照!!

步骤 5:(安装 k8s - 适用于所有节点)

​​​​​curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add

cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF

# Configure iptables for Kubernetes

cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system

sudo apt install -y kubelet kubeadm kubectl

sudo systemctl enable kubelet

步骤 6:(初始化 k8s - 仅在主节点上)

可选:运行 `sudo apt install ubuntu-desktop` 来安装桌面 GUI(您需要它来访问 k8s 仪表板)

sudo kubeadm init --apiserver-advertise-address=<master node ip> 
--pod-network-cidr=192.168.0.0/16

这将为您提供一个 `kubeadm join` 命令,复制该命令并保存在某个地方!

示例`kubeadm join :6443 --token bkffxa.42w0tyswagctogv1 --discovery-token-ca-cert-hash sha256:894039dca5a45491db1090xxxxxxxxxxxxxxxxxxxxxxxx`

注意:Calico 使用 192.168.0.0/16

作为普通用户,运行以下命令

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

运行 `watch kubectl get pods --all-namespaces`,将显示正在运行的 Pod。您将看不到 Calico 或仪表板运行,并且 coredns 也不会激活。如果发生这种情况,请拍摄快照。因为接下来,我们将安装 Calico 来实现 k8s 网络。

Run

kubectl apply -f https://docs.projectcalico.org/v3.7/manifests/calico.yaml

您将看到 Calico Pod 正在创建。

步骤 7:(初始化 k8s 仪表板)

让我们通过运行以下命令来安装仪表板

kubectl apply -f 
https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/
src/deploy/recommended/kubernetes-dashboard.yaml

You need a service account to access the k8s dashboard

kubectl --namespace kube-system create serviceaccount k8s-dadmin 
(k8s-dadmin name of the service account)

kubectl create clusterrolebinding k8s-dadmin 
--serviceaccount=kube-system:k8s-dadmin --clusterrole=cluster-admin

Run following command to generate the service account token

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | 
grep k8s-dadmin | awk '{print $1}')

This will print a long token save it you will need it to login to dashboard

运行 `kubectl proxy`,这将启动仪表板,您可以访问 https://:8001

稍后,您可以通过访问以下地址来访问实际的仪表板门户

它会要求您提供令牌。

复制并粘贴您之前保存的服务帐户令牌并在此处粘贴,您将能够登录到仪表板。

步骤 8:(将所有工作节点加入域)

运行您在步骤 6 中获得的 `kubeadm join` 命令。

kubeadm join <master node ip>:6443 --token bkffxa.42w0tyswagctogv1 
--discovery-token-ca-cert-hash sha256:894039dca5a45491db1090xxxxxxxxxxxxxxxxxxxxxxxx

回到主节点,访问仪表板或运行 `kubectl get nodes`。

我曾说过这并非服务器级配置,这是您的工作站,因此在重新启动时您可能需要关闭所有节点——如果您遇到问题,请在主节点上运行以下命令,您将能够使集群正常工作!

After re-start
sudo -i
swapoff -a
Exit
strace -eopenat kubectl version

历史

  • 2019 年 6 月 8 日:初始版本
© . All rights reserved.