前言

Jenkins作为持续集成持续部署中的核心应用,一直被广泛使用。而kubernetes也已经成为事实上的容器运行环境。所以作为部署侧的功能,Jenkins也有将应用能够对接到kubernetes平台进行部署的需求。

对接kubernetes,通常我们使用的方法是通过kubectl命令进行部署。在jenkins中我们也可以封装好kubectl命令,进行资源的部署。今天我们讲的是另外一种部署kuberntes资源的方法 - 使用kubernetes CD插件进行资源的部署。

配置

首先要安装jenkins,具体的操作请参见我的历史文章:

  • 使用Docker搭建Jenkins进行持续集成持续部署
  • 使用helm在kubernetes环境中安装Jenkins

安装好了Jenkins之后,我们需要安装kuberntes CD的插件。

jenkins 执行kubectl失败 jenkins kubernetes插件_jenkins 执行kubectl失败

我们登录Jenkins --> 系统管理 --> 插件管理 --> 可选插件,

搜索"Kubernetes Continuous Deploy",并安装, 安装后重启。

jenkins 执行kubectl失败 jenkins kubernetes插件_git_02

测试

下面我们正式开始我们的测试,我们需要准备一个gitlab项目,用于kubernetes CD读取并部署。Gitlab项目中可以存储:

  1. 部署的kubernetes资源,例如deployment和service的定义
  2. 用于jenkins流水线的Jenkinsfile文件

我们正常的应用环境使用应该是在源代码的gitlab项目中,并且使用Dockerfile进行镜像打包再部署到应用环境中。本文对此做简化处理,只运行CD部署的部分

jenkins 执行kubectl失败 jenkins kubernetes插件_kubernetes_03

因为要从gitlab上拿到信息,我们需要在Jenkins中添加凭据。同时我们还要添加kubeconfig凭据,用于同kuberntes通信(原理和kubectl一样,用户需要获取正确的kubeconfig文件)

添加gitlab项目的凭据如图:

jenkins 执行kubectl失败 jenkins kubernetes插件_git_04

添加kubeconfig的凭据如图:

jenkins 执行kubectl失败 jenkins kubernetes插件_Jenkins_05

创建完之后如图:

jenkins 执行kubectl失败 jenkins kubernetes插件_kubernetes_06

Jenkinsfile中配置了两个stage,并且连接到必要的凭据ID,Jenkinsfile内容如下:

pipeline {
   agent any

   stages {
   
      stage('Pull Source Code') {
          steps {
              git credentialsId: 'mygitlab', branch: 'master' , url: 'http://192.168.100.4/gitlab/lijinyang/kubernetescdtest.git'
          }
      }
      
      stage('deploy to kubesphere') {
          steps {
            kubernetesDeploy(enableConfigSubstitution: false, kubeconfigId: 'k8scloud', configs: 'app.yaml')
          }
      }
   }
}

app.yaml中包含了Deployment和Service资源,以下资源示例是要部署一个nginx到kubernets环境中,并通过service的Nodeport暴露服务便于我们访问进行测试。

kind: Deployment
apiVersion: apps/v1
metadata:
  name: kubernetscd
  namespace: default
  labels:
    app: kubernetscd
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kubernetscd
  template:
    metadata:
      labels:
        app: kubernetscd
    spec:
      containers:
        - name: kubernetscd
          image: 'nginx:latest'
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: kubernetscd
  name: kubernetscd
  namespace: default
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: kubernetscd
  type: NodePort

下面我们创建流水线。

jenkins 执行kubectl失败 jenkins kubernetes插件_git_07

连接到相应的gitlab的项目中读取Jenkinsfile

jenkins 执行kubectl失败 jenkins kubernetes插件_kubernetes_08

保存之后我们就可以触发流水线看看效果。

流水线运行成功!

jenkins 执行kubectl失败 jenkins kubernetes插件_jenkins 执行kubectl失败_09

我们使用kubectl查看是否已经部署了我们需要的资源:

[aiops@3 jenkins-data]$ kubectl get deployments,svc | grep kubernetescd
deployment.apps/kubernetescd       1/1     1            1           93s
service/kubernetescd    NodePort    10.43.219.152   <none>        80:32708/TCP     93s

可以看到nodeport是32708,我们使用nodeport访问

jenkins 执行kubectl失败 jenkins kubernetes插件_devops_10

访问成功!

总结

本文介绍了使用kubernetes CD插件,在Jenkins中部署应用到kuberetes平台的方法。Jenkins在kubernetes大行其道的背景下仍然可以发挥光和热。之后我也会陆续介绍以下在kubernetes下部署的Jenkins的使用方法,介绍如何使用kubernetes插件进行容器云下的流水线配置。欢迎持续关注。