Jenkins pipeline部署k8s應(yīng)用

環(huán)境

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

k8s部署應(yīng)用流程
  • 編寫代碼
  • 測試
  • 編寫 Dockerfile
  • 構(gòu)建打包 Docker 鏡像
  • 推送 Docker 鏡像到倉庫
  • 編寫 Kubernetes YAML 文件
  • 更改 YAML 文件中 Docker 鏡像 TAG
  • 利用 kubectl 工具部署應(yīng)用

部署應(yīng)用

一足绅、準(zhǔn)備應(yīng)用程序

我這里準(zhǔn)備了一個簡單的go程序族购,部署到k8s環(huán)境中旁瘫,代碼鏈接:https://github.com/wozengkeai/jenkins-demo.git

二、Jenkins安裝kubernetes插件
  • Jenkins Master 和 Jenkins Slave 以 Pod 形式運行在 Kubernetes 集群的 Node 上诵冒,Master 運行在其中一個節(jié)點凯肋,并且將其配置數(shù)據(jù)存儲到一個 Volume 上去,Slave 運行在各個節(jié)點上汽馋,并且它不是一直處于運行狀態(tài),它會按照需求動態(tài)的創(chuàng)建并自動刪除圈盔。
  • 這種方式的工作流程大致為:當(dāng) Jenkins Master 接受到 Build 請求時豹芯,會根據(jù)配置的 Label 動態(tài)創(chuàng)建一個運行在 Pod 中的 Jenkins Slave 并注冊到 Master 上,當(dāng)運行完 Job 后驱敲,這個 Slave 會被注銷并且這個 Pod 也會自動刪除铁蹈,恢復(fù)到最初狀態(tài)
  • 實踐下來后發(fā)現(xiàn)這種方式仍是有不足的地方,每個應(yīng)用都需要配置一個cloud众眨,當(dāng)程序多的時候工作量就大了握牧,后續(xù)考慮優(yōu)化
基于 Kubernetes 搭建 Jenkins 集群.png

接下來就需要配置Jenkins,讓他動態(tài)生成slave的pod
1.安裝kubernetes plugin娩梨,管理Jenkins-插件管理-可選插件-Kubernetes勾選安裝即可沿腰。


圖片.png

2.安裝完畢后,管理Jenkins-系統(tǒng)配置狈定,拉到最底下點擊進(jìn)入配置頁面-add a new cloud颂龙,然后填寫k8s和Jenkins的配置信息。


kubernetes.png

注意:namespace纽什,我這里填的是jenkins(事先在我的k8s上創(chuàng)建的)措嵌,點擊連接測試,提示連接到kubernetes就標(biāo)識Jenkins和k8s可以正常通信了芦缰,就可以愉快的進(jìn)行下一步了~然后下方的 Jenkins URL的格式為:服務(wù)名.namespace.svc.cluster.local:8080

  1. 配置 Pod Template企巢,其實就是配置 Jenkins Slave 運行的 Pod 模板,Labels 這里也非常重要让蕾,對于后面執(zhí)行 Job 的時候需要用到該值(沒有這個labels的話后續(xù)執(zhí)行時找不到執(zhí)行的pod)浪规,然后我們這里使用的是 cnych/jenkins:jnlp6 這個鏡像,這個鏡像是在官方的 jnlp 鏡像基礎(chǔ)上定制的涕俗,加入了 kubectl 等一些實用的工具罗丰。


    Pod Templates.png

    注意:工作目錄,Jenkins的運行路徑再姑,即我部署在k8s上的Jenkins的掛載目錄(根據(jù)自己實際路徑填寫)
    4.注意底下兩個需要掛載的主機(jī)目錄萌抵,一個是/var/run/docker.sock,該文件是用于 Pod 中的容器能夠共享宿主機(jī)的 Docker,這就是大家說的 docker in docker 的方式绍填,Docker 二進(jìn)制文件我們已經(jīng)打包到上面的鏡像中了霎桅;另外一個目錄下/home/tester/.kube目錄,我們將這個目錄掛載到容器的/root/.kube目錄下面這是為了讓我們能夠在 Pod 的容器中能夠使用 kubectl 工具來訪問我們的 Kubernetes 集群讨永,方便我們后面在 Slave Pod 部署 Kubernetes 應(yīng)用滔驶。


    volume.png

5.如果運行 Slave Pod 的時候出現(xiàn)了權(quán)限問題,因為 Jenkins Slave Pod 中沒有配置權(quán)限卿闹,所以需要配置上 ServiceAccount揭糕,在 Slave Pod 配置的地方點擊下面的高級,添加上對應(yīng)的 ServiceAccount 即可(不要照搬锻霎,前提是你的k8s創(chuàng)建了這個sa)


圖片.png
三著角、創(chuàng)建新的pipeline項目

1.創(chuàng)建一個新的流水線


圖片.png

2.配置SCM


SCM.png

3.配置憑證
點擊添加-Jenkins


圖片.png
四、編寫pipeline腳本

①withCredentials旋恼,其中有一個 credentialsId 值就是我們剛剛創(chuàng)建的憑證 ID 值
②更新k8s系統(tǒng)中應(yīng)用的鏡像版本時吏口,-n 指定命名空間,我創(chuàng)建了一個新的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"
    }
}
五冰更、構(gòu)建項目
構(gòu)建成功.png

至此CI/CD流程完成~接下來記錄遇到的坑
1产徊、x509: certificate signed by unknown authority


圖片.png

在登陸harbor時提示x509報錯:
①檢查證書是否放置正確路徑(master和所有node都要配置)


圖片.png

②檢查是否配置了docker代理(因為代理一直導(dǎo)致x509,所有辦法都試過了都無效,最后在家里重新部了個環(huán)境蜀细,才發(fā)現(xiàn)是代理引起的舟铜,不知道為什么有的卻不出現(xiàn)這個提示,家里k8s版本是1.23.0)
清除/etc/systemd/system/docker.service.d/http-proxy.conf配置文件內(nèi)容(可能文件名稱會不同)
圖片.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末审葬,一起剝皮案震驚了整個濱河市深滚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涣觉,老刑警劉巖痴荐,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異官册,居然都是意外死亡生兆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門膝宁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸦难,“玉大人,你說我怎么就攤上這事员淫『媳危” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵介返,是天一觀的道長拴事。 經(jīng)常有香客問我沃斤,道長,這世上最難降的妖魔是什么刃宵? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任衡瓶,我火速辦了婚禮,結(jié)果婚禮上牲证,老公的妹妹穿的比我還像新娘哮针。我一直安慰自己,他們只是感情好坦袍,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布十厢。 她就那樣靜靜地躺著,像睡著了一般捂齐。 火紅的嫁衣襯著肌膚如雪寿烟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天辛燥,我揣著相機(jī)與錄音,去河邊找鬼缝其。 笑死挎塌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的内边。 我是一名探鬼主播榴都,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼漠其!你這毒婦竟也來了嘴高?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤和屎,失蹤者是張志新(化名)和其女友劉穎拴驮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柴信,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡套啤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了随常。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潜沦。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绪氛,靈堂內(nèi)的尸體忽然破棺而出唆鸡,到底是詐尸還是另有隱情,我是刑警寧澤枣察,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布争占,位于F島的核電站否灾,受9級特大地震影響哑梳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一苍狰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧午衰,春花似錦淘捡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至英古,卻和暖如春淀衣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背召调。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工膨桥, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唠叛。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓只嚣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親艺沼。 傳聞我的和親對象是個殘疾皇子册舞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容