![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
在上一篇文章中,我深入研究了微服务的迷人世界 - 微服务架构模式第 1 部分:分解模式。这是我关于微服务及其模式的综合文章系列的开始。
虽然逻辑步骤是继续本系列的第 2 部分,但我决定接下来要探索并告诉您的是将这些微服务无缝交付给最终用户的重要过程。
CI/CD 是一种向客户交付应用程序的技术,通过在应用程序开发的不同阶段添加自动化来实现。我相信掌握 CI/CD(持续集成和持续部署)可以使开发人员更好地理解后端项目工件如何存在于项目存储库的边界之外。这种理解还可以使开发人员的观点发生根本性的转变。他们可以开始将项目的更广泛背景视为有价值的产品,而不是仅仅将他们的工作视为代码行。
在本文中,我们旨在通过实际应用揭开 CI/CD 流程的神秘面纱。我们将引导您完成分步教程,逐个模块地分解它,您将在其中手动构建 CI/CD 管道。为此,我们将利用AWS、Docker、Kubernetes、Ansible、Git、Apache Maven和Jenkins等当代 DevOps 工具的强大功能。那么,让我们开始这个旅程吧!
该模块专用于创建 AWS EC2 虚拟服务器实例。作为本文的一部分,您将为 Jenkins、Ansible 和 Kubernetes 设置三个 EC2 实例。现在,您可以继续学习下一个模块,并在“[模块 2]:Jenkins”、“[模块 6]:Ansible”和“[模块 7]:Kubernetes”部分中重新访问此模块。
转到 https://aws.amazon.com。
单击按钮创建 AWS 账户。
按照创建帐户网页上的说明进行操作。
转到 https://console.aws.amazon.com/console/home。单击“登录”按钮。
在此网页上输入所有必要的凭据。
在搜索框中找到 EC2。
单击EC2 服务选择 EC2 虚拟服务器。
单击按钮启动实例。
转到“名称和标签”部分。
在“名称”部分中为新的 AWS EC2 虚拟服务器实例提供名称。
您还可以通过单击“添加其他标签”为虚拟服务器添加其他标签。
转到“应用程序和操作系统映像(Amazon 系统映像)”部分。
免费使用虚拟服务器:
转到“实例类型”部分。
免费使用虚拟服务器:
在实例类型部分中选择带有免费套餐合格标签的类型。
对我来说,它是t2.micro (系列:t2 1cCPU 1 GiB 内存当前一代:true) 。
转到“配置存储”部分。
免费使用虚拟服务器:
不要更改默认设置。符合免费套餐资格的客户可以获得30 GB 的 EBS 通用 (SSD) 或磁性存储。
转到“网络设置”部分。
您需要设置虚拟服务器的安全性。去做这个,
默认情况下,您的虚拟服务器可通过(类型 - SSH、协议 - TCP、端口 - 22 )访问。如果您需要其他连接类型,请通过添加其他入站安全组规则来添加它们。
转到“密钥对(登录)”部分。
如果您尚未创建新的密钥对,请创建它。
如果您还没有创建“密钥对” :
单击“启动实例”按钮启动 EC2 虚拟服务器实例。
EC2 虚拟服务器实例创建过程完成后,您将看到以下内容。
然后,您应该通过单击“查看所有实例”按钮转到“实例”部分。
现在您可以看到您的 AWS EC2 虚拟服务器实例正在运行。
现在,让我们在 EC2 虚拟服务器实例上配置 JenkinsServer。
您需要一个虚拟服务器来运行 Jenkins。
按照本教程的[模块 1]:AWS EC2 虚拟服务器部分中的说明完成此步骤并创建一个名为 JenkinsServer 的 EC2 虚拟服务器实例。
不要忘记添加安全组设置。它允许Jenkins和SSH分别在端口8080和22上工作。
使用名称“JenkinsServer”来区分您的 EC2 虚拟服务器实例。
为新的“JenkinsServer” AWS EC2 实例创建“CI_CD_Pipeline”安全组和“CI_CD_Pipeline_Key_Pair” 。您可以在本文中进一步重用它们。
转至AWS 控制台主页→ EC2 管理控制台仪表板→实例。
然后你应该选择JenkinsServer ,然后单击“连接”按钮。
然后你就会看到这个网页。您应该再次单击“连接”按钮。
现在您可以在在线终端上看到EC2虚拟服务器实例。
现在您需要在 EC2 虚拟服务器实例上下载 Jenkins。
请遵循以下说明:
转到 Jenkins 下载网页。
您可以看到稳定(LTS)和常规版本(每周)选项。选择Red Hat/Fedora/Alma/Rocky/CentOS LTS 选项。
您将看到此网页。
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
现在 Jenkins 已下载。
要完成 Jenkins 安装,我们需要导入 Jenkins 密钥。
要导入 Jenkins 密钥,我们需要复制“sudo rpm..”命令并执行它。
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
这样, “rpm”包管理器可以验证您安装的 Jenkins 包是否正是 Jenkins 项目发布的包,并且它们没有被篡改或损坏。
要运行 Jenkins,我们需要在 EC2 虚拟服务器实例上安装Java 。
要安装Java ,请使用此命令。
sudo amazon-linux-extras install java-openjdk11 -y
使用以下命令验证Java是否已正确安装:
java -version
你会看到类似的东西。
要运行 Jenkins,您需要在我们的 EC2 虚拟服务器实例上安装fontconfig 。
使用这个命令。
sudo yum install fontconfig java-11-openjdk -y
Fontconfig 是一个旨在提供系统范围的字体配置、定制和应用程序访问的库。 Jenkins 需要它,因为 Jenkins 具有渲染字体的功能。
在前面的步骤中,您将 EC2 虚拟服务器实例配置为使用特定的 Jenkins 存储库,然后导入与该存储库关联的 GPG 密钥。现在,您需要运行命令来搜索它知道的所有存储库(包括您添加的 Jenkins 存储库)以查找 Jenkins 包。一旦它在 Jenkins 存储库中找到 Jenkins 包,它将下载并安装它。
让我们运行这个命令。
sudo yum install jenkins -y
您可以使用此命令启动 Jenkins。
sudo systemctl start jenkins
要检查 Jenkins 是否正在运行,请使用此命令。
sudo systemctl status jenkins
您将看到如下屏幕截图所示的输出:
詹金斯现在应该已启动并运行。
要访问 Jenkins 应用程序,请打开任何 Web 浏览器并输入 EC2 实例的公共 IP 地址或域名,后跟端口 8080。
http://<your-ec2-ip>:8080
第一次访问 Jenkins 时,它将被自动生成的密码锁定。
您需要使用以下命令显示此密码。
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
复制此密码,返回浏览器,将其粘贴到管理员密码字段中,然后单击“继续”。
然后你就可以看到这个网页了。
现在,您可以使用 Jenkins 服务器。
现在,由于 Jenkins 工作正常,您可以开始创建 Jenkins 管道。要创建 Jenkins 管道,您需要创建一个新的“Freestyle 项目”。要创建新的“Freestyle 项目”,您需要转到 Jenkins 仪表板并单击“New Item”按钮。
输入Github“Freestyle项目”的名称(后面将使用“管道”名称),然后单击“确定”按钮。
然后提供管道的描述。
然后单击“应用”和“保存”按钮。之后,这意味着您创建了本教程中将要构建的管道的基础。
现在,当 Jenkins 在 AWS EC2 虚拟服务器实例上运行时,您可以使用管道配置 Git。
Git 是一个免费开源的分布式版本控制系统 (VCS),旨在帮助软件团队跟踪对特殊数据库中代码的每次修改。如果出现错误,开发人员可以倒转并比较早期版本的代码,以帮助修复错误,同时最大限度地减少对所有团队成员的干扰。 VCS 特别适用于
Git 作为最流行的版本控制系统,使我们能够将最新代码从项目 Github 存储库提取到安装 Jenkins 的 EC2 虚拟服务器实例。
使用此命令安装 Git。
sudo yum install git -y
现在使用此命令验证 Git 是否正常工作。
git --version
现在 Git 在 EC2 虚拟服务器实例上运行良好。
由于 Git 在 EC2 虚拟服务器实例上运行良好,我们现在可以将 Jenkins 与 Git 集成。
要开始此集成,让我们安装 Jenkins Github 插件。
转到 Jenkins 仪表板部分。
单击“管理 Jenkins”按钮,然后单击“管理插件”按钮。
单击“可用插件”按钮。
找到Github插件搜索框。
选择Github插件。
选择Github插件。然后单击“安装而不重新启动”按钮。
等待Github插件下载结束。
是的! Jenkins Github 插件已安装。
现在 GitHub Jenkins 插件已安装,您可以配置此插件以最终将 Jenkins 与 Git 集成。为此,您需要单击“返回首页”按钮返回主页。
然后在主页上,您需要单击“管理Jenkins”按钮,然后单击“全局工具配置”按钮。
然后在全局工具配置网页上,您应该转到 Git 部分。
在 Git 部分中,您需要通过提供计算机上 Git 的名称和路径来配置 Git。
然后单击“应用”和“保存”按钮**。**
到这里,您就完成了 Jenkins Github 插件的配置。
现在,随着 Jenkins Github 插件的安装和配置,您现在可以在管道中使用该插件了。这将允许您在模块 2 中创建的管道从指定的 GitHub 存储库中提取项目代码。
那么,要将此插件集成到您的管道中,您需要转到源代码管理部分并在管道中选择 Git。然后您需要提供您的项目存储库 URL。如果您的项目存储库在 Github 上公开,则无需提供凭据。如果项目存储库在 Github 上是私有的,您需要提供凭据。
您可以将我的项目与下一个存储库 URL 一起使用:https: //github.com/Sunagatov/Hello.git 。
只需将其复制并粘贴到“存储库 URL”输入中即可。然后点击“应用”和“保存”按钮完成Git与管道的集成。
现在,您可以使用更新的管道从 Github 中提取项目。为此,您需要单击**“立即构建”**按钮。结果,您将在构建历史记录中看到成功的构建。
打开构建历史记录中的第一个构建。
现在您可以看到第一次构建的成功作业结果。如果您打开 AWS EC2 终端。您可以检查管道是否正常工作。
只需使用这个命令即可。
cd /var/lib/jenkins/workspace/{your pipeline name}
这样您就可以看到您的项目从 Github 被拉取到您的 AWS EC2 虚拟服务器实例。
Apache Maven是软件开发中广泛使用的构建自动化和项目管理工具。它通过管理项目依赖关系并提供一致的构建生命周期来简化编译、测试和打包代码的过程。 Maven 使用基于 XML 的配置文件(POM 文件)来定义项目结构、依赖关系和任务,使开发人员能够有效地管理和部署复杂的软件项目。
现在您已将 Git 集成到管道中,您可以通过合并 Apache Maven 来进一步增强管道,Apache Maven 使您能够构建、测试和打包项目。为此,您需要在安装了 Jenkins 和 Git 的 AWS EC2 虚拟服务器实例上安装 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 。
使用以下命令从下载的存档中提取 Apache Maven:
sudo tar -xvzf apache-maven-*.tar.gz
使用此命令移动到根文件夹。
cd ~
使用此命令编辑.bash_profile文件。
vi .bash_profile
添加JAVA_HOME和 M2_HOME 变量。
将JAVA_HOME指定为 JDK11 的路径,将M2_HOME变量指定为 maven 目录的路径。
要查找 JDK 路径,请使用此命令。
sudo find / -name java
如何使用VIM
保存更改。
然后,执行此命令刷新系统变量。
source .bash_profile
要验证$PATH ,请使用此命令。
echo $PATH
要验证Apache Maven ,请使用此命令。
mvn -v
如果一切正确,您将能够查看 Apache Maven 的版本。
由于 Apache Maven 可以在 EC2 实例上使用,因此您可以安装 Apache Maven 插件以将其与管道集成。
为此,请按照下列步骤操作:
等待下载过程结束。
然后点击“返回首页”按钮。
成功安装 Apache Maven Jenkins 插件后,您现在可以在模块 2 和 3 中创建和更新的管道中使用此插件。
为此,请按照下列步骤操作:
然后转到“Maven”部分。单击“添加 Maven”按钮。取消选中“自动安装”。
然后添加名称和MAVEN_HOME路径。
单击“应用”和“保存”按钮。
到这里,您已经完成了 Apache Maven Jenkins 插件的配置。
现在,随着 Apache Maven GitHub 插件的安装和配置,您现在可以在管道中使用 Apache Maven。这将允许您在“[模块 2]:Jenkins 服务器”中创建的管道构建项目代码以创建 jar 工件。
要将 Apache Maven 集成到管道中,您需要执行以下步骤:
最后,单击“应用”和“保存”按钮即可完成 Apache Maven 与管道的集成。
现在您可以使用更新的管道来构建您的 Github 项目。为此,您需要单击**“立即构建”**按钮。因此,您将在构建历史记录中看到成功的作业结果。
如果您打开 AWS EC2 终端。您可以检查管道是否正常工作。
只需使用这个命令即可。
cd /var/lib/jenkins/workspace/{your pipeline name}/target
这样您就可以看到 JAR 工件,表明您的项目已从 GitHub 成功构建。
现在让我们创建一个名为“Ansible Server”的新 EC2 实例,您将在其中安装 Docker 和 Ansible。
使用本教程“启动 AWS EC2 虚拟服务器实例”部分中的说明来完成此步骤。不要忘记添加安全组设置。它允许 Docker 和 SSH 分别在端口 8080 和 22 上工作。
单击“连接”按钮。
现在您可以看到 EC2 Virtual Server 实例在线终端。
sudo chown ansible-admin:ansible-admin /opt/docker
现在您需要在 Ansible EC2 实例上安装 docker。为此,您需要创建一个新的 docker 文件夹。
sudo mkdir /opt/docker
然后,通过执行下一个命令来安装 docker。
sudo yum install docker -y
您需要将当前用户“ansible-admin”添加到“AnsibleServer” EC2 虚拟服务器上的 Docker 组,以授予 Docker 管理员权限。
sudo usermod -a -G docker ansible-admin
您需要注销并重新登录才能使这些更改生效。
然后就可以执行下一条命令了
id ansible-admin
查看新的 docker 用户是否存在。
现在,当 Docker 安装在 Ansible EC2 实例上时,您可以通过执行下一个命令来启动它。
sudo systemctl start docker
Docker 启动后,您可以执行下一个命令
sudo systemctl status docker
可以看到 docker 现在处于活动状态并正在运行。
在管道的最终版本中,该过程将涉及从 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 已可供使用。
现在您的 Dockerfile 已准备好使用,接下来从 **“JenkinsServer”**EC2 实例复制项目的 JAR 工件并将其粘贴到“AnsibleServer” EC2 实例上。值得注意的是,这种转移将通过管道进一步自动化。
完成此步骤后,您就可以测试 Dockerfile 以及您设置的 Docker 环境了。
在开始测试之前,请确保在 Dockerhub 上对自己进行身份验证。执行以下命令。
docker login
此命令将提示您提供 Dockerhub 登录凭据,包括您的用户名和密码。
至此,您已经完成了登录Docker的过程,现在可以开始测试了。
成功登录 Dockerhub 后,您现在可以开始测试准备好的 Dockerfile。
执行此命令创建 docker 镜像。
docker build -t hello:latest .
接下来,执行后续命令来建立一个标签,以方便将镜像上传到 Dockerhub:
docker tag hello:latest zufarexplainedit/hello:latest
最后,继续通过执行该命令将Docker镜像推送到Dockerhub。
docker push zufarexplainedit/hello:latest
按照以下步骤操作,导航到您的 Dockerhub 帐户以验证您是否可以看到新映像。
您现在应该观察到图像已被有效添加。此结果证实 Docker 环境安装成功,并且您的 Dockerfile 是正确的。
现在让我们在 EC2 虚拟服务器实例上配置 Ansible 服务器。
您需要一个虚拟服务器来运行 Ansible。
按照本教程的[模块 1]:AWS EC2 虚拟服务器部分中的说明完成此步骤并为 Ansible 创建 EC2 虚拟服务器实例。
不要忘记添加安全组设置。它允许Ansible和SSH分别在端口8080和22上工作。
使用名称“AnsibleServer”来区分您的 EC2 虚拟服务器实例。
您可以为新的“AnsibleServer” EC2 实例重复使用“CI_CD_Pipeline”安全组和“CI_CD_Pipeline_Key_Pair” 。
转到 AWS 控制台主页 → EC2 管理控制台仪表板 → 实例 → AnsibleServer。
然后单击“连接”按钮。
然后你就会看到这个网页。您应该再次单击“连接”按钮。
现在您可以在在线终端上看到EC2虚拟服务器实例。
现在让我们在 EC2 虚拟服务器实例上配置 Ansible Server。
当您想要在 EC2 虚拟服务器实例上配置 AnsibleServer 时,您需要做的第一件事是更改其主机名。
我们开始做吧。执行此命令打开主机名文件:
sudo vi /etc/hostname
你应该看到这样的东西:
将此主机名替换为“ansible-server”。然后,重新启动它。
sudo init 6
现在,让我们向 AWS EC2 虚拟服务器实例添加一个新的ansible-admin用户。
为此,请使用以下命令:
sudo useradd ansible-admin
然后,设置ansible-admin用户的密码。
sudo passwd ansible-admin
此外,您需要通过编辑sudoers文件来配置用户权限。
sudo visudo
将“ansible-admin ALL=(ALL) ALL”添加到此sudoers文件中。
另外,您需要编辑/etc/ssh/sshd_config文件以启用密码身份验证。
sudo vi /etc/ssh/sshd_config
然后您需要重新加载服务来确认这些更改。
sudo service sshd reload
执行此命令的结果是,您将看到:
现在,您可以使用此命令来避免为所有其他命令添加 sudo。
sudo su - ansible-admin
您计划在本文中进一步管理远程服务器,例如 K8s EC2 虚拟服务器实例。这就是为什么您需要设置 SSH 密钥。
ssh-keygen
执行此命令的结果是,您将看到:
现在 SSH 密钥已生成并可供使用。
现在您可以在“AnsibleServer” EC2 虚拟服务器实例上安装 Ansible。
我们开始做吧。
执行此命令来安装 Ansible。
sudo amazon-linux-extras install ansible2
要验证 Ansible,请使用以下命令:
ansible --version
执行此命令的结果是,您将看到:
由于 Ansible 安装在“AnsibleServer” EC2 虚拟服务器实例上,因此您可以配置 Jenkins 将其与 Ansible 集成。您需要安装“Publish over SSH”插件,以将 Jenkins 与安装了 Ansible 的 EC2 虚拟服务器实例以及安装了Kubernetes的其他 EC2 虚拟服务器实例集成。
转到“仪表板” →“管理 Jenkins” → “配置系统” → “可用插件” 。
然后在搜索框中输入“Publish over SSH” 。
单击“安装而不重新启动”按钮。等待下载过程结束。
现在,“Publish over SSH”插件已安装在 Jenkins EC2 虚拟服务器实例上。
成功安装 Apache Maven Jenkins 插件后,您现在可以在模块 2 和 3 中创建和更新的管道中使用此插件。
为此,请按照下列步骤操作:
转到“仪表板” → “管理 Jenkins” → “配置系统” → “通过 SSH 发布” 。
输入屏幕截图上显示的所有必需数据,包括主机名、用户名和私钥(或密码,如果适用)。
然后单击“应用”和“保存”按钮。
到这里,您已经完成了“Publish over SSH” Jenkins 插件的配置。
接下来,单击“测试配置”以验证插件是否正常工作。
在左侧可以看到测试插件配置状态为“成功”。这说明插件配置正确。
您需要在 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”用户访问。
现在, “Publish over SSH” Github 插件已安装并配置完毕,您现在可以将其集成到您在“[模块 2]:Jenkins Server”中创建的管道中,以将项目 jar 工件从“ JenkinsServer”传输到“Ansible服务器” 。
那么,要将“Publish over SSH” Github 插件集成到管道中,您需要执行以下步骤:
最后,单击“应用”和“保存”按钮即可完成“Publish over SSH”插件与管道的集成。
现在,您可以使用更新的管道将项目 jar 工件从“ JenkinsServer”传输到“AnsibleServer” 。为此,您需要单击“立即构建”按钮。因此,您将在构建历史记录中看到成功的作业结果。
如果您打开“AnsibleServer” AWS EC2 终端。您可以检查管道是否正常工作。
只需使用这个命令即可。
cd /opt/docker
这样您就可以看到 JAR 工件,表明您的项目已从 GitHub 成功构建。
当您运行 Ansible playbook 时,您可以指定它应该运行的主机。您可以通过两种方式执行此操作:
hosts
参数设置为 IP 地址或主机名列表。/etc/ansible/hosts
。
通过编辑/etc/ansible/hosts
,您可以轻松管理主机组,而无需在每次运行 playbook 时写出它们的 IP 地址。
让我们通过执行以下命令来查找 AnsibleServer EC2 实例主机。
sudo ifconfig
找到AnsibleServer EC2实例主机后,可以通过执行以下命令将其添加到Ansible主机文件中。
sudo vi /etc/ansible/hosts
您还可以添加“[ansible]”作为参考
如果您正在管理一个服务器集群,并且想要将 playbook 应用于所有服务器,则无需在 playbook 中指定每个服务器的 IP 地址,您只需将所有服务器添加到清单文件中的一个组中,然后指定剧本中的小组。
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]
现在您可以看到“添加的密钥数量:1” 。表示无密码SSH认证安装成功完成。
现在 Ansible 已全部设置完毕并可以运行,您可以为您的管道制作一个新的 Ansible 剧本。该剧本将让 Ansible 创建新的 Docker 镜像并将其发送到 Dockerhub。
您可以这样做:
touch hello-app.yml
hello-app.yml
文件。使用此命令打开它进行编辑。 vi hello-app.yml
--- - 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 已可供使用。
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 的成功执行结果。
此外,请花点时间访问您的 Dockerhub 帐户并验证新映像现在是否可见。
您应该会看到新添加的图像。此结果证实您的 Ansible 剧本是正确的。
现在, “Publish over SSH” Github 插件、Ansible 和 Docker 已安装并配置完毕,您现在可以将它们全部集成到您在“[模块 2]:Jenkins 服务器”中创建的管道中,以传输项目 jar 工件从“ JenkinsServer”到“AnsibleServer” ,然后从您的项目构建一个新的 Docker 镜像,然后将此 Docker 镜像推送到 Dockerhub 上。
要实现它,您需要执行以下步骤:
最后,单击“应用”和“保存”按钮即可完成 Ansible Docker 与管道的集成任务。
现在,您可以测试升级后的管道,以将项目 jar 工件从“ JenkinsServer”无缝传输到“AnsibleServer” ,然后从您的项目构建新的 Docker 映像,然后将此 Docker 映像推送到 Dockerhub。为此,您需要单击“立即构建”按钮。因此,您将在构建历史记录中看到成功的作业结果。
此外,请花点时间访问您的 Dockerhub 帐户并验证新映像现在是否可见。
您应该会看到新添加的图像。此结果确认您的包含 Docker 任务的 Ansible playbook 已成功集成到管道中。
现在让我们在 EC2 实例上配置 K8s。您将创建一个新的 EC2 实例并安装其 kubectl 命令行工具以进一步与Kubernetes集群交互。
使用本教程“启动 AWS EC2 虚拟服务器实例”部分中的说明来完成此步骤。
不要忘记添加安全组设置。它允许所有工具和SSH分别在端口8080和22上工作。
使用名称“K8sServer”来区分您的 EC2 虚拟服务器实例。
您可以为新的“K8sServer” EC2 实例重复使用“CI_CD_Pipeline”安全组和“CI_CD_Pipeline_Key_Pair” 。
单击“连接”按钮。
现在您可以看到 EC2 Virtual Server 实例在线终端。
当您想要在 EC2 虚拟服务器实例上配置 KuberenetesServer 时,您需要做的第一件事是更改其主机名。
我们开始做吧。执行此命令打开主机名文件:
sudo vi /etc/hostname
你应该看到这样的东西。
将此主机名替换为“kubernetes-server”,然后重新启动它。
sudo init 6
您的主机名将被更改。
使用此命令检查AWS版本。
aws --version
这样您就可以看到当前的 aws-cli 版本。
如果您可以看到版本aws-cli/1.18 ,则应该下载最新版本。
现在,当您发现 EC2 实例上有旧的 aws-cli 版本时,您需要更新它。为此,请转至 AWS → 文档 → AWS 命令行界面 → 第 2 版用户指南。
复制粘贴curl命令。
首先,执行此命令下载 awscli 版本 2。
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
等待下载过程开始。
你应该看到这样的东西。
其次,您需要执行此命令来解压缩 awscli 版本 2 存档。
unzip awscliv2.zip
第三,您应该执行此命令来安装 awscli 版本 2。
sudo ./aws/install
然后,重新加载 Kubernetes EC2 Virtual Server 实例在线终端。
接下来,使用此命令检查AWS版本
aws --version
您可以看到 aws cli 有 aws-cli/2。
Kubectl是一个基本的命令行工具,用于与任何 Kubernetes 集群交互,无论底层基础设施如何。它允许您在 Kubernetes 集群中管理资源、部署应用程序、配置网络、访问日志以及执行各种其他任务。
现在您需要安装 kubectl 命令行工具以进一步与 Kubernetes 集群交互。为此,您需要转到AWS →文档→ Amazon EKS →用户指南→安装或更新kubectl → Linux 。
或者只需单击链接https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html 。
首先,执行此命令下载 kubectl。
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.27.1/2023-04-19/bin/linux/amd64/kubectl
等待下载过程。
你会看到类似这样的东西。
授予 kubectl 权限。
chmod +x kubectl
将 kubectl 移动到 /usr/local/bin 文件夹。
sudo mv kubectl /usr/local/bin
检查 kubectl 的版本。
kubectl version --output=yaml
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
你应该看到版本
您需要创建一个 IAM 角色并将其附加到您的“KubernetesServer” EC2 实例。
为此,您需要在搜索框中找到 EC2。
单击链接https://us-east-1.console.aws.amazon.com/ec2/选择 EC2 虚拟服务器。
转到IAM仪表板→角色。
单击IAM角色网页上的“创建角色”按钮。
然后选择“AWS服务”、“EC2”。然后单击“下一步”按钮。
然后,在搜索框中找到“AmazonEC2FullAccess” 、 “AmazonEC2FullAccess” 、 “IAMFullAccess” 、 “AWSCloudFormationFullAccess” ,然后单击“添加权限”按钮。
然后单击“下一步”按钮。
然后在“角色名称”输入中输入“Eksctl_Role” 。
然后单击“创建角色”按钮。
角色最终创建完成。
转到 AWS EC2 实例网页。选择“KuberbetesServer”。然后单击“操作” → “安全” → “修改 IAM 角色”。
选择“Eksctl_Role” ,然后单击“更新 IAM 角色”按钮。
现在您的 IAM 角色已与“EKS_Server”和 eksctl 工具连接。
Amazon EKS(弹性 Kubernetes 服务)集群是 AWS 上的托管 Kubernetes 环境,可自动执行复杂的基础设施任务,例如设置、扩展和维护。它至关重要,因为它提供了一个高效、安全且经过 AWS 优化的平台,用于部署、管理和扩展容器化应用程序、简化操作并使开发人员能够专注于编码而不是管理底层基础设施。
现在,是时候设置您的 EKS 集群了。
为此,请按照下列步骤操作:
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
执行修改后的命令,耐心等待集群创建过程完成。您会注意到,EKS 集群状态在 AWS CloudFormation 网页上指示为“正在创建” 。
集群创建过程通常需要大约 20 分钟。完成后,终端将显示该过程的结果。
此外,您可以在 AWS CloudFormation 网页上验证EKS 集群创建成功的状态。
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 已创建并可供使用。
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 已创建并可供使用。
成功安装和配置 Kubernetes EKS 集群,并准备好 Kubernetes 服务和部署文件后,就可以使用 kubectl 命令进行测试了。
应用部署。
使用以下命令应用部署配置。
kubectl apply -f hello-app-deployment.yaml
这将创建具有指定数量的副本和滚动更新策略的部署,确保应用程序的可用性和可管理性。
2. 申请服务。
接下来,应用服务配置。
kubectl apply -f hello-app-service.yaml
这将设置一个 LoadBalancer 类型的服务,将您的应用程序公开到互联网。
请注意,配置 LoadBalancer 并获取外部 IP 地址可能需要一段时间。
检查负载均衡器状态。
监控您的服务使用状态。
kubectl get service zufarexplainedit-hello-app-service
分配外部 IP 后,您就几乎准备好访问您的应用程序了。
访问您的应用程序。
使用 Web 浏览器输入分配的外部 IP 地址,后跟:8080。片刻之后,页面将加载,并显示“HelloWorld”消息。请记住,初始加载可能需要几秒钟。
当您需要清理 Kubernetes 环境中的资源时,可以使用以下 kubectl 命令来有效删除部署、Pod 和服务。
1. 删除所有部署。
要删除所有部署,可以使用以下命令。
kubectl delete deployments --all
此操作可确保集群中不留下任何活动的部署实例。
2. 删除所有 Pod 。
如果需要删除所有 Pod,无论它们是否由部署管理,都可以使用以下命令。
kubectl delete pods --all
清除 Pod 可以帮助重置集群状态或为新部署做好准备。
3.删除所有服务。
要清理将应用程序暴露给网络的服务,您可以使用以下命令。
kubectl delete services --all
删除服务可能会导致停机,因此在继续操作之前请考虑其影响。
要删除与使用eksctl
创建的指定 Amazon EKS 集群关联的所有资源(包括工作线程节点、网络组件和其他资源),您可以使用以下命令。
eksctl delete cluster --name {your cluster name} --region {your region name}
对我来说是的。
eksctl delete cluster --name zufarexplainedit --region eu-north-1
确保您确定要停止集群,因为此操作是不可逆的,并且会导致数据丢失。
现在,让我们向“KubernetesServer” AWS EC2 虚拟服务器实例添加一个新的ansible-admin用户。
为此,请使用此命令。
sudo useradd ansible-admin
然后,设置ansible-admin用户的密码。
sudo passwd ansible-admin
此外,您需要通过编辑sudoers文件来配置用户权限。
sudo visudo
将“ansible-admin ALL=(ALL) ALL”添加到此sudoers文件中。
另外,您需要编辑/etc/ssh/sshd_config文件以启用密码身份验证。
sudo vi /etc/ssh/sshd_config
然后您需要重新加载服务来进行这些更改。
sudo service sshd reload
执行此命令的结果是,您将看到:
现在,您可以使用此命令来避免为所有其他命令添加 sudo。
sudo su - ansible-admin
您计划在本文中进一步管理远程服务器,例如K8s EC2 虚拟服务器实例。这就是为什么您需要设置 SSH 密钥。
ssh-keygen
执行此命令的结果是,您将看到:
现在 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]
现在您可以看到“添加的密钥数量:1” 。表示无密码SSH认证安装成功完成。
当您运行 Ansible playbook 时,您可以指定它应该运行的主机。在此步骤中,您需要指定 KubernetesServer EC2 实例主机。为此,您需要重复在“ [模块 6]:Ansible”中传递的相同步骤。
我们通过执行以下命令来查找 KubernetesServer EC2 实例主机。
sudo ifconfig
找到 KubernetesServer EC2 实例主机后,可以通过执行以下命令将其添加到 Ansible 主机文件中。
sudo vi /etc/ansible/hosts
您还可以添加“[kubernetes]”作为参考
现在 Kubernetes 已全部设置完毕,可以开始使用了,您可以为您的管道制作一个包含 Kubernetes 任务的新 Ansible playbook。该剧本将让 Ansible 使用 kubectl 命令在 Kubernetes 集群上运行您的应用程序。
您可以这样做:
touch kubernetes-hello-app.yml
hello-app.yml
文件。使用此命令打开它进行编辑。 vi kubernetes-hello-app.yml
--- - 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 已可供使用。
现在 Kubernetes、Ansible 和用于 Kubernetes 任务的 Ansible playbook 均已设置完毕并可以运行,您可以将其与 Jenkins 集成。
转到 JenkinsServer → Jenkins 仪表板 → 新项目。
创建名为“CD-Job”的新 Jenkins Freestyle 项目。
单击“确定”按钮。
转到“构建后操作”部分。
单击“添加构建后操作”按钮。
选择“通过 SSH 发送构建工件”选项。
选择“AnsibleServer”作为 SSH 服务器。
将此命令添加到“exec command”输入中。
sudo -u ansible-admin ansible-playbook /opt/docker/kubernetes-hello-app.yml
单击“应用”和“保存”按钮。
转到 Jenkins 仪表板→“CI_CD_Pipeline”→配置→“构建后操作”部分。
单击“添加构建后操作”按钮。
选择“构建其他项目”选项。
转到“构建其他项目”部分。
选择“仅在构建稳定时触发”选项。
将“CD-Job”添加到“要构建的项目”输入中。
单击“应用”和“保存”按钮。
现在您可以认为管道已经完全完成并且可以使用了。
现在是测试最终管道版本的时候了。
导航到 Jenkins → Jenkins 仪表板 →“CI_CD_Pipeline”。
单击“立即构建”按钮。
要查看结果,请查看构建控制台日志。
您会注意到构建控制台日志中触发了“CD-Job”,并且最终状态标记为“成功”。
4
此外,您可以前往 Dockerhub 确认新 Docker 镜像的添加。
最后,您可以使用网络浏览器访问您的应用程序。输入分配的外部 IP 地址,后跟“:8080”。片刻之后,页面将加载,显示“HelloWorld”消息。
这个现代 CI/CD 管道的设置非常好!
你做得非常出色,你是一个真正的英雄!
感谢您的一切努力!
Zufar Sunagatov是一位经验丰富的高级软件工程师,热衷于设计现代软件系统。