了解如何在裸机上配置K3来运行Kubernetes集群,该集群具有与托管服务一样的弹性和容错能力。
本教程是我从2017年开始的10分钟内在裸机上发布Kubernetes的后续文章。原始文章的重点是让Kubernetes在运行Ubuntu的大量裸机上工作,然后继续部署微服务和仪表板。它是一本入门书,旨在帮助新用户使用Kubernetes来解决问题。它使用了可用于生产的kubeadm,但仅使用了一个主节点,这意味着它不能容忍故障。
在这篇文章中,我想为您提供一个在裸机基础架构上可用于生产的HA集群。我们将对主机使用Equinix Metal,使无聊的零件自动化,但其余步骤将逐步进行,以便您可以了解引擎盖下的情况。
最后,我们将回顾设置并讨论在本地或使用Raspberry Pis在homelab中运行的其他选项。我们还将kube-vip与其他用于裸机和自托管网络的解决方案进行比较。
概念图:稳定EIP提供的kubectl访问。 IngressController还具有一个EIP,可以为通过Ingress公开的服务(例如OpenFaaS网关)路由流量。
这篇文章也从kubeadm转移到使用K3s(CNCF项目),后者需要较少的控制面资源,并具有使用嵌入式etcd的内置HA模式。自2019年以来,K3现已全面上市(GA),并已准备就绪。
我们将使用Terraform在Equinix Metal(aka数据包)服务器上创建节点,使用k3s创建HA控制平面,并使用kube-vip为API服务器配置HA IP地址。
该设置将能够承受至少一台服务器的故障。因此,与2017年的发布不同,我们的服务器将组成一个HA集群,并且还将配置一个弹性IP(EIP),以便在其中一台或多台服务器不可用时,Kubernetes API服务器仍可访问。
在Kubernetes集群中,Cloud Controller Manager插件具有多项职责,包括节点管理,路由和管理服务。在本教程的最后,不仅您的集群将具有HA控制平面,API服务器的稳定IP,而且Equinix Metal(CCM)还将允许您将服务公开为LoadBalancer类型。每个IP地址的费用约为3.25 USD / mo,您可以在信息中心的IP地址部分中找到更多详细信息。
技能水平:中级到高级。您应该熟悉Kubernetes,网络和公共云基础架构。
下载arkade,一个可移植的Kubernetes市场和DevOps CLI的下载器。它将用于下载本教程所需的工具。当然,如果您愿意,也欢迎您用辛苦的方式做事。
curl -sLS https://dl.get-arkade.dev | sh#使用作为输出提供的命令安装二进制文件,例如:sudo cp arkade-darwin / usr / local / bin / arkade#或在Linux上:sudo cp arkade / usr / local / bin / arkade
terraform-基础架构即代码(IaC)工具,我们将使用该工具来创建初始主机
我们将使用terraform来配置三个服务器和两个代理。您可以更改这些数字,但K3所需的最小数字是三。使用etcd的内置HA模式。
您可能会问为什么整个博客文章不只是一个Terraform命令。我能听到你的黑客新闻。这篇文章的重点不是为您完成所有工作,而是帮助您了解所需的内容和顺序。创建主机很无聊,因此我们将使其自动化并为您节省一些时间。
terraform {required_providers {包= {来源=" terraform-providers / packet"版本="〜> 3.2.1" }} required_version ="> = 0.13"}变量" api_token" {description =" Equinix Metal API令牌"}变量" project_id" {description =" Equinix Metal Project ID"}变量" servers" {description =" servers"}变量" agents" {description =" Agents"}提供商" packet" {auth_token = var.api_token}资源" packet_ssh_key" " key1" {name =" k3sup-1" public_key = file(" /home/alex/.ssh/id_rsa.pub")}资源" packet_device" " k3s服务器" {count = var.servers主机名=" k3s-server-$ {count.index + 1}"计划=" c1.small.x86"设施= [& ams1"] operating_system =" ubuntu_20_10" billing_cycle ="每小时" project_id = var.project_iddepends_on = [packet_ssh_key.key1]}资源" packet_device" " k3s-agent" {count = var.agents主机名=" k3s-agent-$ {count.index + 1}"计划=" c1.small.x86"设施= [& ams1"] operating_system =" ubuntu_20_10" billing_cycle ="每小时" project_id = var.project_iddepends_on = [packet_ssh_key.key1]}输出" server_ips" {value = packet_device.k3s-server。*。access_public_ipv4}输出" agent_ips" {value = packet_device.k3s-agent。*。access_public_ipv4}
使用Equinix Metal仪表板中的值编辑api_token和project_id。该API密钥可在您的用户个人资料中找到。
如果要更改节点的大小,可以编辑c1.small.x86并使用其他值。您可以在信息中心中找到这些选项。
K3可以在HA模式下运行,在该模式下可以容忍主节点的故障。对于面向公众的集群来说,这还不够,在集群中,需要Kubernetes控制平面的稳定IP地址。
我们需要端口6443的稳定IP,我们也可以将其称为弹性IP或EIP。幸运的是,BGP可以为我们提供帮助。我们的三个主节点之一将发布其IP地址作为EIP的路由,然后,如果发生故障,另一个将开始发布。这意味着我们的客户可以始终依赖以下稳定地址:https:// $ EIP:6443连接到Kubernetes API服务器。
将此行添加到hosts.txt中,以便以后需要时使用。
单击Equinix Metal仪表板中的每个服务器。单击其详细信息页面,然后单击BGP。在IPv4行上找到“管理”按钮,然后单击"启用BGP"。
由于各种原因,我们只能在K3启动后才能设置kube-vip,因此我们将创建第一个主节点:
k3sup install \ --ip $ SERVER1 \ --tls-san $ EIP \ --cluster \ --k3s-channel最新\ --k3s-extra-args"-no-deploy servicelb --disable-cloud -控制器" \-合并\-本地路径$ HOME / .kube / config \ --context = em-ha-k3s
必须使用--tls-san来通告EIP,以便K3可以为API服务器创建有效的证书。
--k3s-channel指定了K3s的最新版本,在本例中为1.19,在您运行本教程时,它可能已更改,您可以在其中指定1.19作为通道或特定版本使用--k3s-version
注意--cluster标志,该标志告诉服务器使用etcd为服务器创建集群,我们稍后将加入
--local-path,-context和--merge都允许我们将KUBECONFIG从K3合并到本地文件。
在--k3s-extra-args中,我们禁用了内置的K3s服务负载均衡器,并且也禁用了云控制器,因为我们将改用Equinix Metal Cloud Controller Manager。
现在,使用SSH登录到第一台服务器。每个服务器都需要一个一次性配置选项。
ssh root @ $ SERVER1ctr镜像拉docker.io/plndr/kube-vip:0.3.0alias kube-vip =" ctr运行--rm --net-host docker.io/plndr/kube-vip:0.3。 0" export INTERFACE = loexport EIP =" 147.75.100.237" kube-vip vip / kube-vip清单守护程序\ --interface $ INTERFACE \ --vip $ EIP \ --controlplane \-服务\ --inCluster \ --taint \ --bgp \ --packet \ --provider-config /etc/cloud-sa/cloud-sa.json |开球/var/lib/rancher/k3s/server/manifests/vip.yaml
kube-vip的清单将在/var/lib/rancher/k3s/server/manifests/vip.yaml中创建,此处放置的所有文件都将由K3s运行。
现在部署Equinix Metal Cloud Controller Manager(CCM),它将创建上面命令中引用的/etc/cloud-sa/cloud-sa.json文件。
按照配置,CCM将从Equinix Metal API获取公开的任何服务的IP地址。
导出API_KEY =""导出PROJECT_ID ="" cat<<<< EOF> ccm-secret.yamlapiVersion:v1kind:Secretmetadata:名称:packet-cloud-config名称空间:kube-systemstringData:cloud-sa.json:| {" apiKey&#34 ;:" $ API_KEY&#34 ;," projectID&#34 ;:" $ PROJECT_ID" } EOF
要点包含Equinix Metal CCM的分支版本。这是由kube-vip的作者开发的,将被上传到上游,这时URL将重定向到CCM的原始存储库。
现在,我们已经启动并运行了第一台服务器,并发布了它的EIP,我们可以使用它来加入其他服务器,然后再使用EIP来代理。
这很重要,因为如果我们使用其中一台服务器的IP,而该服务器已关闭,则代理将不再能够与API服务器通信。
--server-ip-请注意,我们指定的是EIP,而不是此处指定的任何一台服务器的IP
此命令会将kubeconfig文件写入您的本地目录,将其忽略,然后继续使用已合并到kubeconfig文件中的文件。
要添加代理(或工作程序)节点,请使用上方的join命令,但删除--server标志。
agent =(" $ AGENT1"" $ AGENT2")为$ {agents [*]}中的i进行k3sup join \ --ip $ i \ --server \ --server- ip $ EIP \ --k3s-channel最新完成
在您自己的计算机上,将KUBECONFIG切换为使用EIP而不是k3sup默认为您设置的SERVER1 IP。
我们之前安装的arkade工具不仅安装CLI,而且是开源Kubernetes市场。您可以在工作中的任意位置,在工作中的Raspberry Pi,Equinix Metal群集上使用它。它提供了大约40个Kubernetes应用程序,并且是开源的,因此您可以创建它并添加自己的。
kube-vip与CCM协同工作。 CCM将通过Equinix Metal的API为您获取新的IP地址,然后将其分配给处于“待处理”状态的任何LoadBalancer服务。然后,kube-vip开始通告IP地址并将流量路由到节点。
kubectl get svc -o wide -wNAME类型集群IP外部IP端口年龄选择kubernetes ClusterIP 10.43.0.1< none> 443 / TCP 151m< none nginx-1 LoadBalancer 10.43.71.39< pending> 80:30822 / TCP 3s app = nginxnginx-1 LoadBalancer 10.43.71.39< pending> 80:30822 / TCP 5s app = nginxnginx-1 LoadBalancer 10.43.71.39 147.75.80.22 80:30822 / TCP 5s app = nginxNGINX_IP = $(kubectl get svc / nginx-1 -o jsonpath =" {。spec.loadBalancerIP }")curl -s http:// $ NGINX_IP | grep"< title>"< title>欢迎使用nginx!< / title> kubectl删除svc / nginx-1
输出将告诉您如何获取令牌以及如何登录到仪表板。您可以通过以下方式随时获取以下信息:
默认情况下,Traefik 1.x与K3s一起安装,您可以将其禁用或删除,然后使用以下命令安装首选的IngressController:
arkade已随附IngressControllers的四个选项。您还可以运行arkade get舵,然后使用您最喜欢的舵表(如果下面尚未提供)。
找到IngressController的IP地址后,您可以为可能创建的任何入口记录创建DNS记录,然后从LetsEncrypt免费获得TLS证书。
在此示例中,您将需要使用IngressController的IP为gateway.example.com创建DNS A记录。然后,您可以继续登录OpenFaaS或使用以下URL在浏览器中打开它:https://gateway.example.com。
为了使域正常工作,您只需按照上面为registry.example.com创建DNS记录并将其指向IngressController。
通过使用Ingress,您可以节省成本和IP地址,正如我在介绍中提到的那样,每月节省约3.25 USD。
在本教程中,我们展示了kube-vip在Equinix Metal的裸机云上使用时如何与BGP集成,以提供稳定的IP。
控制平面是HA,并且可以承受至少一个故障,因为我们将K3配置为使用其内置的群集模式。内置的集群模式使用etcd的嵌入式版本来同步服务器。
端口6443上的API服务器已设置为HA,并且也可以容忍故障。这是因为API服务器的IP地址是BGP提供的EIP。我们更新了kubeconfig文件以及其他服务器和代理,以将EIP用于其集群连接命令。
Cloud Controller Manager还使用BGP为您希望通过Kubernetes LoadBalancer公开的任何服务提供IP地址。
尽管此博客文章的撰写时间更长,并且比2017年的第一篇文章投入了更多时间,但它产生了一个群集,该群集具有高可用性,快速度并可以运行生产工作负载。
如果您在工作场所或家庭实验室中运行Kubernetes,但无权访问BGP,则还有其他选择。
例如,您也许可以改用ARP。 ARP将在您的本地网络中广播虚拟IP(VIP),以便您的客户端仍可以使用稳定的IP地址。 ARP也可以与您的Raspberry Pi群集一起使用,但是请记住,K3与较旧的RPi3和CM3存在问题。
DNS循环也是配置稳定终结点的一个选项,但是缓存和传播到客户端所花费的时间会使它不实用。
另外,如果您使用的是提供本地L4负载平衡器的托管云,则无需使用kube-vip之类的工具。 AWS,GCP,Azure和DigitalOcean等云都提供了自己的托管负载均衡器。
在我最近为Rancher写的帖子中,可以看到使用DigitalOcean托管LB的示例:在DigitalOcean上设置K3s集群以实现高可用性
本地群集的另一个缺失之处是缺少Ingress,可访问的可路由IP地址。如果无法打开防火墙端口或端口转发规则不可用,这可能是一个特殊的问题。然后,诸如Cloudflare的Argo隧道之类的解决方案提供了一种公开服务的方法。
最新的开源项目(例如,入口操作员)直接集成到Kubernetes(例如云控制器管理器)中,以为您公开的服务(例如IngressController或微服务)提供TCP隧道。对于在Raspberry Pi群集或homelab上进行自我托管,inports PRO也已变得很流行。
MetalLB还是用于本地Kubernetes网络的流行工具,但是其主要用例是用于广告服务LoadBalancers,而不是用于广告控制平面的稳定IP。 kube-vip处理这两个用例,并由作者Dan积极开发。
这是有关K3和高级网络的另外两篇博客文章,您可能会感兴趣:
entrys-operator-在防火墙或NAT之后的私有主机上获取Ingress和TCP LoadBalancers
有关完整披露:Equinix Metal是OpenFaaS Ltd的客户。感谢您为团队提供客户的团队,也感谢Dan为kube-vip K3s提供支持。