使用 Jenkins 将 Docker 镜像部署到 Kubernetes 集群
本文解释了从创建项目到使用Jenkins将Docker映像部署到Kubernetes集群的完整DevOps管道设置。
DevOps 管道
之前我们已经看到了如何使用 Jenkins 将 Docker 镜像推送到 Docker 集线器。这篇文章是上一篇文章的延续。在本文中,我们将看到如何将Docker 镜像从 Docker hub部署到Kubernetes 集群。这是 DevOps 管道中应用程序部署的最后阶段。为了完全理解本文,您已经需要了解使用 Jenkins 的 CI/CD 管道。如果没有,请按照文章中给出的链接设置 CI/CD 管道。
如果您完成了本文,那么您就可以自己设置 DevOps 管道。但是,您需要许多先决条件才能完成设置。下面给出了先决条件列表。
先决条件:
-
Kubernetes集群
-
Kubernetes 客户端
-
Docker
-
JenkinsServer
-
BitBucket 账户
-
Git
-
NodeJS
我假设您具有上述先决条件。我在这个例子中使用了 Linode Cloud 服务器,包括 Kubernetes 集群。NodeJS 和 Git 将安装在本地计算机上。在 BitBucket 上创建一个帐户。Docker 和 Jenkins 服务器安装在同一台云服务器上。我使用了 Ubuntu 云服务器作为 Kubernetes 客户端工具(安装在 Ubuntu 服务器上的 kubectl)。最后是 Linode Kubernetes 集群。我告诉你我在这个设置中使用了什么。但是,您可以使用任何云提供商来安装所需的软件。
在本文中,我们将看到以下主题。
-
使用 Jenkins 将 Docker 镜像推送到 Docker Hub。
-
在 Kubernetes 客户端上生成 SSH 密钥。
-
在Jenkins中配置SSH Key。
-
创建部署文件。
-
使用 Jenkinsfile 将 Docker 镜像部署到 Kubernetes 集群
-
测试部署管道
使用 Jenkins 将 Docker 镜像推送到 Docker Hub:
我已经创建了一篇关于如何使用 Jenkins 将 Docker 镜像推送到 Docker 集线器的文章。因此,请使用以下链接了解有关如何使用 Jenkins 将 Docker 镜像推送到 Docker 集线器的更多信息。
如何使用 Jenkins 将 Docker 镜像推送到 Docker Hub使用 Jenkins 自动构建 Docker 映像并将其推送到 Docker Hub。媒体网
如果您已经使用 Jenkins 创建了上述设置,请跳过本节并转到下一节。
在 Kubernetes 客户端生成 SSH 密钥:
我们完成了 Docker 镜像推送功能。现在我们需要使用 Jenkins 将 Docker 镜像部署到 Kubernetes 集群。Kubernetes master 可以使用 Kubernetes 客户端工具kubectl进行交互。kubectl 安装在云服务器上。我将 Ubuntu Cloud 服务器用于 Kubernetes 客户端。因此我们可以使用 Kubernetes 客户端工具(kubectl)将 Docker 镜像部署到 Kubernetes 集群。要使用Jenkins连接Kubernetes客户端计算机,我们需要在Kubernetes客户端计算机上生成SSH密钥,并将私钥添加到Jenkins服务器。
使用以下命令在 Kubernetes 客户端计算机上生成公钥和私钥。
ssh-keygen
它会询问密钥的名称。所以给个名字。如果需要,请提供密钥的密码。
如果您遇到任何错误,请参阅以下 URL 中的2. Jenkins中的持续部署 (CD) 设置。
创建简单的 DevOps 项目使用 BitBucket、Jenkins 和 PHP 服务器设置 CI 和 CD 管道媒体网
在 Jenkins 中配置 SSH 密钥:
现在将私钥添加到 Jenkins 服务器。因此,请转到Manage Jenkins -> Manage Credentials -> Domains(global) -> Add Credentials。在此处添加用户名和私钥。
Jenkins 为私钥添加凭据部分
创建部署文件:
要在 Kubernetes 集群上部署 Docker 镜像,我们需要部署文件。因此,在您的本地计算机上创建一个部署文件。我将部署文件放在项目根文件夹中。文件名为***node-deployment.yaml***。将以下部署代码粘贴到 node-deployment.yaml 文件中。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodeapp-deployment
labels:
app: nodeapp
type: front-end
spec:
template:
metadata:
name: nodejsapp-pod
labels:
app: nodejsapp
type: front-end
spec:
containers:
- name: nodejsapp-erp
image: "bharathirajatut/erp:1.0"
replicas: 1
selector:
matchLabels:
type: front-end
---
apiVersion: v1
kind: Service
metadata:
name: nodejs-service
spec:
selector:
app: nodejsapp
type: LoadBalancer
ports:
- protocol: TCP
targetPort: 3000
port: 80
nodePort: 30000
将 Docker 镜像部署到 Kubernetes 集群:
现在我们需要向现有的 Jenkins 文件添加一些指令。
-
1.使用***scp***命令将 Deployment 文件复制到 Kubernetes 客户端计算机。
-
2.在 Kubernetes 客户端计算机上使用***kubectl apply***命令部署文件。
因此,在现有的 Jenkins 文件中添加以下代码。
stage('部署到 K8s')
{
steps{
sshagent(['k8s-jenkins'])
{
sh 'scp -r -o StrictHostKeyChecking=no node-deployment.yaml username@102.10.16.23:/path'脚本{
try{
sh 'ssh username@102.10.16.23 kubectl apply -f /path/node-deployment.yaml --kubeconfig=/path/kube.yaml'}捕获(错误)
{}
}
}
}
}
在上面的代码中,
- 请更改IP地址和用户名
- 并更改 kubeconfig 文件的位置。
Jenkinsfile 的完整代码如下。
pipeline{
agent any
environment {
DOCKERHUB_CREDENTIALS=credentials('dockerhub-cred-raja')
}
stages {
stage('Build') {
steps {
sh 'docker build -t bharathirajatut/erp:1.0 .'
}
}
stage('Login') {
steps {
sh 'echo $DOCKERHUB_CREDENTIALS_PSW | docker login -u $DOCKERHUB_CREDENTIALS_USR --password-stdin'
}
}
stage('Push') {
steps {
sh 'docker push bharathirajatut/erp:1.0'
}
}
stage('Deploy to K8s')
{
steps{
sshagent(['k8s-jenkins'])
{
sh 'scp -r -o StrictHostKeyChecking=no node-deployment.yaml username@102.10.16.23:/path'
script{
try{
sh 'ssh username@102.10.16.23 kubectl apply -f /path/node-deployment.yaml --kubeconfig=/path/kube.yaml'
}catch(error)
{
}
}
}
}
}
}
post {
always {
sh 'docker logout'
}
}
}
测试部署:
只需使用 Git 命令来测试部署。为什么,因为它是一个完整的管道。如果我们提交对源代码的任何更改,则会为源代码创建一个新的 Docker 映像并将其部署到 Kubernetes 集群。
因此,在您的本地计算机上使用以下代码测试部署。
git add .
git commit -m 'Deployment'
git push origin main
在 NodeJS 项目根文件夹中执行上述代码。它将创建一个新的 Docker 镜像并将其部署到 Kubernetes 集群。
您可以检查 Kubernetes 集群中正在运行的 Pod 来验证部署是否成功。
kubectl get pods
就这样。DevOps 管道现已完成。
我遇到的问题:
Jenkins在远程服务器上执行kubectl apply命令时抛出一些错误。为什么是因为 kubectl 命令无法找到 Kubernetes master 的配置文件。所以在 kubectl apply 命令中添加kubeconfig文件位置。
kubectl apply -f file.yaml --kubeconfig=/path_to_config_file
请注意。为kube 配置文件授予适当的文件权限。如果它没有适当的权限,那么它会再次抛出错误。
总结:
本文使用 Kubernetes 集群完成了 DevOps 管道。但是,它不是生产就绪的设置。我们需要在管道中添加更多工具,使其完全可以投入生产。但是本文足以使用 Kubernetes 集群启动您的 DevOps 管道。
感谢您的阅读。
评论区