paint-brush
使用 AWS、K8S、Docker、Ansible、Git、Github、Apache Maven 和 Jenkins 构建 CI/CD 管道经过@zufarexplained
36,080 讀數
36,080 讀數

使用 AWS、K8S、Docker、Ansible、Git、Github、Apache Maven 和 Jenkins 构建 CI/CD 管道

经过 Zufar Sunagatov46m2023/09/07
Read on Terminal Reader

太長; 讀書

了解如何通过 Zufar Sunagatov 使用 AWS、K8S、Docker、Ansible、Apache Maven、Git、Github 和 Jenkins 创建高级 CI/CD 管道。在本教程结束时,您将获得一个可立即使用的现代 CI/CD 管道,该管道适用于您在 Github 上的任何项目。
featured image - 使用 AWS、K8S、Docker、Ansible、Git、Github、Apache Maven 和 Jenkins 构建 CI/CD 管道
Zufar Sunagatov HackerNoon profile picture
0-item
1-item




在上一篇文章中,我深入研究了微服务的迷人世界 - 微服务架构模式第 1 部分:分解模式。这是我关于微服务及其模式的综合文章系列的开始。


虽然逻辑步骤是继续本系列的第 2 部分,但我决定接下来要探索并告诉您的是将这些微服务无缝交付给最终用户的重要过程。


内容概述

  • 动机
  • 【模块一】:AWS EC2虚拟服务器
  • 【模块二】:Jenkins服务器
  • [模块3]:Git和Github
  • [模块4]:Apache Maven
  • [模块5]:Docker
  • [模块 6]:Ansible
  • [模块7]:Kubernetes
  • 结论
  • 关于作者



动机

CI/CD 是一种向客户交付应用程序的技术,通过在应用程序开发的不同阶段添加自动化来实现。我相信掌握 CI/CD(持续集成和持续部署)可以使开发人员更好地理解后端项目工件如何存在于项目存储库的边界之外。这种理解还可以使开发人员的观点发生根本性的转变。他们可以开始将项目的更广泛背景视为有价值的产品,而不是仅仅将他们的工作视为代码行。


在本文中,我们旨在通过实际应用揭开 CI/CD 流程的神秘面纱。我们将引导您完成分步教程,逐个模块地分解它,您将在其中手动构建 CI/CD 管道。为此,我们将利用AWS、Docker、Kubernetes、Ansible、Git、Apache MavenJenkins等当代 DevOps 工具的强大功能。那么,让我们开始这个旅程吧!


【模块一】:AWS EC2虚拟服务器

该模块专用于创建 AWS EC2 虚拟服务器实例。作为本文的一部分,您将为 Jenkins、Ansible 和 Kubernetes 设置三个 EC2 实例。现在,您可以继续学习下一个模块,并在“[模块 2]:Jenkins”、“[模块 6]:Ansible”和“[模块 7]:Kubernetes”部分中重新访问此模块。


步骤1:创建AWS账户

转到 https://aws.amazon.com。

单击按钮创建 AWS 账户


AWS 主网页的屏幕截图,其中指针指向“创建 AWS 账户”按钮


按照创建帐户网页上的说明进行操作。


第 2 步:登录您的 AWS 账户

转到 https://console.aws.amazon.com/console/home。单击“登录”按钮。

AWS 主网页的屏幕截图,其中指针指向“登录”按钮


在此网页上输入所有必要的凭据。


第3步:找到EC2虚拟服务器

在搜索框中找到 EC2。

AWS 网页的屏幕截图,其中指针指向搜索框


单击EC2 服务选择 EC2 虚拟服务器。

指向“EC2”AWS 服务的 AWS 网页的屏幕截图


单击按钮启动实例

AWS 网页的屏幕截图,其中指针指向“启动实例”按钮


第 4 步:配置“名称和标签”部分

转到“名称和标签”部分。

AWS 网页的屏幕截图,其中指针指向“名称和标签”部分


“名称”部分中为新的 AWS EC2 虚拟服务器实例提供名称。

AWS 网页的屏幕截图,其中指针指向“名称和标签”部分中的“名称”输入框


您还可以通过单击“添加其他标签”为虚拟服务器添加其他标签。


步骤 5:配置“应用程序和操作系统映像(Amazon 系统映像)”部分


转到“应用程序和操作系统映像(Amazon 系统映像)”部分。

AWS 网页的屏幕截图,其中指向“应用程序和操作系统映像(Amazon 系统映像)”部分


免费使用虚拟服务器:

  1. 选择您的虚拟服务器的操作系统 - Amazon Linux
  2. Amazon 系统映像 (AMI)部分中,选择具有免费套餐合格标签 的计算机。



AWS 网页的屏幕截图,其中“应用程序和操作系统映像(Amazon 机器映像)”部分中的指针指向“操作系统”和“机器类型”按钮


第 6 步:配置“实例类型”部分

转到“实例类型”部分。

指向“实例类型”部分的 AWS 网页屏幕截图


免费使用虚拟服务器:

实例类型部分中选择带有免费套餐合格标签的类型。

对我来说,它是t2.micro (系列:t2 1cCPU 1 GiB 内存当前一代:true)



AWS 网页的屏幕截图,其中“实例类型”部分中的指针指向“实例类型”下拉列表


步骤 7:配置“配置存储”部分

转到“配置存储”部分。

AWS 网页的屏幕截图,其中指向“配置存储”部分


免费使用虚拟服务器:

不要更改默认设置。符合免费套餐资格的客户可以获得30 GB 的 EBS 通用 (SSD) 或磁性存储



AWS 网页的屏幕截图,其中包含指向“配置存储”部分中可能的存储配置的指针


步骤 8:配置“网络设置”部分

转到“网络设置”部分。

AWS 网页的屏幕截图,其中指向“网络设置”部分


您需要设置虚拟服务器的安全性。去做这个,

  1. 单击“创建安全组”按钮。
  2. “安全组名称”部分添加新安全组的名称。
  3. “说明”部分添加新安全组的说明。

默认情况下,您的虚拟服务器可通过(类型 - SSH、协议 - TCP、端口 - 22 )访问。如果您需要其他连接类型,请通过添加其他入站安全组规则来添加它们。



AWS 网页的屏幕截图,其中“网络设置”部分中的指针指向“安全组”


第 9 步:配置“密钥对(登录)”部分

转到“密钥对(登录)”部分。

AWS 网页的屏幕截图,其中指向“Ketpair(登录)”部分


如果您尚未创建新的密钥对,请创建它。

AWS 网页的屏幕截图,其中“Ket 对(登录)”部分中指向“密钥对名称”、“密钥对类型”、“私钥文件格式”


如果您还没有创建“密钥对”

  1. 单击“创建新密钥对”按钮。
  2. “密钥对名称”部分中为新密钥对命名。
  3. 选择密钥对类型RSAED25519 。我选择RSA类型。
  4. 选择私钥文件格式。 .pem.ppk的选择。我选择.pem格式。
  5. 单击“创建密钥对”按钮。
  6. 您将看到一个弹出窗口,提示您下载私钥文件。同意并将文件下载到您的计算机。

步骤10:启动EC2虚拟服务器实例


单击“启动实例”按钮启动 EC2 虚拟服务器实例。

指向“启动实例”按钮的 AWS 网页屏幕截图


EC2 虚拟服务器实例创建过程完成后,您将看到以下内容。


显示“成功”通知的 AWS 网页屏幕截图,表明 EC2 虚拟服务器实例创建过程已成功完成


然后,您应该通过单击“查看所有实例”按钮转到“实例”部分。


AWS 网页的屏幕截图,其中包含指向正在运行的 EC2 实例的指针

现在您可以看到您的 AWS EC2 虚拟服务器实例正在运行。



【模块二】:Jenkins服务器

现在,让我们在 EC2 虚拟服务器实例上配置 JenkinsServer。

步骤 1:创建 AWS EC2 虚拟服务器实例

您需要一个虚拟服务器来运行 Jenkins。

按照本教程的[模块 1]:AWS EC2 虚拟服务器部分中的说明完成此步骤并创建一个名为 JenkinsServer 的 EC2 虚拟服务器实例。

不要忘记添加安全组设置。它允许JenkinsSSH分别在端口808022上工作。


使用名称“JenkinsServer”来区分您的 EC2 虚拟服务器实例。

为新的“JenkinsServer” AWS EC2 实例创建“CI_CD_Pipeline”安全组和“CI_CD_Pipeline_Key_Pair” 。您可以在本文中进一步重用它们。


步骤 2:连接到 AWS EC2 虚拟服务器实例

转至AWS 控制台主页EC2 管理控制台仪表板实例。

然后你应该选择JenkinsServer ,然后单击“连接”按钮。

AWS“实例”网页的屏幕截图,其中指针指向“连接”按钮


然后你就会看到这个网页。您应该再次单击“连接”按钮。

AWS“连接到实例”网页的屏幕截图,其中指针指向“连接”按钮


现在您可以在在线终端上看到EC2虚拟服务器实例。

AWS EC2虚拟服务器实例在线终端截图


第 3 步:下载 Jenkins 存储库

现在您需要在 EC2 虚拟服务器实例上下载 Jenkins。

请遵循以下说明:


  1. 转到 Jenkins 下载网页

  2. 您可以看到稳定(LTS)和常规版本(每周)选项。选择Red Hat/Fedora/Alma/Rocky/CentOS LTS 选项。


您将看到此网页。

Jenkins下载网页截图


  1. 复制“sudo get..”命令并执行它,从 Internet 上的 Jenkins 存储库下载 Jenkins 文件,并将它们保存到 EC2 虚拟服务器实例上的指定位置。
 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo

现在 Jenkins 已下载。


第 4 步:导入 Jenkins 密钥

要完成 Jenkins 安装,我们需要导入 Jenkins 密钥。

要导入 Jenkins 密钥,我们需要复制“sudo rpm..”命令并执行它。


 sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key

这样, “rpm”包管理器可以验证您安装的 Jenkins 包是否正是 Jenkins 项目发布的包,并且它们没有被篡改或损坏。


第5步:安装Java

要运行 Jenkins,我们需要在 EC2 虚拟服务器实例上安装Java

要安装Java ,请使用此命令。


 sudo amazon-linux-extras install java-openjdk11 -y


使用以下命令验证Java是否已正确安装:

 java -version


你会看到类似的东西。

安装了 JDK 11 的 AWS EC2 虚拟服务器实例在线终端的屏幕截图


第6步:安装fontconfig

要运行 Jenkins,您需要在我们的 EC2 虚拟服务器实例上安装fontconfig

使用这个命令。

 sudo yum install fontconfig java-11-openjdk -y


Fontconfig 是一个旨在提供系统范围的字体配置、定制和应用程序访问的库。 Jenkins 需要它,因为 Jenkins 具有渲染字体的功能。


第7步:安装詹金斯

在前面的步骤中,您将 EC2 虚拟服务器实例配置为使用特定的 Jenkins 存储库,然后导入与该存储库关联的 GPG 密钥。现在,您需要运行命令来搜索它知道的所有存储库(包括您添加的 Jenkins 存储库)以查找 Jenkins 包。一旦它在 Jenkins 存储库中找到 Jenkins 包,它将下载并安装它。


让我们运行这个命令。

 sudo yum install jenkins -y


第8步:启动詹金斯

您可以使用此命令启动 Jenkins。

 sudo systemctl start jenkins


要检查 Jenkins 是否正在运行,请使用此命令。

 sudo systemctl status jenkins


您将看到如下屏幕截图所示的输出:

安装了 Jenkins 的 AWS EC2 虚拟服务器实例在线终端的屏幕截图


詹金斯现在应该已启动并运行。

第9步:访问Jenkins

要访问 Jenkins 应用程序,请打开任何 Web 浏览器并输入 EC2 实例的公共 IP 地址或域名,后跟端口 8080。


 http://<your-ec2-ip>:8080


第一次访问 Jenkins 时,它将被自动生成的密码锁定。

安装在 AWS EC2 虚拟服务器上的 Jenkins 的屏幕截图,其中指向管理员密码


您需要使用以下命令显示此密码。

 sudo cat /var/lib/jenkins/secrets/initialAdminPassword


复制此密码,返回浏览器,将其粘贴到管理员密码字段中,然后单击“继续”。


然后你就可以看到这个网页了。


安装在 AWS EC2 虚拟服务器上的 Jenkins 的屏幕截图,其中指向“自定义 Jenkins”网页


现在,您可以使用 Jenkins 服务器。


第 10 步:创建新的 Jenkins 管道

现在,由于 Jenkins 工作正常,您可以开始创建 Jenkins 管道。要创建 Jenkins 管道,您需要创建一个新的“Freestyle 项目”。要创建新的“Freestyle 项目”,您需要转到 Jenkins 仪表板并单击“New Item”按钮。


Jenkins 仪表板网页的屏幕截图,其中指针指向“新建项目”按钮


输入Github“Freestyle项目”的名称(后面将使用“管道”名称),然后单击“确定”按钮。


Jenkins New Item 网页的屏幕截图,其中指针指向“Item name”项目框


然后提供管道的描述

Jenkins 作业配置网页的屏幕截图,其中指针指向“描述”输入框


然后单击“应用”和“保存”按钮。之后,这意味着您创建了本教程中将要构建的管道的基础。



[模块3]:Git和Github

现在,当 Jenkins 在 AWS EC2 虚拟服务器实例上运行时,您可以使用管道配置 Git。

Git 是一个免费开源的分布式版本控制系统 (VCS),旨在帮助软件团队跟踪对特殊数据库中代码的每次修改。如果出现错误,开发人员可以倒转并比较早期版本的代码,以帮助修复错误,同时最大限度地减少对所有团队成员的干扰。 VCS 特别适用于开发运营团队,因为它们可以帮助他们减少开发时间并增加成功部署 [1]。

Git 作为最流行的版本控制系统,使我们能够将最新代码从项目 Github 存储库提取到安装 Jenkins 的 EC2 虚拟服务器实例。


第1步:安装Git

使用此命令安装 Git。

 sudo yum install git -y


现在使用此命令验证 Git 是否正常工作。

 git --version

现在 Git 在 EC2 虚拟服务器实例上运行良好。


第 2 步:打开 Jenkins 仪表板

由于 Git 在 EC2 虚拟服务器实例上运行良好,我们现在可以将 Jenkins 与 Git 集成。

要开始此集成,让我们安装 Jenkins Github 插件。

转到 Jenkins 仪表板部分。


Jenkins 仪表板的屏幕截图


第 3 步:打开 Jenkins 插件管理器

单击“管理 Jenkins”按钮,然后单击“管理插件”按钮。

Jenkins 仪表板的屏幕截图,其中指针指向“管理插件”按钮


第4步:找到Github Jenkins插件

单击“可用插件”按钮。

Jenkins 插件管理器网页的屏幕截图,其中指针指向“可用插件”按钮


找到Github插件搜索框。


Jenkins 插件管理器网页的屏幕截图,其中包含指向“Github”插件的指针


选择Github插件。


第5步:安装Github Jenkins插件

选择Github插件。然后单击“安装而不重新启动”按钮。


Jenkins 插件管理器网页的屏幕截图,其中指针指向“安装而不重新启动”按钮


等待Github插件下载结束。


Jenkins 插件管理器网页的屏幕截图,其中包含下载的 Github 插件


是的! Jenkins Github 插件已安装。


第6步:配置Github Jenkins插件

现在 GitHub Jenkins 插件已安装,您可以配置此插件以最终将 Jenkins 与 Git 集成。为此,您需要单击“返回首页”按钮返回主页。


Jenkins 插件管理器网页的屏幕截图,其中指针指向“返回首页”按钮


然后在主页上,您需要单击“管理Jenkins”按钮,然后单击“全局工具配置”按钮。


Jenkins 插件管理器网页的屏幕截图,其中指针指向“全局工具配置”按钮


然后在全局工具配置网页上,您应该转到 Git 部分。


Jenkins 全局工具配置网页的屏幕截图,其中指针指向“名称”和“Git 可执行文件的路径”输入框


在 Git 部分中,您需要通过提供计算机上 Git 的名称和路径来配置 Git。


然后单击“应用”“保存”按钮**。**


到这里,您就完成了 Jenkins Github 插件的配置。


第 7 步:将 Git 集成到管道中

现在,随着 Jenkins Github 插件的安装和配置,您现在可以在管道中使用该插件了。这将允许您在模块 2 中创建的管道从指定的 GitHub 存储库中提取项目代码。


那么,要将此插件集成到您的管道中,您需要转到源代码管理部分并在管道中选择 Git。然后您需要提供您的项目存储库 URL。如果您的项目存储库在 Github 上公开,则无需提供凭据。如果项目存储库在 Github 上是私有的,您需要提供凭据。


具有“源代码管理”设置的 Jenkins 作业配置网页的屏幕截图


您可以将我的项目与下一个存储库 URL 一起使用:https: //github.com/Sunagatov/Hello.git

只需将其复制并粘贴到“存储库 URL”输入中即可。然后点击“应用”“保存”按钮完成Git与管道的集成。


第 8 步:测试集成到管道中的 Git

现在,您可以使用更新的管道从 Github 中提取项目。为此,您需要单击**“立即构建”**按钮。结果,您将在构建历史记录中看到成功的构建。


Jenkins 网页的屏幕截图,其中包含指向“立即构建”按钮和“构建历史记录”部分的指针



打开构建历史记录中的第一个构建。

Jenkins Pull_Code_From_Github_Job 作业结果成功的屏幕截图


现在您可以看到第一次构建的成功作业结果。如果您打开 AWS EC2 终端。您可以检查管道是否正常工作。


只需使用这个命令即可。

 cd /var/lib/jenkins/workspace/{your pipeline name}


这样您就可以看到您的项目从 Github 被拉取到您的 AWS EC2 虚拟服务器实例。


下载到EC2实例终端的Github项目截图



[模块4]:Apache Maven

Apache Maven是软件开发中广泛使用的构建自动化和项目管理工具。它通过管理项目依赖关系并提供一致的构建生命周期来简化编译、测试和打包代码的过程。 Maven 使用基于 XML 的配置文件(POM 文件)来定义项目结构、依赖关系和任务,使开发人员能够有效地管理和部署复杂的软件项目。


现在您已将 Git 集成到管道中,您可以通过合并 Apache Maven 来进一步增强管道,Apache Maven 使您能够构建、测试和打包项目。为此,您需要在安装了 Jenkins 和 Git 的 AWS EC2 虚拟服务器实例上安装 Apache Maven。


第 1 步:下载 Apache Maven

要下载 Apache Maven,请转到“/opt”目录。

 cd /opt


然后使用这个命令。

 sudo wget https://dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.tar.gz


该命令将下载最新的官方 Apache Maven(请在 Apache Maven 官方网站上查看最新版本)。要查找最新的官方 Apache Maven 版本,请使用链接https://maven.apache.org/download.cgi


第 2 步:从存档中提取 Apache Maven

使用以下命令从下载的存档中提取 Apache Maven:

 sudo tar -xvzf apache-maven-*.tar.gz


步骤3:添加JAVA_HOME和M2_HOME

使用此命令移动到根文件夹。

 cd ~


使用此命令编辑.bash_profile文件。

 vi .bash_profile


添加JAVA_HOME和 M2_HOME 变量。


JAVA_HOME指定为 JDK11 的路径,将M2_HOME变量指定为 maven 目录的路径。


要查找 JDK 路径,请使用此命令。

 sudo find / -name java 



带有 .bash_profile 文件的 AWS EC2 虚拟服务器实例终端网页的屏幕截图


如何使用VIM

  • 编辑文件,请按键盘按钮“ I ”插入数据。
  • 保存文件,请按键盘按钮“esc”并输入“:w”。
  • 退出文件,请按键盘按钮“esc”并输入“:q”

保存更改。


然后,执行此命令刷新系统变量。

 source .bash_profile


要验证$PATH ,请使用此命令。

 echo $PATH


要验证Apache Maven ,请使用此命令。

 mvn -v


如果一切正确,您将能够查看 Apache Maven 的版本。

AWS EC2 虚拟服务器实例终端网页的屏幕截图以及 Apache Maven 的版本


步骤 4:安装 Apache Maven Jenkins 插件

由于 Apache Maven 可以在 EC2 实例上使用,因此您可以安装 Apache Maven 插件以将其与管道集成。


为此,请按照下列步骤操作:

  1. 导航到“仪表板” →“管理 Jenkins”→“管理插件”→“可用”。
  2. 在搜索框中输入“Maven”
  3. 选择“Maven 集成”插件。


安装在 AWS EC2 虚拟服务器上的 Jenkins 的屏幕截图,其中包含指向 Maven 插件的指针


等待下载过程结束。


然后点击“返回首页”按钮。

Jenkins 安装在 AWS EC2 虚拟服务器上的屏幕截图,并指向 Maven 插件下载过程


第 5 步:配置 Apache Maven Jenkins 插件

成功安装 Apache Maven Jenkins 插件后,您现在可以在模块 2 和 3 中创建和更新的管道中使用此插件。


为此,请按照下列步骤操作:

  1. 转到“仪表板” →“管理 Jenkins”→“全局工具配置”→“JDK”
  2. 单击“添加 JDK”按钮。
  3. 取消选中“自动安装”。



安装在 AWS EC2 虚拟服务器上的 Jenkins 的屏幕截图,其中包含指向 JDK 配置的指针



然后转到“Maven”部分。单击“添加 Maven”按钮。取消选中“自动安装”。

然后添加名称MAVEN_HOME路径。



安装在 AWS EC2 虚拟服务器上的 Jenkins 的屏幕截图,其中包含指向 Apache Maven 配置的指针



单击“应用”“保存”按钮。

到这里,您已经完成了 Apache Maven Jenkins 插件的配置。


第 6 步:将 Apache Maven 集成到管道中

现在,随着 Apache Maven GitHub 插件的安装和配置,您现在可以在管道中使用 Apache Maven。这将允许您在“[模块 2]:Jenkins 服务器”中创建的管道构建项目代码以创建 jar 工件。


要将 Apache Maven 集成到管道中,您需要执行以下步骤:

  1. 导航到“仪表板” →“CI_CD_Pipeline”→“配置”→“构建步骤”。
  2. 单击“添加构建步骤”按钮。
  3. 选择“调用顶级 Maven 目标”选项。
  4. 选择“Apache-Maven”作为“Maven 版本”。
  5. “clean package”命令添加到“Goals”输入。
  6. 单击“高级”按钮。
  7. 将“pom.xml”添加到“POM”输入。



管道配置中“构建步骤”部分的屏幕截图,其中包含指向“应用”和“保存”按钮的指针



最后,单击“应用”“保存”按钮即可完成 Apache Maven 与管道的集成。

第 7 步:测试集成到管道中的 Apache Maven

现在您可以使用更新的管道来构建您的 Github 项目。为此,您需要单击**“立即构建”**按钮。因此,您将在构建历史记录中看到成功的作业结果。

如果您打开 AWS EC2 终端。您可以检查管道是否正常工作。


只需使用这个命令即可。

 cd /var/lib/jenkins/workspace/{your pipeline name}/target


这样您就可以看到 JAR 工件,表明您的项目已从 GitHub 成功构建。



[模块5]:Docker

现在让我们创建一个名为“Ansible Server”的新 EC2 实例,您将在其中安装 Docker 和 Ansible。


步骤 1:启动 AWS EC2 虚拟服务器实例

使用本教程“启动 AWS EC2 虚拟服务器实例”部分中的说明来完成此步骤。不要忘记添加安全组设置。它允许 Docker 和 SSH 分别在端口 8080 和 22 上工作。


步骤 2:连接到 AWS EC2 虚拟服务器实例

单击“连接”按钮。

指向“连接”按钮的 AWS 网页的屏幕截图


现在您可以看到 EC2 Virtual Server 实例在线终端。

AWS EC2虚拟服务器实例在线终端截图


 sudo chown ansible-admin:ansible-admin /opt/docker


步骤 3:在 Ansible EC2 虚拟服务器上安装 Docker。

现在您需要在 Ansible EC2 实例上安装 docker。为此,您需要创建一个新的 docker 文件夹。

 sudo mkdir /opt/docker


然后,通过执行下一个命令来安装 docker。

 sudo yum install docker -y


步骤 4:将当前用户添加到 Ansible EC2 虚拟服务器上的 Docker 组

您需要将当前用户“ansible-admin”添加到“AnsibleServer” EC2 虚拟服务器上的 Docker 组,以授予 Docker 管理员权限。


 sudo usermod -a -G docker ansible-admin


您需要注销并重新登录才能使这些更改生效。


然后就可以执行下一条命令了

id ansible-admin


查看新的 docker 用户是否存在。


Ansible EC2 实例的屏幕截图,其中指针指向 docker 用户


第 5 步:启动 Docker

现在,当 Docker 安装在 Ansible EC2 实例上时,您可以通过执行下一个命令来启动它。

 sudo systemctl start docker


Docker 启动后,您可以执行下一个命令

sudo systemctl status docker


可以看到 docker 现在处于活动状态并正在运行。

具有活动 docker 状态的 Ansible EC2 实例的屏幕截图


第6步:创建Dockerfile

在管道的最终版本中,该过程将涉及从 GitHub 项目创建新的 Docker 映像并将其推送到 Docker Hub。为此,您的 GitHub 项目应包含一个 Dockerfile。


如果您使用“ [模块3]:Git 和 Github”模块中提供的项目“Hello” ,那么您不需要创建新的 Dockerfile,因为该项目存储库已经包含 Dockerfile。


 FROM eclipse-temurin:17-jre-jammy ENV HOME=/opt/app WORKDIR $HOME ADD hello-0.0.1-SNAPSHOT.jar $HOME ENTRYPOINT ["java", "-jar", "/opt/app/hello-0.0.1-SNAPSHOT.jar" ]


如果您使用自己的项目存储库并且它不包含 Dockerfile,则您将需要创建一个新的 Dockerfile。


要创建新的 Dockerfile,请执行以下命令,这将创建新文件。

 sudo touch Dockerfile


然后,您可以使用一系列命令来填充此文件,这些命令描述如何构建容器化应用程序环境。这些命令包括将文件复制到映像、安装软件、设置环境变量和配置容器等操作。


要使用这些命令填充 Dockerfile,请执行以下命令。

 vim Dockerfile

Dockerfile 已可供使用。


第7步:登录Docker

现在您的 Dockerfile 已准备好使用,接下来从 **“JenkinsServer”**EC2 实例复制项目的 JAR 工件并将其粘贴到“AnsibleServer” EC2 实例上。值得注意的是,这种转移将通过管道进一步自动化。

完成此步骤后,您就可以测试 Dockerfile 以及您设置的 Docker 环境了。


在开始测试之前,请确保在 Dockerhub 上对自己进行身份验证。执行以下命令。

 docker login


此命令将提示您提供 Dockerhub 登录凭据,包括您的用户名和密码。

“AnsibleServer”EC2实例中docker登录成功的截图


至此,您已经完成了登录Docker的过程,现在可以开始测试了。

步骤8:测试Docker环境和Dockerfile

成功登录 Dockerhub 后,您现在可以开始测试准备好的 Dockerfile。


执行此命令创建 docker 镜像。

 docker build -t hello:latest .


接下来,执行后续命令来建立一个标签,以方便将镜像上传到 Dockerhub:

 docker tag hello:latest zufarexplainedit/hello:latest


最后,继续通过执行该命令将Docker镜像推送到Dockerhub。

 docker push zufarexplainedit/hello:latest


按照以下步骤操作,导航到您的 Dockerhub 帐户以验证您是否可以看到新映像。

添加了新镜像的 Dockerhub 帐户的屏幕截图


您现在应该观察到图像已被有效添加。此结果证实 Docker 环境安装成功,并且您的 Dockerfile 是正确的。



[模块 6]:Ansible

现在让我们在 EC2 虚拟服务器实例上配置 Ansible 服务器。


步骤 1:创建 AWS EC2 虚拟服务器实例

您需要一个虚拟服务器来运行 Ansible。


按照本教程的[模块 1]:AWS EC2 虚拟服务器部分中的说明完成此步骤并为 Ansible 创建 EC2 虚拟服务器实例。

不要忘记添加安全组设置。它允许AnsibleSSH分别在端口808022上工作。


使用名称“AnsibleServer”来区分您的 EC2 虚拟服务器实例。

您可以为新的“AnsibleServer” EC2 实例重复使用“CI_CD_Pipeline”安全组和“CI_CD_Pipeline_Key_Pair”


步骤 2:连接到 AWS EC2 虚拟服务器实例

转到 AWS 控制台主页 → EC2 管理控制台仪表板 → 实例 → AnsibleServer。


然后单击“连接”按钮。

指向“连接”按钮的 AWS 网页的屏幕截图


然后你就会看到这个网页。您应该再次单击“连接”按钮。


AWS“连接到实例”网页的屏幕截图,其中指针指向“连接”按钮


现在您可以在在线终端上看到EC2虚拟服务器实例。

AWS EC2虚拟服务器实例在线终端截图


现在让我们在 EC2 虚拟服务器实例上配置 Ansible Server。

步骤 3:更改“AnsibleServer”AWS EC2 虚拟服务器实例的主机名

当您想要在 EC2 虚拟服务器实例上配置 AnsibleServer 时,您需要做的第一件事是更改其主机名。


我们开始做吧。执行此命令打开主机名文件:

 sudo vi /etc/hostname


你应该看到这样的东西:

带有主机名文件的 AWS EC2 虚拟服务器实例的屏幕截图


将此主机名替换为“ansible-server”。然后,重新启动它。

 sudo init 6 



带有指向主机名的指针的 AWS EC2 虚拟服务器实例终端的屏幕截图


步骤 4:在“AnsibleServer”AWS EC2 虚拟服务器实例中添加并配置新用户

现在,让我们向 AWS EC2 虚拟服务器实例添加一个新的ansible-admin用户。

为此,请使用以下命令:


 sudo useradd ansible-admin


然后,设置ansible-admin用户的密码。

 sudo passwd ansible-admin


此外,您需要通过编辑sudoers文件来配置用户权限。

 sudo visudo


“ansible-admin ALL=(ALL) ALL”添加到此sudoers文件中。

AWS EC2 虚拟服务器实例终端的屏幕截图,其中包含指向管理员权限的指针


另外,您需要编辑/etc/ssh/sshd_config文件以启用密码身份验证。

 sudo vi /etc/ssh/sshd_config 


AWS EC2 虚拟服务器实例终端的屏幕截图,其中包含指向管理设置的指针


然后您需要重新加载服务来确认这些更改。

 sudo service sshd reload


执行此命令的结果是,您将看到:


AWS EC2 虚拟服务器实例终端的屏幕截图,其中包含指向 sshd 重新加载结果的指针


现在,您可以使用此命令来避免为所有其他命令添加 sudo。

 sudo su - ansible-admin


步骤 5:在 AWS EC2 虚拟服务器实例中生成密钥

您计划在本文中进一步管理远程服务器,例如 K8s EC2 虚拟服务器实例。这就是为什么您需要设置 SSH 密钥。

 ssh-keygen


执行此命令的结果是,您将看到:

AWS EC2 Virtual Server 实例终端的屏幕截图,其中包含指向 ssh-keygen 结果的指针


现在 SSH 密钥已生成并可供使用。

第 6 步:安装 Ansible

现在您可以在“AnsibleServer” EC2 虚拟服务器实例上安装 Ansible。

我们开始做吧。


执行此命令来安装 Ansible。

 sudo amazon-linux-extras install ansible2


要验证 Ansible,请使用以下命令:

 ansible --version


执行此命令的结果是,您将看到:

AWS EC2 虚拟服务器实例终端的屏幕截图,其中包含指向 sudo yum install ansible 结果的指针


第 7 步:在 JenkinsServer EC2 实例上安装 Jenkins“Publish over SSH”插件

由于 Ansible 安装在“AnsibleServer” EC2 虚拟服务器实例上,因此您可以配置 Jenkins 将其与 Ansible 集成。您需要安装“Publish over SSH”插件,以将 Jenkins 与安装了 Ansible 的 EC2 虚拟服务器实例以及安装了Kubernetes的其他 EC2 虚拟服务器实例集成。


转到“仪表板” →“管理 Jenkins”“配置系统”“可用插件”

然后在搜索框中输入“Publish over SSH”


安装在 AWS EC2 虚拟服务器上的 Jenkins 的屏幕截图,其中指向“可用插件”网页


单击“安装而不重新启动”按钮。等待下载过程结束。


安装在 AWS EC2 虚拟服务器上的 Jenkins 的屏幕截图,其中包含指向“下载进度”网页的指针



现在,“Publish over SSH”插件已安装在 Jenkins EC2 虚拟服务器实例上。


第 8 步:配置 Jenkins“Publish over SSH”插件

成功安装 Apache Maven Jenkins 插件后,您现在可以在模块 2 和 3 中创建和更新的管道中使用此插件。


为此,请按照下列步骤操作:


转到“仪表板”“管理 Jenkins”“配置系统”“通过 SSH 发布”

使用“Publish over SSH”插件的 AWS EC2 虚拟服务器实例终端的屏幕截图


输入屏幕截图上显示的所有必需数据,包括主机名、用户名和私钥(或密码,如果适用)。


使用“Publish over SSH”插件的 AWS EC2 虚拟服务器实例终端的屏幕截图


然后单击“应用”“保存”按钮。


到这里,您已经完成了“Publish over SSH” Jenkins 插件的配置。


接下来,单击“测试配置”以验证插件是否正常工作。



带有“测试配置”按钮的“通过 SSH 发布”插件的屏幕截图


在左侧可以看到测试插件配置状态为“成功”。这说明插件配置正确。


第9步:在AnsibleServer中创建新的Docker目录

您需要在 AnsibleServer EC2 实例上创建一个新文件夹,用于存储项目 JAR。该 jar 稍后将用于创建 Docker 镜像。


开始吧。


转到 AnsibleServer EC2 实例中的“/opt”文件夹。

 cd /opt


在那里创建一个新文件夹“docker”

 sudo mkdir docker


授予此“docker”文件夹权限。

 sudo chown ansible-admin:ansible-admin docker


现在,通过执行此命令检查“docker”文件夹权限。

 ll


您可以看到“docker”文件夹可以通过“ansible-admin”用户访问。


“AnsibleServer”EC2 实例中“docker”文件夹的屏幕截图


第 10 步:将“Publish over SSH”Github 插件集成管道


现在, “Publish over SSH” Github 插件已安装并配置完毕,您现在可以将其集成到您在“[模块 2]:Jenkins Server”中创建的管道中,以将项目 jar 工件从“ JenkinsServer”传输到“Ansible服务器”


那么,要将“Publish over SSH” Github 插件集成到管道中,您需要执行以下步骤:


  1. 导航到“仪表板” →“CI_CD_Pipeline”→“配置”→“构建后操作”。
  2. 单击“添加构建后操作”按钮。
  3. 选择“通过 SSH 发送构建工件”选项。
  4. “AnsibleServer”添加到“SSH 服务器”部分中输入的“名称” **。**
  5. “target/*.jar”添加到“传输集”部分中输入的“源文件” **。**
  6. “target/”添加到“传输集”部分**的“删除前缀”输入中**。**
  7. “//opt/docker/”添加到“传输集”部分中的“远程目录”输入**。**
  8. 现在,只需在“传输集”部分下的“执行命令”输入中放置一个空字符串即可。



管道配置中“通过 SSH 发送构建工件”部分的屏幕截图


最后,单击“应用”“保存”按钮即可完成“Publish over SSH”插件与管道的集成。


第 11 步:测试集成到管道中的“Publish over SSH” Github 插件

现在,您可以使用更新的管道将项目 jar 工件从“ JenkinsServer”传输到“AnsibleServer” 。为此,您需要单击“立即构建”按钮。因此,您将在构建历史记录中看到成功的作业结果。


如果您打开“AnsibleServer” AWS EC2 终端。您可以检查管道是否正常工作。

只需使用这个命令即可。


 cd /opt/docker


这样您就可以看到 JAR 工件,表明您的项目已从 GitHub 成功构建。

包含项目 jar 工件的 /opt/docker 目录的屏幕截图


步骤 12:配置 Ansible 主机

当您运行 Ansible playbook 时,您可以指定它应该运行的主机。您可以通过两种方式执行此操作:


  1. 直接在剧本中指定主机:在剧本中,您可以将hosts参数设置为 IP 地址或主机名列表。
  2. 使用清单文件: Ansible 允许您在清单文件中定义主机列表,并在运行 playbook 时引用该文件。默认清单文件是/etc/ansible/hosts


通过编辑/etc/ansible/hosts ,您可以轻松管理主机组,而无需在每次运行 playbook 时写出它们的 IP 地址。


让我们通过执行以下命令来查找 AnsibleServer EC2 实例主机。

 sudo ifconfig 


AnsibleServer EC2实例的网络接口设置截图


找到AnsibleServer EC2实例主机后,可以通过执行以下命令将其添加到Ansible主机文件中。


 sudo vi /etc/ansible/hosts


您还可以添加“[ansible]”作为参考

Ansible 主机文件的屏幕截图


如果您正在管理一个服务器集群,并且想要将 playbook 应用于所有服务器,则无需在 playbook 中指定每个服务器的 IP 地址,您只需将所有服务器添加到清单文件中的一个组中,然后指定剧本中的小组。


步骤 13:为 Ansible 配置对 localhost 的无密码 SSH 身份验证

Ansible 旨在自动执行远程服务器上的任务。无密码 SSH 身份验证使 Ansible 能够连接到这些服务器,而无需手动输入密码。

执行此命令,使用 ansible-admin 用户的 SSH 密钥创建从您的计算机到另一台计算机(例如 IP 地址 172.31.34.41 的计算机)的安全连接。


 sudo ssh-copy-id -i /home/{your user name}/.ssh/id_rsa.pub {your user name}@{your host address}


就我而言,它看起来像这样。

 sudo ssh-copy-id -i /home/ansible-admin/.ssh/id_rsa.pub [email protected] 


无密码ssh认证安装成功结果截图


现在您可以看到“添加的密钥数量:1” 。表示无密码SSH认证安装成功完成。

第 14 步:为 Docker 任务创建新的 Ansible playbook

现在 Ansible 已全部设置完毕并可以运行,您可以为您的管道制作一个新的 Ansible 剧本。该剧本将让 Ansible 创建新的 Docker 镜像并将其发送到 Dockerhub。

您可以这样做:


  1. 首先创建一个新的 Ansible playbook 文件。只需使用这个命令即可。
 touch hello-app.yml


  1. 然后,编辑新制作的hello-app.yml文件。使用此命令打开它进行编辑。
 vi hello-app.yml


  1. 在文件中,输入以下内容。
 --- - hosts: ansible user: root tasks: - name: create docker image command: docker build -t hello:latest . args: chdir: /opt/docker - name: create tag to push image onto dockerhub command: docker tag hello:latest zufarexplainedit/hello:latest - name: push docker image onto dockerhub command: docker push zufarexplainedit/hello:latest

适用于 Docker 任务的 Ansible playbook 已可供使用。

步骤 13:使用 Docker 任务测试 Ansible playbook

Ansible、Ansible playbook、AnsibleServer 和 JenkinsServer 均已正确配置,现在是测试 Ansible playbook 的时候了。


导航到 Ansible playbook 的位置。

 cd /opt/docker


然后,执行以下命令。

 sudo -u ansible-admin ansible-playbook /opt/docker/hello-app.yml


完成后,您将看到 Ansible playbook 的成功执行结果。

docker任务的ansible playbook成功执行结果截图


此外,请花点时间访问您的 Dockerhub 帐户并验证新映像现在是否可见。


添加了新镜像的 Dockerhub 帐户的屏幕截图


您应该会看到新添加的图像。此结果证实您的 Ansible 剧本是正确的。


步骤 14:将 Ansible Docker 任务集成管道

现在, “Publish over SSH” Github 插件、Ansible 和 Docker 已安装并配置完毕,您现在可以将它们全部集成到您在“[模块 2]:Jenkins 服务器”中创建的管道中,以传输项目 jar 工件从“ JenkinsServer”“AnsibleServer” ,然后从您的项目构建一个新的 Docker 镜像,然后将此 Docker 镜像推送到 Dockerhub 上。


要实现它,您需要执行以下步骤:

  1. 导航到“仪表板” →“CI_CD_Pipeline”→“配置”→“构建后操作”→“通过 SSH 发送构建工件”。
  2. “sudo -u ansible-admin ansible-playbook /opt/docker/hello-app.yml”命令添加到“Exec command”输入中。


管道配置中“通过 SSH 发送构建工件”部分的屏幕截图


最后,单击“应用”“保存”按钮即可完成 Ansible Docker 与管道的集成任务。

第 15 步:测试集成到管道中的“带有 Docker 任务的 Ansible playbook

现在,您可以测试升级后的管道,以将项目 jar 工件从“ JenkinsServer”无缝传输到“AnsibleServer” ,然后从您的项目构建新的 Docker 映像,然后将此 Docker 映像推送到 Dockerhub。为此,您需要单击“立即构建”按钮。因此,您将在构建历史记录中看到成功的作业结果。


此外,请花点时间访问您的 Dockerhub 帐户并验证新映像现在是否可见。


添加了新镜像的 Dockerhub 帐户的屏幕截图


您应该会看到新添加的图像。此结果确认您的包含 Docker 任务的 Ansible playbook 已成功集成到管道中。


[模块7]:Kubernetes

现在让我们在 EC2 实例上配置 K8s。您将创建一个新的 EC2 实例并安装其 kubectl 命令行工具以进一步与Kubernetes集群交互。


步骤 1:启动 AWS EC2 虚拟服务器实例

使用本教程“启动 AWS EC2 虚拟服务器实例”部分中的说明来完成此步骤。


不要忘记添加安全组设置。它允许所有工具SSH分别在端口808022上工作。


使用名称“K8sServer”来区分您的 EC2 虚拟服务器实例。

您可以为新的“K8sServer” EC2 实例重复使用“CI_CD_Pipeline”安全组和“CI_CD_Pipeline_Key_Pair”


步骤 2:连接到 AWS EC2 虚拟服务器实例

单击“连接”按钮。

指向“连接”按钮的 AWS 网页的屏幕截图


现在您可以看到 EC2 Virtual Server 实例在线终端。

AWS EC2虚拟服务器实例在线终端截图


步骤 3:更改“KubernetesServer”AWS EC2 虚拟服务器实例的主机名

当您想要在 EC2 虚拟服务器实例上配置 KuberenetesServer 时,您需要做的第一件事是更改其主机名。


我们开始做吧。执行此命令打开主机名文件:

 sudo vi /etc/hostname


你应该看到这样的东西。

带有主机名文件的 AWS EC2 虚拟服务器实例的屏幕截图


将此主机名替换为“kubernetes-server”,然后重新启动它。

 sudo init 6


您的主机名将被更改。

带有指向主机名的指针的 AWS EC2 虚拟服务器实例终端的屏幕截图


步骤 4:检查 AWS CLI 版本

使用此命令检查AWS版本。

 aws --version


这样您就可以看到当前的 aws-cli 版本。

AWS EC2虚拟服务器实例在线终端与aws版本命令结果的屏幕截图


如果您可以看到版本aws-cli/1.18 ,则应该下载最新版本。


步骤 5:更新 AWS CLI

现在,当您发现 EC2 实例上有旧的 aws-cli 版本时,您需要更新它。为此,请转至 AWS → 文档 → AWS 命令行界面 → 第 2 版用户指南。


AWS EC2 虚拟服务器实例网页的屏幕截图以及版本 2 用户指南


复制粘贴curl命令


首先,执行此命令下载 awscli 版本 2。

 curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

等待下载过程开始。


你应该看到这样的东西。

下载aws版本2结果的AWS EC2虚拟服务器实例在线终端的屏幕截图


其次,您需要执行此命令来解压缩 awscli 版本 2 存档。

 unzip awscliv2.zip


第三,您应该执行此命令来安装 awscli 版本 2。

 sudo ./aws/install


然后,重新加载 Kubernetes EC2 Virtual Server 实例在线终端。


接下来,使用此命令检查AWS版本

aws --version


您可以看到 aws cli 有 aws-cli/2。

AWS EC2虚拟服务器实例在线终端与aws版本命令结果的屏幕截图


第6步:安装kubectl

Kubectl是一个基本的命令行工具,用于与任何 Kubernetes 集群交互,无论底层基础设施如何。它允许您在 Kubernetes 集群中管理资源、部署应用程序、配置网络、访问日志以及执行各种其他任务。


现在您需要安装 kubectl 命令行工具以进一步与 Kubernetes 集群交互。为此,您需要转到AWS文档Amazon EKS用户指南安装更新kubectlLinux


或者只需单击链接https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html


AWS EKS 用户指南的屏幕截图



首先,执行此命令下载 kubectl。

 curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.27.1/2023-04-19/bin/linux/amd64/kubectl


等待下载过程。


你会看到类似这样的东西。

AWS EC2虚拟服务器实例在线终端下载kubectl结果的屏幕截图


授予 kubectl 权限。

 chmod +x kubectl


将 kubectl 移动到 /usr/local/bin 文件夹。

 sudo mv kubectl /usr/local/bin


检查 kubectl 的版本。

 kubectl version --output=yaml


第7步:安装eksctl

Eksctl是另一个专门为 Amazon EKS 服务定制的命令行工具。 Eksctl 可用于创建 AWS EKS 集群、管理节点组以及执行特定于 EKS 的任务,例如通过抽象出大部分 AWS 基础设施设置和管理来与 IAM 角色和其他 AWS 服务集成。


执行命令下载kubectl。

 curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp


将 eksctl 移动到 /usr/local/bin 文件夹。

 sudo mv /tmp/eksctl /usr/local/bin


检查 eksctl 的版本。

 eksctl version


你应该看到版本

eksctl版本的AWS EC2虚拟服务器实例在线终端截图


步骤 8:为 eksctl 创建 IAM 角色

您需要创建一个 IAM 角色并将其附加到您的“KubernetesServer” EC2 实例。

为此,您需要在搜索框中找到 EC2。


单击链接https://us-east-1.console.aws.amazon.com/ec2/选择 EC2 虚拟服务器。

指向“IAM”的 AWS 网页屏幕截图


转到IAM仪表板角色

指向“IAM 角色”的 AWS 网页屏幕截图


单击IAM角色网页上的“创建角色”按钮。


然后选择“AWS服务”、“EC2”。然后单击“下一步”按钮。

指向“IAM 角色配置”的 AWS 网页屏幕截图


然后,在搜索框中找到“AmazonEC2FullAccess”“AmazonEC2FullAccess”“IAMFullAccess”“AWSCloudFormationFullAccess” ,然后单击“添加权限”按钮。


然后单击“下一步”按钮。

AWS 网页的屏幕截图,其中包含指向 AdministratorAccess 权限的指针

然后在“角色名称”输入中输入“Eksctl_Role”

然后单击“创建角色”按钮。

AWS 网页的屏幕截图,其中包含指向权限角色配置的指针


角色最终创建完成。


步骤 9:将 IAM 角色与 eksctl 连接

转到 AWS EC2 实例网页。选择“KuberbetesServer”。然后单击“操作”“安全”“修改 IAM 角色”。


AWS 网页的屏幕截图,其中包含指向 KubernetesServer Security 按钮的指针



选择“Eksctl_Role” ,然后单击“更新 IAM 角色”按钮。


AWS 网页的屏幕截图,其中包含指向 Elsctl_Role IAM 角色的指针


现在您的 IAM 角色已与“EKS_Server”和 eksctl 工具连接。

步骤10:创建eksctl集群


Amazon EKS(弹性 Kubernetes 服务)集群是 AWS 上的托管 Kubernetes 环境,可自动执行复杂的基础设施任务,例如设置、扩展和维护。它至关重要,因为它提供了一个高效、安全且经过 AWS 优化的平台,用于部署、管理和扩展容器化应用程序、简化操作并使开发人员能够专注于编码而不是管理底层基础设施。


现在,是时候设置您的 EKS 集群了。


为此,请按照下列步骤操作:


  1. 使用您的具体信息修改以下命令。
 eksctl create cluster --name cluster-name \ --region region-name \ --node-type instance-type \ --nodes-min 2 \ --nodes-max 2 \ --zones <AZ-1>,<AZ-2>


例如,就我而言,它看起来像这样。

 eksctl create cluster --name zufarexplainedit \ --region eu-north-1 \ --node-type t3.micro


  1. 执行修改后的命令,耐心等待集群创建过程完成。您会注意到,EKS 集群状态在 AWS CloudFormation 网页上指示为“正在创建”


AWS 网页的屏幕截图,其中包含指向 AWS CloudFormation 的指针,您可以在其中看到 EKS 集群“正在创建”状态


集群创建过程通常需要大约 20 分钟。完成后,终端将显示该过程的结果。


AWS 网页的屏幕截图,其中指向 AWS EC2 终端,您可以在其中查看 EKS 集群创建结果


此外,您可以在 AWS CloudFormation 网页上验证EKS 集群创建成功的状态。


AWS 网页的屏幕截图,其中包含指向 AWS CloudFormation 的指针,您可以在其中查看 EKS 集群创建结果


步骤11:创建Kubernetes部署yaml文件

Kubernetes 部署 YAML 文件是以 YAML 格式编写的配置脚本,定义如何管理和维护 Kubernetes 集群中的特定应用程序或服务。它封装了用于编排运行应用程序的容器的部署、扩展、更新和监视的指令。该文件包含容器映像、所需副本数量、资源限制、环境变量、网络设置等详细信息。当应用于 Kubernetes 集群时,部署 YAML 文件可确保应用程序的所需状态,自动管理容器的创建、扩展和恢复,以维持所需的可用性和可靠性级别。


现在,随着 Kubernetes 集群、eksctl、kubectl 的安装和配置,您可以创建 Kubernetes 部署 yaml 文件。


您可以通过执行以下命令来做到这一点。

 touch hello-app-deployment.yaml


然后,通过执行以下命令编辑该文件。

 vi hello-app-deployment.yaml


将此内容添加到 hello-app-deployment.yaml。

 apiVersion: apps/v1 kind: Deployment metadata: name: zufarexplainedit-hello-app labels: app: hello-app spec: replicas: 2 selector: matchLabels: app: hello-app template: metadata: labels: app: hello-app spec: containers: - name: hello-app image: zufarexplainedit/hello imagePullPolicy: Always ports: - containerPort: 8080 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1


现在 hello-app-deployment.yaml 已创建并可供使用。


第12步:创建Kubernetes服务yaml文件

Kubernetes 服务 YAML 文件是以 YAML 格式编写的配置脚本,它定义一组 Pod 的网络抽象,允许在 Kubernetes 集群内一致地访问它们。该文件概述了其他服务或外部客户端应如何发现、访问和平衡该服务的负载。它包括服务类型(ClusterIP、NodePort、LoadBalancer)、端口号、用于识别 pod 的选择器等规范。当应用于 Kubernetes 集群时,服务 YAML 文件会创建一个虚拟 IP 和端口,将流量路由到适当的 Pod,抽象底层 Pod 更改并提供稳定的通信端点,从而实现无缝连接和动态扩展。


当 Kubernetes 集群、eksctl、kubectl 安装并配置完成后,您可以创建 Kubernetes Service yaml 文件。


为此,您需要通过执行以下命令来创建 Kubernetes 服务 yaml 文件。

 touch hello-app-service.yaml


然后,通过执行以下命令编辑该文件。

 vi hello-app-service.yaml


将此内容添加到 hello-app-deployment.yaml。

 apiVersion: v1 kind: Service metadata: name: zufarexplainedit-hello-app-service labels: app: hello-app spec: selector: app: hello-app ports: - port: 8080 targetPort: 8080 type: LoadBalancer

现在 hello-app-service.yaml 已创建并可供使用。


步骤13:使用kubectl测试Kubernetes集群

成功安装和配置 Kubernetes EKS 集群,并准备好 Kubernetes 服务和部署文件后,就可以使用 kubectl 命令进行测试了。


  1. 应用部署。

    使用以下命令应用部署配置。

 kubectl apply -f hello-app-deployment.yaml

这将创建具有指定数量的副本和滚动更新策略的部署,确保应用程序的可用性和可管理性。


2. 申请服务。

接下来,应用服务配置。

 kubectl apply -f hello-app-service.yaml

这将设置一个 LoadBalancer 类型的服务,将您的应用程序公开到互联网。

请注意,配置 LoadBalancer 并获取外部 IP 地址可能需要一段时间。


  1. 检查负载均衡器状态。

    监控您的服务使用状态。

 kubectl get service zufarexplainedit-hello-app-service

分配外部 IP 后,您就几乎准备好访问您的应用程序了。


  1. 访问您的应用程序。

    使用 Web 浏览器输入分配的外部 IP 地址,后跟:8080。片刻之后,页面将加载,并显示“HelloWorld”消息。请记住,初始加载可能需要几秒钟。


    Hello应用网页截图


使用 kubectl 命令进行清理

当您需要清理 Kubernetes 环境中的资源时,可以使用以下 kubectl 命令来有效删除部署、Pod 和服务。


1. 删除所有部署

要删除所有部署,可以使用以下命令。

 kubectl delete deployments --all

此操作可确保集群中不留下任何活动的部署实例。


2. 删除所有 Pod

如果需要删除所有 Pod,无论它们是否由部署管理,都可以使用以下命令。

 kubectl delete pods --all

清除 Pod 可以帮助重置集群状态或为新部署做好准备。


3.删除所有服务

要清理将应用程序暴露给网络的服务,您可以使用以下命令。

 kubectl delete services --all

删除服务可能会导致停机,因此在继续操作之前请考虑其影响。

删除 Amazon EKS 集群

要删除与使用eksctl创建的指定 Amazon EKS 集群关联的所有资源(包括工作线程节点、网络组件和其他资源),您可以使用以下命令。

 eksctl delete cluster --name {your cluster name} --region {your region name}

对我来说是的。

 eksctl delete cluster --name zufarexplainedit --region eu-north-1

确保您确定要停止集群,因为此操作是不可逆的,并且会导致数据丢失。



步骤 14:在“KubernetesServer”AWS EC2 虚拟服务器实例中添加并配置新用户

现在,让我们向“KubernetesServer” AWS EC2 虚拟服务器实例添加一个新的ansible-admin用户。


为此,请使用此命令。

 sudo useradd ansible-admin


然后,设置ansible-admin用户的密码。

 sudo passwd ansible-admin


此外,您需要通过编辑sudoers文件来配置用户权限。

 sudo visudo


“ansible-admin ALL=(ALL) ALL”添加到此sudoers文件中。

AWS EC2 虚拟服务器实例终端的屏幕截图,其中包含指向管理员权限的指针


另外,您需要编辑/etc/ssh/sshd_config文件以启用密码身份验证。

 sudo vi /etc/ssh/sshd_config 


AWS EC2 虚拟服务器实例终端的屏幕截图,其中包含指向管理设置的指针


然后您需要重新加载服务来进行这些更改。

 sudo service sshd reload


执行此命令的结果是,您将看到:

AWS EC2 虚拟服务器实例终端的屏幕截图,其中包含指向 sshd 重新加载结果的指针


现在,您可以使用此命令来避免为所有其他命令添加 sudo。

 sudo su - ansible-admin


步骤 15:在 AWS EC2 虚拟服务器实例中生成密钥

您计划在本文中进一步管理远程服务器,例如K8s EC2 虚拟服务器实例。这就是为什么您需要设置 SSH 密钥。


 ssh-keygen


执行此命令的结果是,您将看到:

AWS EC2 Virtual Server 实例终端的屏幕截图,其中包含指向 ssh-keygen 结果的指针


现在 SSH 密钥已生成并可供使用。

步骤 16:为 Ansible 配置对 localhost 的无密码 SSH 身份验证

Ansible 旨在自动执行远程服务器上的任务。无密码 SSH 身份验证使 Ansible 能够连接到这些服务器,而无需手动输入密码。

执行此命令,使用 ansible-admin 用户的 SSH 密钥创建从您的计算机到另一台计算机(例如 IP 地址 172.31.34.41 的计算机)的安全连接。


 sudo ssh-copy-id -i /home/{your user name}/.ssh/id_rsa.pub {your user name}@{your host address}


就我而言,它看起来像这样。

 sudo ssh-copy-id -i /home/ansible-admin/.ssh/id_rsa.pub [email protected] 


无密码ssh认证安装成功结果截图


现在您可以看到“添加的密钥数量:1” 。表示无密码SSH认证安装成功完成。


步骤 17:在 AnsibleServer EC2 实例中配置 Ansible 主机

当您运行 Ansible playbook 时,您可以指定它应该运行的主机。在此步骤中,您需要指定 KubernetesServer EC2 实例主机。为此,您需要重复在“ [模块 6]:Ansible”中传递的相同步骤。


我们通过执行以下命令来查找 KubernetesServer EC2 实例主机。

 sudo ifconfig 


“ifconfig”文件的屏幕截图


找到 KubernetesServer EC2 实例主机后,可以通过执行以下命令将其添加到 Ansible 主机文件中。

 sudo vi /etc/ansible/hosts 


ansible 和 kubernetes 主机的“hosts”文件的屏幕截图


您还可以添加“[kubernetes]”作为参考

第 18 步:为 Kubernetes 任务创建新的 Ansible playbook

现在 Kubernetes 已全部设置完毕,可以开始使用了,您可以为您的管道制作一个包含 Kubernetes 任务的新 Ansible playbook。该剧本将让 Ansible 使用 kubectl 命令在 Kubernetes 集群上运行您的应用程序。


您可以这样做:


  1. 首先创建一个新的 Ansible playbook 文件。只需使用这个命令即可。
 touch kubernetes-hello-app.yml


  1. 然后,编辑新制作的hello-app.yml文件。使用此命令打开它进行编辑。
 vi kubernetes-hello-app.yml


  1. 在文件中,输入以下内容:
 --- - hosts: kubernetes tasks: - name: deploy regapp on kubernetes command: kubectl apply -f hello-app-deployment.yaml - name: create service for regapp command: kubectl apply -f hello-app-service.yaml - name: update deployment with new pods if image updated in docker hub command: kubectl rollout restart deployment.apps/zufarexplainedit-hello-app

用于 Kubernetes 任务的 Ansible playbook 已可供使用。


步骤 19:将 Kubernetes 任务的新 Ansible playbook 与 Jenkins 集成

现在 Kubernetes、Ansible 和用于 Kubernetes 任务的 Ansible playbook 均已设置完毕并可以运行,您可以将其与 Jenkins 集成。


  1. 转到 JenkinsServer → Jenkins 仪表板 → 新项目。

  2. 创建名为“CD-Job”的新 Jenkins Freestyle 项目。


    Jenkins 新的 freestyle 项目“CD-Job”的屏幕截图


  3. 单击“确定”按钮。

  4. 转到“构建后操作”部分。

  5. 单击“添加构建后操作”按钮。

  6. 选择“通过 SSH 发送构建工件”选项。

  7. 选择“AnsibleServer”作为 SSH 服务器。

  8. 将此命令添加到“exec command”输入中。


 sudo -u ansible-admin ansible-playbook /opt/docker/kubernetes-hello-app.yml


  1. 单击“应用”和“保存”按钮。

  2. 转到 Jenkins 仪表板→“CI_CD_Pipeline”→配置→“构建后操作”部分。

  3. 单击“添加构建后操作”按钮。

  4. 选择“构建其他项目”选项。

  5. 转到“构建其他项目”部分。

  6. 选择“仅在构建稳定时触发”选项。

  7. 将“CD-Job”添加到“要构建的项目”输入中。



    “构建其他项目”部分的屏幕截图


  8. 单击“应用”和“保存”按钮。


现在您可以认为管道已经完全完成并且可以使用了。


第 20 步:测试最终管道版本

现在是测试最终管道版本的时候了。


导航到 Jenkins → Jenkins 仪表板 →“CI_CD_Pipeline”。


单击“立即构建”按钮。


要查看结果,请查看构建控制台日志。


构建控制台日志的屏幕截图


您会注意到构建控制台日志中触发了“CD-Job”,并且最终状态标记为“成功”。

4

此外,您可以前往 Dockerhub 确认新 Docker 镜像的添加。

最后,您可以使用网络浏览器访问您的应用程序。输入分配的外部 IP 地址,后跟“:8080”。片刻之后,页面将加载,显示“HelloWorld”消息。


结论

这个现代 CI/CD 管道的设置非常好!

你做得非常出色,你是一个真正的英雄!


感谢您的一切努力!




关于作者

Zufar Sunagatov是一位经验丰富的高级软件工程师,热衷于设计现代软件系统。


祖法尔·苏纳加托夫