Jenkins-部署到 kubernetes

Posted shark_西瓜甜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jenkins-部署到 kubernetes相关的知识,希望对你有一定的参考价值。

一、概述

Kubernetes Continuous Deploy

一个Jenkins插件,用于将资源配置部署到Kubernetes集群。

它提供以下功能:

  • 通过 SSH 从主节点获取群集凭据。您也可以手动配置它。
  • 资源配置的变量替换,使您可以进行动态资源部署。
  • 私有 Docker 注册表的 Docker 登录凭证管理。
  • 无需在 Jenkins 从节点上安装该 kubectl 工具。

插件支持以下资源类型:

  • Deployment
  • Replica Set
    -Replication Controller - 不支持滚动更新。如果需要,可以考虑使用部署。
  • Daemon Set
  • Pod
  • Job
  • Service
  • Ingress
  • Secret - 插件还提供秘密配置。

注意:
在持续集成和持续部署的环境中,只有那些需要定期更新的资源应该放在Jenkins部署中。所以大多数时候插件应该主要处理 Deployment 类型的资源。

二、Pipeline 的支持

1 脚本式 Pipeline

kubernetesDeploy(kubeconfigId: 'kubeconfig-credentials-id',               // REQUIRED

                 configs: '<ant-glob-pattern-for-resource-config-paths>', // REQUIRED
                 enableConfigSubstitution: false,
        
                 secretNamespace: '<secret-namespace>',
                 secretName: '<secret-name>',
                 dockerCredentials: [
                        [credentialsId: '<credentials-id-for-docker-hub>'],
                        [credentialsId: '<credentials-id-for-other-private-registry>', url: '<registry-url>'],
                 ]
)

下面是部署的最基本配置

kubernetesDeploy(
        ...
        configs: '部署资源的 YML 文件,比如*.yml',
        enableConfigSubstitution: true,  // 这个默认值就是 true
        ...
)

配置文件绑定

假如 kubernetes 的配置文件以凭据的方式保存在 Jenkins 中的时候,可以利用 credentials binding插件将kubeconfig内容绑定到变量。可以将变量中的内容保存到本地文件中,该文件可用于调用kubectl命令(使用–kubeconfig参数)

以下是以 Pipeline 方式的配置绑定

withCredentials([kubeconfigContent(credentialsId: '6710f45-5f4c-4ddb-8bfc-c41e810be1cc', variable: 'KUBECONFIG_CONTENT')]) {
    sh '''echo "$KUBECONFIG_CONTENT" > kubeconfig && cat kubeconfig && rm kubeconfig'''
}

版本不兼容解决方案

pipeline {
  // 设置全局环境变量
  environment {
    url = 'git@gitee.com:xiguatian/simple-java-maven-app.git'

  }
  // 全局代理是 none,表示全局上不设置任何代理,需要在每个步骤中设置代理
  agent none
  stages {
    // 拉取代码并构建
    stage('pull code and build') {
      // 此阶段的代理: docker 容器
      agent {
        docker {
        image 'maven:3-alpine'
        args '-v $HOME/.m2:/root/.m2'
        // 自定义的工作空间
        customWorkspace "/opt/"
        }
      }
      steps {
        // 拉取代码
        git(url: env.url, branch: 'master', credentialsId: 'gitlab')
        // 构建
        sh 'mvn -B clean package'
      }
    }
    // 构建镜像
    stage("build image"){
      agent {
        node {
          label 'master'
          customWorkspace "/opt/"

        }
      }
      steps {
        script {
          docker.withRegistry('http://192.168.122.100:80', 'harbor') {
            docker.build('app-java/myapp').push('6.9')
          }
        }
      }
    }
    stage("deploy app"){
      agent {
        node {
          label 'master'
          customWorkspace "/opt/"

        }
      }
      steps {
        kubernetesDeploy(
          kubeconfigId: 'k8s-auth',               // REQUIRED
          configs: 'myapp.yml', // REQUIRED
          enableConfigSubstitution: true,
          secretName: 'harbor-auth', 
          dockerCredentials: [[credentialsId: 'harbor', url: 'http://192.168.122.100:80']]
        )
      }
    }
  }
}

将上面最后部分修改为

    stage("deploy app"){
      agent {
        node {
          label 'master'
          customWorkspace "/opt/"

        }
      }
      steps {
        sh 'kubectl apply -f myapp.yml'
      }
    }

使用到的 myapp.yml 文件是 kubernetes 的部署文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  selector:
    matchLabels:
      app: myapp
  replicas: 2
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: 192.168.122.100:80/app-java/myapp:v5.0
      imagePullSecrets:
        - name: harbor-auth  // 用于harbor 仓库的认证密钥
      

192.168.122.100:80/app-java/myapp:v5.0 是私有仓库,需要进行认证

kubernetes 中给 Docker 的私有仓库创建认证,使用如下命令

kubectl create secret docker-registry harbor-auth --docker-username=harbor仓库的用户名 --docker-password=密码 --docker-server=http://192.168.122.100:80

docker-registry 是密钥类型

harbor-auth 是密钥的名称

以上是关于Jenkins-部署到 kubernetes的主要内容,如果未能解决你的问题,请参考以下文章

聊聊代码 | 基于Shell,Jenkins+Docker+Kubernetes的持续集成与部署

kubernetes:无法使用具有 RW 访问权限的持久卷部署 jenkins 映像

Jenkins + Gitlab + harbor + Kubernetes实现CI/CD

Jenkins + Gitlab + harbor + Kubernetes实现CI/CD

如何用Jenkins实现自动化部署svn更新代码

kubernetes搭建gitlab开启ssh