在上一篇文章中,我深入研究了微服务的迷人世界 - 微服务架构模式第 1 部分:分解模式。这是我关于微服务及其模式的综合文章系列的开始。
在本文中,我们旨在通过实际应用揭开 CI/CD 流程的神秘面纱。我们将引导您完成分步教程,逐个模块地分解它,您将在其中手动构建 CI/CD 管道。为此,我们将利用AWS、Docker、Kubernetes、Ansible、Git、Apache Maven和Jenkins等当代 DevOps 工具的强大功能。那么,让我们开始这个旅程吧!
单击按钮创建 AWS 账户。
转到 //console.aws.amazon.com/console/home。单击“登录”按钮。
单击EC2 服务选择 EC2 虚拟服务器。
单击按钮启动实例。
转到“名称和标签”部分。
在“名称”部分中为新的 AWS EC2 虚拟服务器实例提供名称。
您还可以通过单击“添加其他标签”为虚拟服务器添加其他标签。
转到“应用程序和操作系统映像(Amazon 系统映像)”部分。
免费使用虚拟服务器:
转到“实例类型”部分。
免费使用虚拟服务器:
在实例类型部分中选择带有免费套餐合格标签的类型。
对我来说,它是t2.micro (系列:t2 1cCPU 1 GiB 内存当前一代:true) 。
转到“配置存储”部分。
免费使用虚拟服务器:
不要更改默认设置。符合免费套餐资格的客户可以获得30 GB 的 EBS 通用 (SSD) 或磁性存储。
转到“网络设置”部分。
默认情况下,您的虚拟服务器可通过(类型 - SSH、协议 - TCP、端口 - 22 )访问。如果您需要其他连接类型,请通过添加其他入站安全组规则来添加它们。
转到“密钥对(登录)”部分。
如果您还没有创建“密钥对” :
单击“启动实例”按钮启动 EC2 虚拟服务器实例。
然后,您应该通过单击“查看所有实例”按钮转到“实例”部分。
在您能够 看得见您的 AWS EC2 VR虚拟服务培训器案例已经在程序运行。
按照本教程的[模块 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 ,然后单击“连接”按钮。
然后你就会看到这个网页。您应该再次单击“连接”按钮。
sudo wget -O /etc/yum.repos.d/jenkins.repo //pkg.jenkins.io/redhat-stable/jenkins.repo
现代 Jenkins 已进行下载。
要导入 Jenkins 密钥,我们需要复制“sudo rpm..”命令并执行它。
sudo rpm --import //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
sudo yum install jenkins -y
sudo systemctl start jenkins
sudo systemctl status jenkins
//<your-ec2-ip>:8080
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
现在,由于 Jenkins 工作正常,您可以开始创建 Jenkins 管道。要创建 Jenkins 管道,您需要创建一个新的“Freestyle 项目”。要创建新的“Freestyle 项目”,您需要转到 Jenkins 仪表板并单击“New Item”按钮。
输入Github“Freestyle项目”的名称(后面将使用“管道”名称),然后单击“确定”按钮。
然后提供管道的描述。
Git 是一个分布式版本控制系统 (VCS),旨在帮助软件团队跟踪对特殊数据库中代码的每次修改。如果出现错误,开发人员可以倒转并比较早期版本的代码,以帮助修复错误,同时最大限度地减少对所有团队成员的干扰。 VCS 特别适用于
sudo yum install git -y
git --version
下面 Git 在 EC2 虚拟的服务管理器样例上使用很好。
单击“管理 Jenkins”按钮,然后单击“管理插件”按钮。
单击“可用插件”按钮。
找到Github插件搜索框。
选择Github插件。
选择Github插件。然后单击“安装而不重新启动”按钮。
然后在主页上,您需要单击“管理Jenkins”按钮,然后单击“全局工具配置”按钮。
然后单击“应用”和“保存”按钮**。**
只需将其复制并粘贴到“存储库 URL”输入中即可。然后点击“应用”和“保存”按钮完成Git与管道的集成。
cd /var/lib/jenkins/workspace/{your pipeline name}
Apache Maven是软件开发中广泛使用的构建自动化和项目管理工具。它通过管理项目依赖关系并提供一致的构建生命周期来简化编译、测试和打包代码的过程。 Maven 使用基于 XML 的配置文件(POM 文件)来定义项目结构、依赖关系和任务,使开发人员能够有效地管理和部署复杂的软件项目。
要下载 Apache Maven,请转到“/opt”目录。
cd /opt
sudo wget //dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.tar.gz
sudo tar -xvzf apache-maven-*.tar.gz
cd ~
使用此命令编辑.bash_profile文件。
vi .bash_profile
添加JAVA_HOME和 M2_HOME 变量。
将JAVA_HOME指定为 JDK11 的路径,将M2_HOME变量指定为 maven 目录的路径。
sudo find / -name java
如何使用VIM
source .bash_profile
要验证$PATH ,请使用此命令。
echo $PATH
要验证Apache Maven ,请使用此命令。
mvn -v
为此,请按照下列步骤操作:
然后点击“返回首页”按钮。
为此,请按照下列步骤操作:
然后转到“Maven”部分。单击“添加 Maven”按钮。取消选中“自动安装”。
然后添加名称和MAVEN_HOME路径。
单击“应用”和“保存”按钮。
到这些,您就已搞定了 Apache Maven Jenkins 插件机的系统配置。
要将 Apache Maven 集成到管道中,您需要执行以下步骤:
最后,单击“应用”和“保存”按钮即可完成 Apache Maven 与管道的集成。
cd /var/lib/jenkins/workspace/{your pipeline name}/target
使用本教程“启动 AWS EC2 虚拟服务器实例”部分中的说明来完成此步骤。不要忘记添加安全组设置。它允许 Docker 和 SSH 分别在端口 8080 和 22 上工作。
sudo chown ansible-admin:ansible-admin /opt/docker
sudo mkdir /opt/docker
sudo yum install docker -y
您需要将当前用户“ansible-admin”添加到“AnsibleServer” EC2 虚拟服务器上的 Docker 组,以授予 Docker 管理员权限。
sudo usermod -a -G docker ansible-admin
id ansible-admin
sudo systemctl start docker
sudo systemctl status docker
如果您使用“ [模块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" ]
sudo touch Dockerfile
vim Dockerfile
Dockerfile 已可供用。
现在您的 Dockerfile 已准备好使用,接下来从 **“JenkinsServer”**EC2 实例复制项目的 JAR 工件并将其粘贴到“AnsibleServer” EC2 实例上。值得注意的是,这种转移将通过管道进一步自动化。
完成任务此步驟后,您就能否测评 Dockerfile 与您设有的 Docker 坏境了。
docker login
至此,您已经完成了登录Docker的过程,现在可以开始测试了。
docker build -t hello:latest .
docker tag hello:latest zufarexplainedit/hello:latest
docker push zufarexplainedit/hello:latest
按照本教程的[模块 1]:AWS EC2 虚拟服务器部分中的说明完成此步骤并为 Ansible 创建 EC2 虚拟服务器实例。
不要忘记添加安全组设置。它允许Ansible和SSH分别在端口8080和22上工作。
使用名称“AnsibleServer”来区分您的 EC2 虚拟服务器实例。
您可以为新的“AnsibleServer” EC2 实例重复使用“CI_CD_Pipeline”安全组和“CI_CD_Pipeline_Key_Pair” 。
然后单击“连接”按钮。
然后你就会看到这个网页。您应该再次单击“连接”按钮。
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 su - ansible-admin
ssh-keygen
现在您可以在“AnsibleServer” EC2 虚拟服务器实例上安装 Ansible。
当我们着手做吧。
sudo amazon-linux-extras install ansible2
ansible --version
由于 Ansible 安装在“AnsibleServer” EC2 虚拟服务器实例上,因此您可以配置 Jenkins 将其与 Ansible 集成。您需要安装“Publish over SSH”插件,以将 Jenkins 与安装了 Ansible 的 EC2 虚拟服务器实例以及安装了Kubernetes的其他 EC2 虚拟服务器实例集成。
转到“仪表板” →“管理 Jenkins” → “配置系统” → “可用插件” 。
然后在搜索框中输入“Publish over SSH” 。
单击“安装而不重新启动”按钮。等待下载过程结束。
为此,请按照下列步骤操作:
转到“仪表板” → “管理 Jenkins” → “配置系统” → “通过 SSH 发布” 。
然后单击“应用”和“保存”按钮。
到这里,您已经完成了“Publish over SSH” Jenkins 插件的配置。
转到 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
hosts
参数设置为 IP 地址或主机名列表。/etc/ansible/hosts
。
通过编辑/etc/ansible/hosts
,您可以轻松管理主机组,而无需在每次运行 playbook 时写出它们的 IP 地址。
sudo ifconfig
sudo vi /etc/ansible/hosts
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认证安装成功完成。
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 已可供选择。
cd /opt/docker
sudo -u ansible-admin ansible-playbook /opt/docker/hello-app.yml
现在, “Publish over SSH” Github 插件、Ansible 和 Docker 已安装并配置完毕,您现在可以将它们全部集成到您在“[模块 2]:Jenkins 服务器”中创建的管道中,以传输项目 jar 工件从“ JenkinsServer”到“AnsibleServer” ,然后从您的项目构建一个新的 Docker 镜像,然后将此 Docker 镜像推送到 Dockerhub 上。
要实现它,您需要执行以下步骤:
最后,单击“应用”和“保存”按钮即可完成 Ansible Docker 与管道的集成任务。
现在,您可以测试升级后的管道,以将项目 jar 工件从“ JenkinsServer”无缝传输到“AnsibleServer” ,然后从您的项目构建新的 Docker 映像,然后将此 Docker 映像推送到 Dockerhub。为此,您需要单击“立即构建”按钮。因此,您将在构建历史记录中看到成功的作业结果。
现在让我们在 EC2 实例上配置 K8s。您将创建一个新的 EC2 实例并安装其 kubectl 命令行工具以进一步与Kubernetes集群交互。
使用本教程“启动 AWS EC2 虚拟服务器实例”部分中的说明来完成此步骤。
不要忘记添加安全组设置。它允许所有工具和SSH分别在端口8080和22上工作。
使用名称“K8sServer”来区分您的 EC2 虚拟服务器实例。
您可以为新的“K8sServer” EC2 实例重复使用“CI_CD_Pipeline”安全组和“CI_CD_Pipeline_Key_Pair” 。
sudo vi /etc/hostname
将此主机名替换为“kubernetes-server”,然后重新启动它。
sudo init 6
使用此命令检查AWS版本。
aws --version
如果您可以看到版本aws-cli/1.18 ,则应该下载最新版本。
复制粘贴curl命令。
curl "//awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
等候在线下载阶段已经开始。
unzip awscliv2.zip
sudo ./aws/install
aws --version
Kubectl是一个基本的命令行工具,用于与任何 Kubernetes 集群交互,无论底层基础设施如何。它允许您在 Kubernetes 集群中管理资源、部署应用程序、配置网络、访问日志以及执行各种其他任务。
现在您需要安装 kubectl 命令行工具以进一步与 Kubernetes 集群交互。为此,您需要转到AWS →文档→ Amazon EKS →用户指南→安装或更新kubectl → Linux 。
curl -O //s3.us-west-2.amazonaws.com/amazon-eks/1.27.1/2024-04-19/bin/linux/amd64/kubectl
chmod +x kubectl
sudo mv kubectl /usr/local/bin
kubectl version --output=yaml
Eksctl是另一个专门为 Amazon EKS 服务定制的命令行工具。 Eksctl 可用于创建 AWS EKS 集群、管理节点组以及执行特定于 EKS 的任务,例如通过抽象出大部分 AWS 基础设施设置和管理来与 IAM 角色和其他 AWS 服务集成。
curl --silent --location "//github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin
eksctl version
您需要创建一个 IAM 角色并将其附加到您的“KubernetesServer” 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 优化的平台,用于部署、管理和扩展容器化应用程序、简化操作并使开发人员能够专注于编码而不是管理底层基础设施。
为此,请按照下列步骤操作:
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 网页上指示为“正在创建” 。
此外,您可以在 AWS CloudFormation 网页上验证EKS 集群创建成功的状态。
Kubernetes 部署 YAML 文件是以 YAML 格式编写的配置脚本,定义如何管理和维护 Kubernetes 集群中的特定应用程序或服务。它封装了用于编排运行应用程序的容器的部署、扩展、更新和监视的指令。该文件包含容器映像、所需副本数量、资源限制、环境变量、网络设置等详细信息。当应用于 Kubernetes 集群时,部署 YAML 文件可确保应用程序的所需状态,自动管理容器的创建、扩展和恢复,以维持所需的可用性和可靠性级别。
touch hello-app-deployment.yaml
vi 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
Kubernetes 服务 YAML 文件是以 YAML 格式编写的配置脚本,它定义一组 Pod 的网络抽象,允许在 Kubernetes 集群内一致地访问它们。该文件概述了其他服务或外部客户端应如何发现、访问和平衡该服务的负载。它包括服务类型(ClusterIP、NodePort、LoadBalancer)、端口号、用于识别 pod 的选择器等规范。当应用于 Kubernetes 集群时,服务 YAML 文件会创建一个虚拟 IP 和端口,将流量路由到适当的 Pod,抽象底层 Pod 更改并提供稳定的通信端点,从而实现无缝连接和动态扩展。
touch hello-app-service.yaml
vi hello-app-service.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 已运行并可供运行。
应用部署。
便用一下命令提示符应运部署安排标准配置。 kubectl apply -f hello-app-deployment.yaml
这将组建享有自定义量的坐骑和翻滚系统更新对策的推进,保证 应用编译程序的需用性和可工作管理性。
2. 申请服务。
接下去来,采用服务质量设置。 kubectl apply -f hello-app-service.yaml
这将设备一名 LoadBalancer 性质的服务管理,将您的APP步骤公开透明到互下载客户端络网。请勿事项,运行环境 LoadBalancer 并获取一个静态 IP ip地址会须得一段落用时。
检查负载均衡器状态。
视频监控您的工作动用的状态。 kubectl get service zufarexplainedit-hello-app-service
安排内部 IP 后,您就近乎做准备好采访您的用途程序代码了。
访问您的应用程序。
便用 Web 看器进入都分配好的第三方 IP 地此,后跟:8080。时光后面,网站将弹出,并提示“HelloWorld”qq信息。请切记,刚开始弹出可能需几五秒。
1. 删除所有部署。
要卸载几乎所有布署,能够操作以上操作命令。 kubectl delete deployments --all
此运作可保持云计算平台中不保留其他活动组织的部署安排事列。
2. 删除所有 Pod 。
若必须册除任何 Pod,无论怎样患者有无由研究部署标准化管理,能够以用到下类操作命令。 kubectl delete pods --all
清空 Pod 能能益处开启集群式心态或者新部署工作做到位备考。
3.删除所有服务。
要去除将广泛软件包流程图泄露给wifi网络的服务性,您能否实用下面的系统命令。 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 su - ansible-admin
您计划在本文中进一步管理远程服务器,例如K8s EC2 虚拟服务器实例。这就是为什么您需要设置 SSH 密钥。
ssh-keygen
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”中传递的相同步骤。
sudo ifconfig
sudo vi /etc/ansible/hosts
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 已可供选用。
sudo -u ansible-admin ansible-playbook /opt/docker/kubernetes-hello-app.yml
Zufar Sunagatov是一位经验丰富的高级软件工程师,热衷于设计现代软件系统。