侧边栏壁纸
博主头像
WinJay博主等级

博观而约取 厚积而薄发

  • 累计撰写 319 篇文章
  • 累计创建 169 个标签
  • 累计收到 1 条评论
隐藏侧边栏

使用Jenkins将Docker镜像部署到Kubernetes集群

WinJay
2021-09-26 / 0 评论 / 0 点赞 / 53 阅读 / 3,948 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2021-12-15,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

使用 Jenkins 将 Docker 镜像部署到 Kubernetes 集群

本文解释了从创建项目到使用Jenkins将Docker映像部署到Kubernetes集群的完整DevOps管道设置。

imgDevOps 管道

之前我们已经看到了如何使用 Jenkins 将 Docker 镜像推送到 Docker 集线器。这篇文章是上一篇文章的延续。在本文中,我们将看到如何将Docker 镜像从 Docker hub部署到Kubernetes 集群。这是 DevOps 管道中应用程序部署的最后阶段。为了完全理解本文,您已经需要了解使用 Jenkins 的 CI/CD 管道。如果没有,请按照文章中给出的链接设置 CI/CD 管道。

如果您完成了本文,那么您就可以自己设置 DevOps 管道。但是,您需要许多先决条件才能完成设置。下面给出了先决条件列表。

先决条件:

  1. Kubernetes集群

  2. Kubernetes 客户端

  3. Docker

  4. JenkinsServer

  5. BitBucket 账户

  6. Git

  7. NodeJS

我假设您具有上述先决条件。我在这个例子中使用了 Linode Cloud 服务器,包括 Kubernetes 集群。NodeJS 和 Git 将安装在本地计算机上。在 BitBucket 上创建一个帐户。Docker 和 Jenkins 服务器安装在同一台云服务器上。我使用了 Ubuntu 云服务器作为 Kubernetes 客户端工具(安装在 Ubuntu 服务器上的 kubectl)。最后是 Linode Kubernetes 集群。我告诉你我在这个设置中使用了什么。但是,您可以使用任何云提供商来安装所需的软件。

在本文中,我们将看到以下主题。

  1. 使用 Jenkins 将 Docker 镜像推送到 Docker Hub。

  2. 在 Kubernetes 客户端上生成 SSH 密钥。

  3. 在Jenkins中配置SSH Key。

  4. 创建部署文件。

  5. 使用 Jenkinsfile 将 Docker 镜像部署到 Kubernetes 集群

  6. 测试部署管道


使用 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。在此处添加用户名和私钥。

img

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'}捕获(错误)
       {} 
     } 
    } 
   } 
  }

在上面的代码中,

  1. 请更改IP地址和用户名
  2. 并更改 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 管道。

感谢您的阅读。

0

评论区