Jenkins pipeline部署k8s应用

环境

Kubernetes v1.22.3
基本k8s部署的Jenkins 2.303.3
基本k8s部署的Harbor

k8s部署应用流程
  • 编写代码
  • 测试
  • 编写 Dockerfile
  • 构建打包 Docker 镜像
  • 推送 Docker 镜像到仓库
  • 编写 Kubernetes YAML 文件
  • 更改 YAML 文件中 Docker 镜像 TAG
  • 利用 kubectl 工具部署应用

部署应用

一、准备应用程序

我这里准备了一个简单的go程序,部署到k8s环境中,代码链接:https://github.com/wozengkeai/jenkins-demo.git

二、Jenkins安装kubernetes插件
  • Jenkins Master 和 Jenkins Slave 以 Pod 形式运行在 Kubernetes 集群的 Node 上,Master 运行在其中一个节点,并且将其配置数据存储到一个 Volume 上去,Slave 运行在各个节点上,并且它不是一直处于运行状态,它会按照需求动态的创建并自动删除。
  • 这种方式的工作流程大致为:当 Jenkins Master 接受到 Build 请求时,会根据配置的 Label 动态创建一个运行在 Pod 中的 Jenkins Slave 并注册到 Master 上,当运行完 Job 后,这个 Slave 会被注销并且这个 Pod 也会自动删除,恢复到最初状态
  • 实践下来后发现这种方式仍是有不足的地方,每个应用都需要配置一个cloud,当程序多的时候工作量就大了,后续考虑优化
基于 Kubernetes 搭建 Jenkins 集群.png

接下来就需要配置Jenkins,让他动态生成slave的pod
1.安装kubernetes plugin,管理Jenkins-插件管理-可选插件-Kubernetes勾选安装即可。


图片.png

2.安装完毕后,管理Jenkins-系统配置,拉到最底下点击进入配置页面-add a new cloud,然后填写k8s和Jenkins的配置信息。


kubernetes.png

注意:namespace,我这里填的是jenkins(事先在我的k8s上创建的),点击连接测试,提示连接到kubernetes就标识Jenkins和k8s可以正常通信了,就可以愉快的进行下一步了~然后下方的 Jenkins URL的格式为:服务名.namespace.svc.cluster.local:8080

  1. 配置 Pod Template,其实就是配置 Jenkins Slave 运行的 Pod 模板,Labels 这里也非常重要,对于后面执行 Job 的时候需要用到该值(没有这个labels的话后续执行时找不到执行的pod),然后我们这里使用的是 cnych/jenkins:jnlp6 这个镜像,这个镜像是在官方的 jnlp 镜像基础上定制的,加入了 kubectl 等一些实用的工具。


    Pod Templates.png

    注意:工作目录,Jenkins的运行路径,即我部署在k8s上的Jenkins的挂载目录(根据自己实际路径填写)
    4.注意底下两个需要挂载的主机目录,一个是/var/run/docker.sock,该文件是用于 Pod 中的容器能够共享宿主机的 Docker,这就是大家说的 docker in docker 的方式,Docker 二进制文件我们已经打包到上面的镜像中了;另外一个目录下/home/tester/.kube目录,我们将这个目录挂载到容器的/root/.kube目录下面这是为了让我们能够在 Pod 的容器中能够使用 kubectl 工具来访问我们的 Kubernetes 集群,方便我们后面在 Slave Pod 部署 Kubernetes 应用。


    volume.png

5.如果运行 Slave Pod 的时候出现了权限问题,因为 Jenkins Slave Pod 中没有配置权限,所以需要配置上 ServiceAccount,在 Slave Pod 配置的地方点击下面的高级,添加上对应的 ServiceAccount 即可(不要照搬,前提是你的k8s创建了这个sa)


图片.png
三、创建新的pipeline项目

1.创建一个新的流水线


图片.png

2.配置SCM


SCM.png

3.配置凭证
点击添加-Jenkins


图片.png
四、编写pipeline脚本

①withCredentials,其中有一个 credentialsId 值就是我们刚刚创建的凭证 ID 值
②更新k8s系统中应用的镜像版本时,-n 指定命名空间,我创建了一个新的jenkins-demo命名空间
③node指定label属性,才可以指定我们要跑的pod是kubernetes插件中配置的pod模板

node('jenkins-jnlp') {
    stage('Clone') {
      echo "1.Prepare Stage"
      checkout scm
      script {
        build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
    }
    }
    stage('Test') {
      echo "2.Test Stage"
    }
    stage('Build') {
      echo "3.Build Docker Image Stage"
      sh "docker build -t 192.168.100.51:30003/jenkins/jenkins-demo:${build_tag} ."
    }
    stage('Push') {
      echo "4.Push Docker Image Stage"
      withCredentials([usernamePassword(credentialsId: 'dockerHarbor', passwordVariable: 'dockerHarborPassword', usernameVariable: 'dockerHarborUser')]) {
        //sh "pwd"
        sh "echo '${dockerHarborPassword}' | docker login 192.168.100.51:30003 -u ${dockerHarborUser} --password-stdin "
        sh "docker push 192.168.100.51:30003/jenkins/jenkins-demo:${build_tag}"
        }
    }
    stage('YAML') {
      echo "5. Change YAML File Stage"
      sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s.yaml"
      //sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s.yaml"
    }
    stage('Deploy') {
      echo "6. Deploy Stage"
      sh "kubectl apply -f k8s.yaml -n jenkins-demo"
    }
}
五、构建项目
构建成功.png

至此CI/CD流程完成~接下来记录遇到的坑
1、x509: certificate signed by unknown authority


图片.png

在登陆harbor时提示x509报错:
①检查证书是否放置正确路径(master和所有node都要配置)


图片.png

②检查是否配置了docker代理(因为代理一直导致x509,所有办法都试过了都无效,最后在家里重新部了个环境,才发现是代理引起的,不知道为什么有的却不出现这个提示,家里k8s版本是1.23.0)
清除/etc/systemd/system/docker.service.d/http-proxy.conf配置文件内容(可能文件名称会不同)
图片.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容