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

如何在 Azure 上使用 KubeSpray 构建 Kubernetes 集群

starIconstarIconstarIconstarIconstarIcon

5.00/5 (7投票s)

2017年11月25日

CPOL

17分钟阅读

viewsIcon

23540

downloadIcon

82

使用 KubeSpray 消除设置 Kubernetes 集群的痛苦。

引言

将编译好的代码打包到容器中的概念目前正变得相当流行,而且有充分的理由。如果你是为云开发,并且现在不使用容器或类似技术,那么你真应该好好看看它涉及到什么。容器化基础设施/部署的巨大好处正在被云供应商大力推广,并且也日益被主流企业认识到,认为它是一个整体上非常好的选择,值得投入时间和资源去拥抱。容器和“无服务器计算”是未来几年大多数开发人员将不得不拥抱的两项技术。

本文继续我关于DevOps/基础设施系列文章的进度,在这些文章中,我们正在研究基于容器化服务的、支持多云的集群虚拟机解决方案。在本系列的第一篇文章中,我们探讨了“Terraform”,它的作用以及如何使用它。第二篇文章更深入地研究了这项非常有用的基础设施技术。第三篇文章介绍了在Terraform部署虚拟机后的配置方法。既然我们已经设置好了虚拟机,接下来我们要看的是使用这个名为Kubernetes的东西来管理我们的代码容器。如果你是纯粹的Windows用户,我强烈建议你涉足Linux领域——它非常迷人,并且得到了微软的全力支持。对于那些人,我在文章中包含了更深入的详细步骤说明,其他人可以跳过那些部分。

介绍Kubernetes

容器非常有用,但在一台机器上你只能装有限数量的容器,之后你就不得不开始考虑如何管理它们了——这种容器管理被称为编排。可以说,最受欢迎的容器系统是Docker引擎提供的。虽然Docker有自己的编排方案“Docker Swarm”,但在竞争中似乎正在领先的是“Kubernetes”。

Kubernetes是一个系统,它可以管理你的容器的生命周期,无论它们是分布在由五个还是五千个虚拟机组成的集群中。这项技术本身基于Google的“Borg系统”,该系统一直是Google内部管理集群多年的系统。正如Terraform旨在让你的节点的“期望状态”保持运行一样,Kubernetes也将确保你交给它的容器能够安全地分布在机器集群中并以健康的方式运行。

我将在后续文章中深入探讨Kubernetes和Docker。对于本文,我们将专注于设置一个集群。如果你对Kubernetes的背景感兴趣,这两篇Google的论文非常值得一读

微软支持

微软正在对Kubernetes领域进行一场豪赌和巨额投资。作为开发者,我们现在可以在Visual Studio内部直接打包成容器,并且他们最近在Azure上为它带来了一些令人惊叹的工具,包括Azure容器服务,并且雇佣了世界上一些顶尖的Kubernetes工程师。根据我的经验,当Redmond(微软)全力支持某项技术时,就该坐下来认真关注了!

文章范围

我认为大多数IT人士都会同意,生命太短暂了,有时需要学习的东西太多了!…虽然我完全赞成在*需要时*深入研究技术,但大多数时候,我非常乐意站在巨人的肩膀上,利用社区的成果(这也是我写文章的原因之一,为了回馈…请你也试试,每一篇文章都能帮助到某个人,某个地方!)

从零开始搭建Kubernetes并非易事。可能会出现容易让你绊倒的复杂情况和依赖关系,在你习惯它之前,可能会感觉像是字面意义上的“三步向前,两步后退”。在本文中,我将向你展示我发现的安装Kubernetes环境的最佳、最可配置的方法之一,使用一个社区提供的、基于Ansible的解决方案,称为“KubeSpray”。如果你喜欢从头开始,我强烈建议你一步一步地按照“Kubernetes硬核教程”进行,这是一份出色的深度教程,涵盖了你所需的一切知识。:)

如果你不知道,Ansible是一款用于自动化软件配置、配置管理和应用程序部署的软件。它在IT运维领域非常流行且被广泛使用。我将在本系列即将发表的一篇文章中介绍它。

KubeSpray(原名“Kargo”)的本质是一套Ansible playbook,可以自动化Kubernetes主节点和客户端节点的安装。它是开源的,由社区开发和维护,现已成为Kubernetes孵化项目的一部分。关键在于,KubeSpray是*生产就绪*的,因此它为我们节省了大量设置过程的痛苦。

本文我们将一步一步地使用Kube-Spray安装Kubernetes,并附带一两个炫酷的仪表板,让你轻松管理你的容器集群。

在Azure上构建虚拟网络

如果你正在跟进系列文章(见文章顶部链接),你将使用Terraform来启动你的集群。如果你还没有做到这一点,或者想尝试不同的配置,这里是从Azure门户进行操作的快速指南

  1. 登录后,点击新建,然后从出现的列表中选择一个资源(在本例中,我选择了Ubuntu服务器)。

  2. 下一步是为虚拟机命名并设置密码(在本例中,为了开发目的,不要使用ssh密钥)。我们还将虚拟机添加到一个“资源组”中。对于第一个虚拟机,请为新的资源组命名,对于您要添加到此组的任何其他虚拟机/资源,您随后可以从“现有资源组”下拉框中选择资源组名称。

  3. 输入所有必需信息后,点击下一步以选择您想要的虚拟机SIZE

在提交设置机器之前,您还有最后一次审查的机会。

片刻之后,您将收到通知,机器已准备就绪。要连接到它,请打开主虚拟机,点击顶部的“连接”,这将为您提供一个可以用来登录的SSH IP地址。

在Azure上使用Kube-Spray

要求

以下说明假定您已配置了4个虚拟机,并且可以通过公共IP(这将是您的主节点)访问其中一个,并通过主节点使用SSH访问其他虚拟机。

在Kubernetes中,我们有两种类型的机器。主机器称为master,通常称为“KubeMaster”。由master控制的其他虚拟机以前称为“minions”,现在称为“nodes”。

机器设置

为了开发,我们设置了五个(一个master,四个节点)以下机器

(Azure D4S_V3) Standard
4 x vCPU
16 GB ram
8000 max iops
32gb local SSD
Premium disk support

角色

对于设置来说,您必须以root用户身份执行所有命令——一旦您登录到VM,请务必“sudo -s”并切换到root用户,然后再执行任何命令。为了消除任何疑问,我再说一遍——您必须在这里以root身份执行所有操作,否则您将遇到问题。:)

以下是我为本文设置测试集群的方式…请注意我开启的自动关机选项——如果您不想月底收到昂贵的账单,这一点在测试时至关重要!

Kube-spray安装

  1. 确保SSH服务已安装并运行,然后SSH到主机器。我过去曾为此使用Putty应用程序,但现在BASH FOR WINDOWS可用了,我完全使用它…对于刚接触DevOps领域的人来说,它更容易使用,也是一个非常棒的Windows集成工具。如果您没有安装它并且想尝试一下,请查看我关于如何安装适用于Windows的BASH的详细步骤。

使用Windows Bash连接到远程机器

要了解如何登录,请在仪表板上选择主机器,然后点击顶部的“连接”按钮。这将提供您登录所需的主要帐户和IP。

要连接,请打开您的BASH提示符,然后输入连接信息中给出的命令。我通常将其复制到剪贴板并粘贴到BASH窗口中。

要将内容剪切并粘贴到bash或任何文本窗口中,请单击左上角的图标,然后从显示的弹出菜单中选择编辑 -> 粘贴

粘贴ssh命令后,按Enter

您会注意到以下屏幕截图,一旦我们连接成功,由于我们之前没有SSH连接到这台机器,它会给我们一个关于机器的安全警告,并要求我们接受。通常,在回答是/否时,您可以输入Y或N,但在此情况下,您必须输入完整的单词“yes”…假设您希望继续!:)

接受连接查询后,系统会提示您输入连接的机器上用户的密码(在本例中,您正在尝试以用户“kubeadmin”身份连接到机器52.166.110.189)。

输入密码正确后,您现在就进入了远程机器。它会以绿色显示您的用户名和机器名,以及美元($)提示符。下一步是开始准备机器进行主要安装。

设置安全

连接成功后,我们需要将用户提升为ROOT,并创建用于在主机之间安全通信的安全密钥。

要切换到root用户,请输入:sudo -s <enter>

系统会要求输入主密码。

输入密码后,我们需要进入ROOT文件夹,键入cd /root并生成RSA安全密钥ssh-keygen -t rsa

注意:请仔细遵循这些说明!…重要的是要以root用户身份登录,并且重要的是要生成一个没有密码的密钥。

接下来,我们将打印刚刚生成的密钥到屏幕上,并将其复制,以便粘贴到远程节点。运行“cat”(代表“catenate”)命令将读取您作为参数发送的文件,并将其数据重定向到屏幕…cat /root/.ssh/id_rsa.pub

要选择并复制bash命令行中的这些数据,请用鼠标高亮显示并按<Enter>。

在节点之间同步安全

现在我们已经准备好了一个密钥,我们需要将其复制到其他节点,以便它们将我们的主机器视为已授权。下一步将对*每个节点*重复执行,并且还会对主节点本身执行。我在这里展示的是手动方法——有很多方法可以做到这一点。在生产环境中,我通常会创建一个已设置好的“基础”节点,然后为我需要的每个新节点“克隆”它——这可以节省大量手动工作。

步骤1 - 连接到远程节点

我们需要连接四个节点并让它们成为我们安全组的一部分。在我的测试集群中,我将它们命名为node1node2node3node4。每个节点都有相同的管理员用户名(kubeadmin)和密码。初始登录与我们将本地Windows机器连接到远程服务器的体验相同。最初,您将收到一个安全警告,需要您同意,然后您可以使用密码登录。

登录后,与之前一样,我们需要使用sudo -s将自己提升为root用户。完成此操作后,我们将使用一个名为“nano”的简单Linux文本编辑器来编辑处理其他机器连接到它的身份验证文件的“authorized_keys”,该文件位于“/root/.ssh”文件夹中。

完整的命令调用文本编辑器,并将您希望在编辑模式下打开的文件作为参数。

对于有足够年纪的人来说,nano与旧的WordStar文本编辑器很相似。事实上,据乔治·R·R·马丁(《权力的游戏》电视连续剧的创作者)在他的小说中使用Wordstar 4版本创作

我们将保持极其简单。我们将使用上面提到的粘贴方法(点击左上角图标,还记得吗?)将我们主机器的公钥内容粘贴到编辑器中…

(上面的粘贴的完整密钥没有显示,但它确实进去了!)

所以要保存这个文件,然后退出,我们同时按下“CTRL + O”组合键——这会提示保存——只需按Enter键确认。

然后我们使用组合键“CTRL + X”退出nano。好了,现在我们准备测试它是否按预期工作了。要做到这一点,我们将注销,然后尝试再次登录,但这次是作为root用户,而不是kubeadmin。要退出您正在使用的远程用户bash shell,请键入“exit”并按Enter,直到您回到“root@kubemaster”提示符。

现在从这个起点开始,我们尝试*无需密码*登录远程节点。

成功!…请注意,系统没有要求输入密码,我们直接进入了“root”帐户提示符。

上面的操作需要为集群中的每个虚拟机/节点重复一遍。

步骤2 - 完成主节点本身的访问

对于主节点,我们最后需要将其自身的公钥复制到其自身的authorized_keys文件中,我们可以通过将pub文件复制(cp)到auth文件中来实现。

cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys

复制后,通过对auth文件运行CAT命令来确认是否成功。

安装先决条件

在安装KubeSpray之前,我们需要在主机器上进行一些安装和更新——这些实际上是它的依赖项。

我们单独运行每个命令(在被问到时回答y/yes),或者,您可以从附加的脚本运行它们(只是为了让您的生活轻松一点…不客气!:D

apt-get update
apt-get install software-properties-common
apt-add-repository ppa:ansible/ansible
apt-get update
apt-get install ansible
apt-get update
apt-get -y upgrade
apt-get install python-pip
pip install jinja2
pip install netaddr 

下载KubeSpray

KubeSpray的官方GIT仓库通常是起点。在本文中,我将指向一个由才华横溢的Xenonstack团队定制的社区分支…他们特定的分支已经配置了许多极其有用的仪表板和服务,所以我们不妨站在他们的肩膀上(顺便说一句,我曾多次在培训和支持中使用Xenon,他们非常出色——他们是我获取即时专业建议和帮助的首选专家!)

cd /root
git clone https://github.com/xenonstack/kubespray.git

配置KubeSpray

下载KubeSpray后(现在位于“/root/kubespray”),我们接下来需要告诉配置我们的节点的名称和/或IP。

导航/root/kubespray/inventory,然后使用我们新发现的朋友“nano”编辑inventory.ini文件,添加对“KubeMaster”和“nodeX”(1..4)的引用,如下所示。

(你可能猜到,导航使用的是类似dos/powershell的基本命令…此时cd(更改目录)会很有用!)

(确保部分标题未被注释“#”,这样“#[etcd]”就变成了“[etcd]”)

[all]
KubeMaster ansible_ssh_host=KubeMaster
node1 ansible_ssh_host=node1
node2 ansible_ssh_host=node2
node3 ansible_ssh_host=node3
node4 ansible_ssh_host=node4

[kube-master]
KubeMaster

[etcd]
KubeMaster

[kube-node]
node1
node2
node3
node4

[k8s-cluster:children]
kube-node
kube-master

部分如下:

  • all - 列出集群中的所有节点。如果一个节点有多个网络地址,您可以通过使用下面示例中注释掉的“ip=x”设置来指定您需要链接的地址。
  • kube-master - 列出Kubernetes主节点,在本例中是“KubeMaster”。
  • etcd - 这是一个简单的分布式键/值存储,Kubernetes使用它来跟踪节点和容器。在本例中,我们将其存储在主节点上,但在生产环境中,它可能会放在一个单独的、已复制的机器上。
  • kube-node - 列出由主节点控制的子/minion节点(node 1..4)。
  • k8s-cluster:children - 这指的是要成为集群一部分的节点。这里我们列出了所有节点。在生产环境中,这可能会有所不同。

注意:如果您想使用与Ubuntu不同的Linux发行版,您需要编辑/kubespray/inventory/group_fars/all.yml文件,并将“bootstrap_os: ubuntu”更改为“bootstrap_os: XX”,其中XX是操作系统名称(列在all.yml文件的顶部)。

现在我们可以测试主节点和节点之间的连接了。在kubespray/inventory文件夹中,运行以下命令

ansible --inventory-file=inventory.ini -m ping all

假设指令已仔细遵循,您应该会看到如下的“绿灯”响应:

好的,一切就绪,最后要做的是运行实际的安装,然后检查一切是否正常工作!

安装KubeSpray

好了,这就是我们来参加聚会的原因!…在我们所有的设置之后,安装本身再简单不过了…我们只需从kubespray文件夹(比我们刚才所在的inventory高一级,尝试“cd ..”)执行一个命令行指令…

cd ..

ansible-playbook -i inventory/inventory.ini cluster.yml

根据您集群中的节点数量和规格,脚本的运行时间将从5到30分钟不等(这是大量工作,幸亏KubeSpray可以为我们完成所有这些!)。

脚本运行时,您会看到流向屏幕的文本输出停止/启动…它看起来会像这样:

脚本完成后,您将看到一个“play recap”以及整个过程的总计时间。在我测试的情况下,花费了11.33分钟,这相当不错。

确认KubeSpray安装

好了,一切似乎都已完成,现在我们可以进行检查,确保一切如预期。我们与Kubernetes交互的主要方式之一是使用KUBECTL(kube control)命令行实用程序。KubeCtl允许我们从集群中获取状态信息,并向集群发送命令。

首先,让我们确认我们的集群已启动并运行,并且我们的节点已注册并可用。我们通过使用“get”命令,并带有“nodes”参数来实现。

kubectl get nodes

如下图所示,由一个主节点和四个子节点组成的集群现已全部连接并准备就绪。

接下来,我们将查看安装脚本为我们创建了哪些容器和Pod。为此,我们再次调用“kubectl get”,传递一个主参数“pods”,并传递可选参数“all-namespaces”,该参数将返回系统容器以及我们自己的特定部署。我们没有部署任何自己的Pod或容器,我们只是看到脚本为我们组合的列表。

kubectl get pods --all-namespaces

在文章开头,我谈到了仪表板——让我们通过调用它们的容器IP/端口组合来确认它们已启动并运行。为了找出具体位置,我们需要检查正在运行的“services”。

kubectl get svc

默认情况下,当我们调用“service”列表时,它只显示顶级的已暴露服务——在本例中,它只是集群服务。

然而,我们知道还有更多,您现在可以看到“all-namespaces”参数如何扩展请求,为我们提供所有详细信息,而不仅仅是顶级的。

我们感兴趣的Pod是仪表板的Pod(kubernetes dashboard、grafana和weave-scope),并且我们可以看到它们存在且运行正常。

最后,为了确认它们正在工作,我们可以使用CURL命令(它相当于一个命令行httpClient),使用其IP连接到仪表板并下载响应。

curl 10.233.46.240

后续步骤

我们现在已经通过一种非常便捷的方式在Azure上成功安装了一个Kubernetes集群,这种方法适用于所有云提供商以及裸机。下一步是暴露我们安全区域中的一些端口,以便在浏览器中查看仪表板,并检查仪表板带来的好处,并暴露我们可以交互以进行集中存储的“持久数据卷”。我们将在本系列的下一篇文章中讨论这些。

我附上了一份简化的说明,以帮助您设置自己的Kubernetes集群供下载。一如既往,如果本文对您有所帮助,请在上方给它投票!

历史

  • 2017年11月25日:初始版本
© . All rights reserved.