jenkins-kubernetes-plugin 介紹

Jenkins Plugin在一個(gè)k8 cluster中運(yùn)行動(dòng)態(tài)的agents.

基于Scaling Docker with Kubernetes们何,自動(dòng)調(diào)整Jenkins agents的規(guī)模萄焦。

這個(gè)plugin為每一個(gè)啟動(dòng)的agent創(chuàng)建k8 pod,在build結(jié)束后停掉它。

Agents用jnlp啟動(dòng)冤竹,所以預(yù)期這個(gè)agent可以自動(dòng)于jenkins master自動(dòng)連接拂封。

其中一些環(huán)境變量會(huì)自動(dòng)注入:

JENKINS_URL: Jenkins web interface url

JENKINS_SECRET: the secret key for authentication

JENKINS_AGENT_NAME: the name of the Jenkins agent

JENKINS_NAME: the name of the Jenkins agent

可以用jenkins/jnlp-slave 進(jìn)行測試, 查看源代碼可見Docker image source code.

Kubernetes Cloud Configuration

‘Jenkins-settings’ -> 'add cloud'-> select 'Kubernetes'-fill the information like Name, Kubernetes URL, Kubernetes server certificate key

如果 Kubernetes URL沒有設(shè)置,則這個(gè)connection項(xiàng)會(huì)從server account或者kube config文件中自動(dòng)配置鹦蠕。

Restricting what jobs can use your configured cloud

clouds可以配置冒签,使其僅允許一些job去用他們。

去enable這些钟病,在cloud的'advanced configuration'勾選'Restrict pipeline support' 去對(duì)‘folder box'進(jìn)行授權(quán)萧恕。如果后續(xù)有新的job想使該云,則可將其加入job folder.

Pipeline support

Nodes可以在pipeline中定義并被使用肠阱。然而票唆, 默認(rèn)執(zhí)行通常在jnlp container上執(zhí)行。你必須指定container去執(zhí)行你的任務(wù)

可從下兩圖進(jìn)行說明:

default_jnlp
specific_container

可以在examples dir中看到更多的答案屹徘。

默認(rèn)的jnlp agent? template如下:

containerTemplate(name:'jnlp',image:'jenkins/jnlp-slave:3.10-1-alpine',args:'${computer.jnlpmac} ${computer.name}'),

也可以用yaml syntax來顯示:

jnlp_template

如果你想覆蓋原來默認(rèn)的jnlp走趋,保持名字不變,更新其他參數(shù)即可噪伊。

Container Group Support

我們可以針對(duì)agent pod, 基于共享資源例如mounts, 定義多組container簿煌。每個(gè)container中的ports都可以被K8的pod用localhost連接。

以下段落沒有理解:

The container statement allows to execute commands directly into each container. This feature is considered ALPHAas there are still some problems with concurrent execution and pipeline resumption

不知道要結(jié)合下圖干什么說明什么鉴吹。

container_group

Pod and container template configuration

Pod templates是用來創(chuàng)建agents的pod template.它可以使用user interface去配置姨伟,也可以使用pipeline去配置。

但是無論那種方式豆励,我們編輯的都是以下這些fileds:

cloud: Jenkins setting中的cloud name夺荒。 defaults: kubernetes

name: the name of the pod

namespace: the namespace of the pod

label: the label of the pod. 必須是唯一值從而防止builds之前的沖突。

yaml: pod的yaml representation, 可以可以任何的values除了這些支持的fileds.

containers: container templates用于創(chuàng)建pod上的containers

serviceAccount: 這個(gè)pod的service account

nodeSelector: 這個(gè)pod的在哪個(gè)node上

nodeUsageMode: NORMAL或者EXCLUSIVE,其控制了Jenkins僅schedule jobs當(dāng)label匹配還是盡可能多的用這個(gè)node.

volumes: pod volumes對(duì)所有container有效

envVars: 應(yīng)用于所有container的環(huán)境變量

secretEnvVar: 其值從kubernetes secret中獲得

imagePullSecrets: pull secret names的列表

annotation: 部署這個(gè)pod的說明

inheritFrom: 一個(gè)或多個(gè)pod templates的列表可以去繼承的

slaveConnectTimeout: 等待一個(gè)agent上線的時(shí)間

podRetention: keep pods行為的控制器般堆≡谛ⅲ可以是never(), onFailure(), always(), default(). 如果是空的話诚啃,這個(gè)pod在‘a(chǎn)ctiveDeadlineSeconds’過后就會(huì)被刪掉淮摔。

activeDeadlineSeconds如果podRentions設(shè)為‘never()’或者‘onFailure()’,pod就會(huì)在deadline過后刪除始赎。

idleMinutes允許pod保留一段時(shí)間防止復(fù)用直到這個(gè)時(shí)間過去秒拔。因?yàn)橹挥性谶@個(gè)時(shí)間過去后诉探,最后一個(gè)步驟才會(huì)被執(zhí)行。

和pod template對(duì)應(yīng)的是container template。container template支持用戶接口或者pipeline去配置陡叠。允許你配置的fields有:

name: container的name

image: container是基于哪個(gè)image啟動(dòng)的。

envVars: 配置container的環(huán)境變量特碳,也會(huì)覆蓋在pod level配置的環(huán)境變量蹋岩。也可以在一行內(nèi)用envVar配置單個(gè)環(huán)境變量。

secretEnvVar: 一個(gè)環(huán)境變量杆逗。這個(gè)環(huán)境變量從K8 secret中讀取乡翅。

command: 這個(gè)container可以執(zhí)行的命令

args: 傳給command的參數(shù)。?

ttyEnabled: 使能tty

livenessProbe: liveness探針罪郊。用以在container內(nèi)部去執(zhí)行exec liveness probe. 不支持httpGet liveness probes.

ports: 暴露container的端口蠕蚜。

Using yaml to Define Pod Templates

除了上面我們提到的一些fields,我們可以傳入yaml的文件去支持任意的值悔橄。注意靶累,yaml外所有的配置都會(huì)先生效。

下面這是一個(gè)container template

def label="mypod-${UUID.randomUUID().toString()}"

podTemplate(label: label, yaml:"""

apiVersion: v1

kind: Pod

metadata:?

? labels:? ? some-label: some-label-value

spec:

? containers:

? - name: busybox??

??? image: busybox? ?

??? command:? ? - cat? ?

???? tty: true

? """) {? ?

???? node (label) {? ??

?????????? container('busybox')

??????????? {? ? ? ? sh"hostname"}?

? }

}

你還可以用readFile或者readTrusted步驟去從文件中l(wèi)oad一個(gè)yaml癣疟。在jenkins console的該plugin的配置panel也可以看到readFile/readTrusted

Liveness Probe Usage

containerTemplate(

name:'busybox',

image:'busybox',

ttyEnabled:true,

command:'cat',

livenessProbe:

containerLivenessProbe(execArgs:'some --command',initialDelaySeconds:30,timeoutSeconds:1,failureThreshold:3,periodSeconds:10,successThreshold:1))

我們可以從Defining a liveness command中獲取更多信息挣柬。

Pod template inheritance

一個(gè)podTemplate可以從一個(gè)已經(jīng)存在的template中繼承也可以不繼承。這意味著podTemplate會(huì)繼承node selector, service account, image pull secrets, containerTemplates和volume

加入到podTemplate的containerTemplae, 會(huì)在'parent' template中有一個(gè)匹配的containerTemplate睛挚, 會(huì)從parent containerTemplate中繼承配置邪蛔。如果沒有匹配的containerTemplate, 這個(gè)模版會(huì)被加到parent template中。

volume的繼承和container templates一樣竞川。Image Pull Secrets也會(huì)進(jìn)行合并(這些證書包括在parent和current)

在以下這個(gè)例子中店溢,我們會(huì)繼承我們創(chuàng)建的podTemplate。

如果你想更改集成的template, 可以如下圖所示:

pod_inherit

如上圖委乌,我們只更換maven container的image床牧,而保留其他參數(shù)不變。

需要注意:我們在上圖中沒有指定golang container,但是實(shí)際上它已經(jīng)集成過來了遭贸。

Multiple Pod template inheritance

Field 'inheritFrom'指定從一個(gè)podTemplate或者多個(gè)以space間隔的podTemplate中繼承戈咳。

后者覆蓋前者,沒有找到的則自動(dòng)忽略。

Nesting Pod templates

‘inheritFrom’可以讓我們很好的整合已經(jīng)預(yù)先定義的podTemplates著蛙。另外一種整合podTemplate的方法是我們在pipeline中用groovy直接定義和整合删铃,即如直接嵌入podTemplates.

示例如下:

container_template

這樣,我們就把兩個(gè)pod template整合成了一個(gè)pod template.

這個(gè)feature的用處還有踏堡, piepline library developers認(rèn)為它允許你根據(jù)功能打包podTemplates, 讓用戶根據(jù)他們的意圖嵌套這些功能猎唁。

示例如下:

src/com/foo/utils/PodTemplates.groovy:

groovy

有了這個(gè)庫之后,我們就可以如下圖所展示顷蟆,可以很方便的使用了诫隅。

templates

Using a different namespace

如果你需要你的pod在不同的namespace下運(yùn)行,則需要通過ui或者pipeline明確指出帐偎。

Specifying a different shell command other than /bin/sh

默認(rèn)的shell command是'/bin/sh', 如果你想用‘/bin/bash’逐纬,則需要明確指出。

By default, the shell command is /bin/sh. In some case, you would like to use another shell command like /bin/bash.

bash

Container Configuration

示例:

containers

Declarative Pipeline

Jenkins 2.66+ 才支持的feature

pipeline

或者將yamlFile作為一個(gè)單獨(dú)的pod yaml供使用而不是直接定義削樊。如下圖所示:

yaml

Constraints

我們可以在一個(gè)pod里面定義多個(gè)containers.其中jnlp是自動(dòng)創(chuàng)建豁生,運(yùn)行的是JNLP agent service, 和${computer.jnlpmac}漫贞, ${computer.name}甸箱,會(huì)作為Jenkins agent運(yùn)行。

其他的containers必須是一個(gè)長時(shí)間的進(jìn)程绕辖。

另外摇肌,如果你想提供自己的docker image作為jnlp slave, 你必須命令這個(gè)container為jnlp來覆蓋the default one。不然的化仪际,就會(huì)出現(xiàn)兩個(gè)slaves同時(shí)和master進(jìn)行交互的情況围小。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市树碱,隨后出現(xiàn)的幾起案子肯适,更是在濱河造成了極大的恐慌,老刑警劉巖成榜,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件框舔,死亡現(xiàn)場離奇詭異,居然都是意外死亡赎婚,警方通過查閱死者的電腦和手機(jī)刘绣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挣输,“玉大人纬凤,你說我怎么就攤上這事×媒溃” “怎么了停士?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵挖帘,是天一觀的道長。 經(jīng)常有香客問我恋技,道長拇舀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任蜻底,我火速辦了婚禮骄崩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘朱躺。我一直安慰自己刁赖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布长搀。 她就那樣靜靜地躺著,像睡著了一般鸡典。 火紅的嫁衣襯著肌膚如雪源请。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天彻况,我揣著相機(jī)與錄音谁尸,去河邊找鬼。 笑死纽甘,一個(gè)胖子當(dāng)著我的面吹牛良蛮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悍赢,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼决瞳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了左权?” 一聲冷哼從身側(cè)響起皮胡,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赏迟,沒想到半個(gè)月后屡贺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锌杀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年甩栈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糕再。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡量没,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出亿鲜,到底是詐尸還是另有隱情允蜈,我是刑警寧澤冤吨,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站饶套,受9級(jí)特大地震影響漩蟆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜妓蛮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一怠李、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛤克,春花似錦捺癞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至筋现,卻和暖如春唐础,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矾飞。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國打工一膨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人洒沦。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓豹绪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親申眼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瞒津,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

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