jenkins的Kubernetes插件必威国际有限公司
必威国际有限公司Jenkins插件在Kubernetes集群中运行动态代理。
基于使用Kubernetes扩展Docker文章,自动化在Kubernetes中运行的Jenkins代理的扩展。必威国际有限公司
该插件为每个代理创建Kubernetes Pod,并在每个构建后停止它。
代理作为入站代理启动,因此容器应该自动连接到Jenkins控制器。必威国际有限公司为此,会自动注入一些环境变量:
必威国际有限公司Jenkins_URL.
: 必威国际有限公司Jenkins web界面url必威国际有限公司Jenkins_Secret.
:身份验证的秘密密钥必威国际有限公司jenkins_agent_name.
:詹金斯特工的名字必威国际有限公司必威国际有限公司jenkins_name.
: Jenkins代理的名称(已弃用必威国际有限公司。此处仅为向后兼容)
测试了必威国际有限公司詹金斯/ inbound-agent
,请参阅Docker映像的源代码.
不需要在Kubernetes内运行Jenkins Contr必威国际有限公司oller。
通用设置
先决条件
- 正在运行的Kubernetes集群1.14或更高版本。对于OpenShift用户来说,这意味着OpenShift容器平台4.x。
- 安装必威国际有限公司了Jenkins实例
- Jenk必威国际有限公司ins Kubernetes插件安装
配置
填写Kubernetes插件配置。为了做到这一点,您将打开Jenkins UI并导航到必威国际有限公司管理Jenki必威国际有限公司ns - >管理节点和云 - >配置云 - >添加新云 - > Kubernetes并输入kubernetes url和必威国际有限公司詹金斯URL恰当,除非Jenkins在Kubernete必威国际有限公司s中运行,在这种情况下默认工作。
支持凭证包括:
- 用户名密码
- 秘密文件(kubecconfig文件)
- 秘密文本(基于令牌的身份验证)(OpenShift)
- 谷歌私钥服务帐号(GKE认证)
- x客户端证书
要测试此连接是否成功,可以使用测试连接按钮,以确保从Jenkins到Kubernetes集群之间有足够的通信,如下所示必威国际有限公司
除此之外,在Kubernetes Pod模板部分中,我们需要配置将用于启动代理pod的映像。我们不建议重写jnlp
集装箱,除非在特殊情况下。,您可以使用默认的Jenkins代理图像必威国际有限公司Docker Hub..在“Kubernetes Pod Template”部分,你需要指定以下内容(其余配置由你决定):Kubernetes Pod模板名称,可以是任何和将显示为一个前缀独特的生成代理的名字,这期间将自动运行构建码头工人形象——码头工人形象名称将作为参考自旋新詹金斯代理,如下见过必威国际有限公司
如果你检查WebSocket那么代理将通过HTTP(S)而不是Jenkins服务TCP端口进行连接。必威国际有限公司当Jenkins控制器在同一个Kubernetes集群中运必威国际有限公司行时,这是不必要的,但当代理位于外部集群且Jenkins控制器不能直接访问时(例如,它位于反向代理的后面),这可以极大地简化设置。看到中- 222更多信息。
注意:如果您的Jenk必威国际有限公司ins控制器在集群之外,并且使用自签名HTTPS证书,那么您将需要一些附加配置.
限制作业可以使用您配置的云
云可以配置为仅允许某些作业使用它们。
要启用此功能,请在云的高级配置中检查将管道支持限制为授权文件夹
盒子。对于作业然后使用此云配置,您需要在作业文件夹的配置中添加它。
使用
概述
Kubernetes插件将Jenkins特工分配到Kuberne必威国际有限公司tes舱中。在这些豆荚里,总有一个特殊的容器jnlp
操纵詹金斯特工的人必威国际有限公司其他容器可以运行您选择的任意进程,并且可以在代理pod中的任何容器中动态地运行命令。
使用一个标签
使用用户界面定义的Pod模板声明一个标签。当一个自由式工作或管道工作使用节点(“some-label”)
如果使用由pod模板声明的标签,Kubernetes Cloud将分配一个新的pod来运行Jenkins代理。必威国际有限公司
应该指出的是,使用全局POD模板定义的主要原因是迁移现有项目(包括Freestyle)的巨大语料库,以在Kubernetes上运行,而不会更改作业定义。设置新的Kubernetes构建的新用户应该使用podTemplate
步骤,如示例片段所示在这里.
使用管道步骤
这podTemplate
步骤定义了短暂的POD模板。它是在管道执行的同时创建podTemplate
块。事后立即删除。这样的pod模板不打算与Jenkins实例中的其他构建或项目共享。必威国际有限公司
下面的习惯用法使用生成的唯一标签创建pod模板(可用为POD_LABEL
)在它内部运行命令。
Podtemplate {node(POD_LABEL){//管道的步骤……}}
属性中的命令将默认执行jnlp
詹金斯特工跑的地方。必威国际有限公司(jnlp
名称是历史的,为了兼容而保留。)
这将在jnlp
容器:
Podtemplate {node(POD_LABEL) { 阶段('运行shell') {sh'回声hello world'}}}
找到更多的例子例子dir..
使用的默认JNLP代理图像可以通过将其添加到模板来定制
容器(姓名:'jnlp'那图像:'必威国际有限公司Jenkins / Inbound-Agent:4.7-1'那args.:'$ {computer.jnlpmac} $ {computer.name}'),
或者使用yaml语法
apiersion:v1种类:圆荚体规范:容器: -姓名:jnlp图像:'必威国际有限公司Jenkins / Inbound-Agent:4.7-1'args.:['\ $必威国际有限公司(jenkins_secret)','\ $(jenkins_name)']
多个容器支持
可以为代理程序POD定义多个容器,其中共享资源,如安装。每种容器中的端口可以通过使用(使用)访问任何Kubernetes Pod。本地主机
.
这容器
步骤允许将命令执行到每个容器中。
请注意由于实现的限制,在不同容器中执行命令时,如果它们使用不同的uid运行,可能会出现问题。建议在同一pod的不同容器部分使用相同的uid,以避免任何问题。
Podtemplate(容器: [containerTemplate (姓名:'maven'那图像:'maven: 3.8.1-jdk-8'那命令:'睡觉'那args.:'99 d'), containerTemplate (姓名:'golang'那图像:'戈兰:1.16.5.'那命令:'睡觉'那args.:'99 d')){节点(POD_LABEL) { 阶段('获得maven项目'git) {'https://github.com/必威国际有限公司jenkinsci/kubernetes-plugin.git'容器('maven') { 阶段('建立一个maven项目') {sh'mvn -B -ntp清洁安装'}}}阶段('找一个Golang项目'git) {url:'https://github.com/hashicorp/terraform.git.'那分支:'主要'容器('golang') { 阶段('创建一个Go项目') {sh“‘mkdir -p / go/src/github.com/hashicorp.-s ' pwd ' /go/src/github.com/hashicorp/terraformCD /go/src/github.com/hashicorp/terraform && make“‘}}}}}}
或
Podtemplate(yaml.:“‘apiVersion: v1:豆荚规格:容器:maven -名称:图片:maven: 3.8.1-jdk-8命令:——睡眠参数:- 99d.——名称:golang图片:golang: 1.16.5命令:——睡眠参数:- 99d.“‘){node(POD_LABEL) { 阶段('获得maven项目'git) {'https://github.com/必威国际有限公司jenkinsci/kubernetes-plugin.git'容器('maven') { 阶段('建立一个maven项目') {sh'mvn -B -ntp清洁安装'}}}阶段('找一个Golang项目'git) {url:'https://github.com/hashicorp/terraform-provider-google.git.'那分支:'主要'容器('golang') { 阶段('创建一个Go项目') {sh“‘mkdir -p / go/src/github.com/hashicorp.-s ' pwd ' /go/src/github.com/hashicorp/terraformCD /go/src/github.com/hashicorp/terraform && make“‘}}}}}}
POD_Container.
变量
的变量POD_Container.
在当前上下文中包含容器的名称。它仅在a中定义容器
块。
Podtemplate(容器:[...]){node(POD_LABEL) { 阶段('运行shell'){容器('mycontainer') {sh“echo你好$ Pod_container.“//显示'hello from mycontainer'} } } }
配置引用
豆荚模板
Pod模板用于创建代理。它们可以通过用户界面配置,也可以在管道中使用podTemplate
的一步。无论哪种方式,它都提供了对以下字段的访问:
- 云在Jenkins设置中定义的云的名称。必威国际有限公司默认为
kubernetes
- 姓名荚果的名字。这只用于继承。
- 名称空间pod的名称空间。
- 标签节点标签。控件请求代理时,可以这样引用pod模板
节点
的一步。在管道中,建议省略此字段并依赖于可以使用该字段的生成标签POD_LABEL
变量定义在podTemplate
块。 - yaml.yaml表示的Pod,以允许设置任何不支持的值作为字段
- yamlMergeStrategy
合并()
或覆盖()
.控制yaml定义是否覆盖或与窗口模板继承的yaml定义合并inheritFrom
.默认为覆盖()
(出于向后兼容的原因)。 - 容器容器模板部分的荚(有关详细信息,请参阅以下).
- serviceAccount豆荚的服务帐户。
- nodeselector.POD的节点选择器。
- nodeUsageMode要么
正常的
或独家
,这就控制了Jenkins是只安排匹配标签表达式必威国际有限公司的作业还是尽可能多地使用节点。 - 卷为POD定义并安装的卷所有容器。
- envVars所应用的环境变量所有容器。
- envvar.内联定义其值的环境变量。
- secretEnvVar一个环境变量,其值来自Kubernetes秘密。
- imagePullsecrets.拉秘密名单,到从一个私有Docker注册表拉图像.
- 注释应用到pod的注释。
- inheritFrom一个或多个POD模板的列表(下面有更多细节).
- slaveConnectTimeout座席在线的超时时间,单位为秒(下面有更多细节).
- podRetention控制保持药剂舱的行为。可以是'never()', 'onFailure()', 'always()'或'default()' -如果为空将默认删除pod之后
activeDeadlineSeconds
已经过去了。 - activeDeadlineSeconds如果
podRetention
被设置为不()
或onFailure ()
,在通过此截止日期后删除POD。 - idleMinutes允许pod保持活动以便重用,直到在其上执行最后一步后配置的分钟数过去为止。只有在用户界面中定义pod模板时才使用此方法。
- showrawyaml.启用或禁用原始POD清单的输出。默认为
真正的
- runAsUser运行pod中所有容器的用户ID。
- runAsGroup组ID以在POD中运行所有容器。
- hostNetwork使用主机网络。
- workspaceVolume工作区使用的卷类型。
emptyDirWorkspaceVolume
(默认):在主机上分配的空的dirdynamicPVC ()
:动态管理的持续卷索赔。它与POD同时删除。hostpathspspacevolume()
:主机路径卷nfsWorkspaceVolume ()
:NFS卷persistentvolumeclaiwworkspacevolume()
:姓名的现有持久股票索赔。
集装箱模板
容器模板是pod的一部分。它们可以通过用户界面或管道配置,并允许您设置以下字段:
- 姓名容器的名称。
- 图像容器的图像。
- envVars应用于容器的环境变量(补充和覆盖在POD级别的env变量).
- envvar.内联定义其值的环境变量。
- secretEnvVar一个环境变量,其值来自Kubernetes秘密。
- 命令容器将执行的命令。将覆盖Docker入口点。典型的价值是
睡觉
. - args.将参数传递给命令。典型的价值是
99999999.
. - ttyEnabled标记tty应该被启用。
- LiventiveProbe.要添加到容器中的exec活性探测的参数(不支持httpGet活性探测)
- 港口暴露容器上的端口。
- alwaysPullImage容器将在开始时拉动图像。
- runAsUser运行容器的用户ID。
- runAsGroup作为容器运行的组ID。
指定不同的默认代理连接超时
默认情况下,代理连接超时设置为1000秒。它可以使用系统属性自定义。请参阅以下部分。
使用yaml定义Pod模板
为了在Kubernetes中支持任何可能的价值圆荚体
对象,我们可以传递一个yaml代码片段,它将用作模板的基础。如果在YAML之外设置了任何其他属性,它们将优先。
Podtemplate(yaml.:“‘apiVersion: v1:豆荚元数据:标签:some-label: some-label-value规格:容器:busybox -名称:图片:BusyBox.命令:——睡眠参数:- 99d.“‘){node(POD_LABEL){容器('忙盒子'){回声POD_Container.//显示'BusyBox'上海'主机名'}}}
您可以使用readFile
或readTrusted
从文件加载yaml的步骤。还要注意,在声明式管道中yamlFile
可以使用(看到了吗例子).
例子
POD.YAML.
apiersion:v1种类:圆荚体规范:容器: -姓名:maven图像:maven: 3.8.1-jdk-8命令: -睡觉args.: -99 d-姓名:golang图像:戈兰:1.16.5.命令: -睡觉args.: -99 d
必威国际有限公司Jenkinsfile
Podtemplate(yaml.:Readtrusted('POD.YAML.')){节点(POD_LABEL){//...}}
活性探针使用
容器(姓名:'忙盒子'那图像:'忙盒子'那命令:'睡觉'那args.:'99 d'那LiventiveProbe.: containerLivenessProbe (execArgs:'一些命令'那initialDelaySeconds:30.那timeoutSeconds:1那failureThreshold:3.那periodSeconds:10那成功:1) )
看到定义一个liensive命令为更多的细节。
遗产
概述
pod模板可以继承现有模板,也可以不继承。这意味着pod模板将从它所继承的模板继承节点选择器、服务帐户、图像拉取秘密、容器模板和卷。
yaml.是根据的值合并的吗yamlMergeStrategy
.
服务帐户和节点选择器当被重写时,完全替换'parent'上找到的任何可能的值。
容器模板在“父”模板中有一个匹配的containerTemplate(同名的容器模板)的podTemplate将继承父容器模板的配置。如果没有找到匹配的容器模板,则按原样添加模板。
体积继承完全适用于容器模板.
图像拉秘密组合(所有在“父”和“当前”模板上定义的所有秘密)都被使用)。
在下面的示例中,我们将继承前面创建的pod模板,并将覆盖的版本maven
所以它使用jdk-11代替:
Podtemplate(inheritFrom:'mypod.'那容器: [containerTemplate (姓名:'maven'那图像:'maven: 3.8.1-jdk-11')){节点(POD_LABEL){...}}
或在宣言的管道中
管道{代理{Kubernetes {继承了'mypod.'yaml.“‘规格:容器:maven -名称:图片:Maven:3.8.1-JDK-11“‘...}}阶段{...}}
注意,我们只需要指定不同的东西。所以,命令
和参数
没有指定,因为它们是继承的。此外,golang
将添加容器,如“父”模板中定义。
多Pod模板继承
场inheritFrom
可以引用一个单独的podTemplate,也可以引用多个由空格分隔的podTemplate。在后一种情况下,每个模板将按照它们在列表中出现的顺序进行处理(后面的项覆盖前面的项).在任何情况下,如果找不到引用的模板,它将被忽略。
嵌套舱模板
场inheritFrom
提供一种简单的方法来组合预先配置好的podTemplates。在许多情况下,使用groovy在管道中直接定义和组合podTemplates是很有用的。这是通过嵌套实现的。您可以将多个pod模板嵌套在一起,以组成一个单独的pod模板。
下面的示例撰写了两个不同的POD模板,以创建一个带有Maven和Docker功能的POD模板。
Podtemplate(容器: [containerTemplate (图像:'码头工人'那姓名:'码头工人'那命令:'猫'那ttyEnabled:真正的))) {podTemplate (容器: [containerTemplate (图像:'maven'那姓名:'maven'那命令:'猫'那ttyEnabled:真正的)]){node(POD_LABEL){//使用Docker和Maven获取一个吊钩……
这个特性对于管道库开发人员来说非常有用,因为它允许您将pod模板封装到函数中,并允许用户根据自己的需要嵌套这些函数。
例如,可以为它们的podTemplates创建函数并导入它们以供使用。这是我们的档案src / com/foo/utils/PodTemplates.groovy
:
包裹com.foo.utils公共无效dockerTemplate(身体) {podTemplate (容器: [containerTemplate (姓名:'码头工人'那图像:'码头工人'那命令:'睡觉'那args.:'99 d')),卷: [hostPathVolume (hostPath:'/var/run/docker.sock.'那mountPath:'/var/run/docker.sock.'))){身体.调用()}}公共无效mavenTemplate(身体) {podTemplate (容器: [containerTemplate (姓名:'maven'那图像:'maven'那命令:'睡觉'那args.:'99 d')),卷:[secretvolume(secretName:'maven设置'那mountPath:'/root/.m2'), persistentVolumeClaim (claimName:'maven-local-repo'那mountPath:'//othot/.m2repo.'))){身体.调用()}}返回这
然后,库的使用者可以通过组合这两种功能来表示对具有docker功能的maven pod的需求,但是,您需要再次表示希望在其中执行命令的特定容器。你可以不省略了节点
声明。
注意POD_LABEL
将是最内部生成的标签,以获取具有节点上可用的所有外部窗格的节点,如本示例所示:
进口com.foo.utils.PodTemplatespodtemplates.=新PodTemplates() podTemplates.dockerTemplate {podTemplates.maventemplate {node(POD_LABEL){容器('码头工人') {sh“echo你好$ Pod_container.“//显示'hello from docker'}容器('maven') {sh“echo你好$ Pod_container.“//从maven显示'你好'} } } }
在脚本管道中,存在通过嵌套声明的这种隐式继承的情况下不想要,或者是首选另一个显式继承。在这种情况下,使用继承from''
去除任何继承,或继承了“其他圆周”
覆盖它。
声明式管道
声明剂可以从yaml定义
管道{代理{kubernetes {yaml“‘apiVersion: v1:豆荚元数据:标签:some-label: some-label-value规格:容器:maven -名称:图片:maven:高山命令:——猫tty:真busybox -名称:图片:BusyBox.命令:——猫tty:真“‘}}阶段{阶段('运行maven'){步骤{容器('maven') {sh'mvn - version'}容器('忙盒子') {sh'/bin/busybox'}}}}}}
或使用yamlFile
把豆荚模板分开kubernetespod.yaml.
文件
管道{代理{kubernetes {yamlFile'kubernetespod.yaml.'阶段{...}}
注意,它以前是可以定义的containerTemplate
但是yaml格式已经取代了这种格式。
管道{代理{kubernetes {//云“kubernetes”容错{name.'maven'图像'maven: 3.8.1-jdk-8'命令'睡觉'args.'99 d'}}{…}}
默认情况下在容器中运行步骤。步骤将嵌套在一个隐式容器(名称){...}
块而不是在JNLP容器中执行。
管道{代理{kubernetes {defaultContainer'maven'yamlFile'kubernetespod.yaml.'}}阶段{阶段('运行maven'){步骤{sh'mvn - version'} } } }
在自定义工作区中运行Pipeline或单独的阶段——除非明确说明,否则不需要。
管道{代理{kubernetes {customWorkspace'一些/其它/路径'defaultContainer'maven'yamlFile'kubernetespod.yaml.'}}阶段{阶段('运行maven'){步骤{sh'mvn - version'上海“echo Workspace dir为$ {PWD()}“} } } }
默认继承
与脚本化的k8模板不同,声明式模板不继承父模板。由于在阶段级声明的代理可以覆盖全局代理,隐式继承导致了混淆。
如果需要使用该字段,您需要明确声明继承inheritFrom
.
在以下示例中,nested-pod
只会包含maven
容器。
管道{代理{kubernetes {yaml“‘规格:容器:——名称:golang图片:golang: 1.16.5命令:——睡眠参数:- 99d.“‘}}阶段{阶段('运行maven'){代理{kubernetes {yaml“‘规格:容器:maven -名称:图片:maven: 3.8.1-jdk-8命令:——睡眠参数:- 99d.“‘} } 脚步 { … } } } }
混杂。
从管道访问容器日志
如果你使用containerTemplate
要在后台运行某些服务(例如用于集成测试的数据库),您可能需要从管道访问其日志。这可以用containerLog
步骤,该步骤将请求容器的日志打印到构建日志中。
所需参数
- 姓名如定义的,要从中获取日志的容器的名称
podTemplate
.简单用法中可以省略参数名:
containerLog'mongodb'
可选参数
- returnLog返回日志而不是打印到构建日志(默认:
假
) - 尾音线只返回日志的最后n行(可选)
- 真主只返回日志的最后n秒(可选)
- limitBytes将输出限制为n个字节(从日志的开头,而不是精确)。
还看到在线帮助和例子/ containerLog.groovy.
使用系统属性控制的特性
请阅读由系统属性控制的特性页面知道如何在Jenkins中设置系统属性。必威国际有限公司
KUBERNETES_必威国际有限公司JENKINS_URL
:代必威国际有限公司理商使用Jenkins URL。这意味着用于OEM集成。io.必威国际有限公司jenkins.plugins.kubernetes.disableNodelayProvision.
(从1.19.1开始)是否禁用插件使用的无延迟配置策略(默认为假
).必威国际有限公司jenkins.host.address.
:(用于单元测试)主机代理应使用的控件与Jenkins联系必威国际有限公司org.csanchez.必威国际有限公司jenkins.plugins.kubernetes.PodTemplate.connectionTimeout
:在考虑pod调度失败之前等待的秒数(默认为)1000
)org.csanchez.必威国际有限公司jenkins.plugins.kubernetes.pipeline.containerexecdecorator.stdinbuffersize.
:用于发送到Kubernetes exec api的命令的stdin缓冲区大小(以字节为单位)。低值会导致执行的命令变慢。更高的值将消耗更多的内存(默认为)16 * 1024
)org.csanchez.必威国际有限公司jenkins.plugins.kubernetes.pipeline.ContainerExecDecorator.websocketConnectionTimeout
:是时候等待使用的WebSocket容器
步骤连接(默认为。30.
)
运行在OpenShift
随机UID问题
OpenShift使用随机覆盖Docker映像中指定的内容的UID。由于这个原因,在构建中可能会出现以下警告
在jnlp容器中HOME被设置为/在使用工具或ssh客户端时,可能会遇到问题。这通常发生在uid在/etc/passwd中没有任何条目的情况下请将用户添加到Dockerfile中,或将HOME环境变量设置为pod模板定义中的有效目录。
目前jenkins sci代理图像不必威国际有限公司是为OpenShift构建的,它将发出这个警告。
这个问题可以以各种方式规避:
- 为OpenShift构建一个docker映像,以便在使用任意uid运行时表现良好。
- 在pod规范中覆盖HOME环境变量
/home/必威国际有限公司jenkins
并安装一卷/home/必威国际有限公司jenkins
要确保运行容器的用户可以写入它
看到这一点例子配置。
使用OpenShift 3
OpenShift 3基于旧版本的Kubernetes,它不会再支持Kubernetes插件版本1.26.0。
要让特工为Openshift 3工作,请添加这个节点选择器
到您的POD模板:
beta.kubernetes.io/os=linux.
Windows支持
如果集群有Windows节点,可以在Windows上运行pod。看到例子.
约束
可以在POD中定义多个容器。其中一个是自动创建的名称jnlp
,并使用args运行Jenki必威国际有限公司ns JNLP代理服务$ {computer.jnlpmac} $ {computer.name}
,将是集装箱作为詹金斯特工。必威国际有限公司
其他容器必须运行长期运行过程,因此容器不会退出。如果默认的入口点或命令只运行某些东西并退出,那么它应该覆盖类似的东西猫
和ttyEnabled:真
.
警告如果您想为入站代理提供自己的Docker映像,您可以必须名的容器jnlp
它覆盖了默认值。如果不这样做,将导致两个代理试图并发连接到控制器。
在minikube上配置
创建并启动minikube
客户端证书需要转换为PKCS,需要密码
Openssl pkcs12 -export -out ~/.minikube/minikube. exe可以-inkey ~ / .minikube / apiserver。关键——~ / .minikube / apiserver。crt -certfile ~ / .minikube / ca。crt -passout传递:秘密
验证证书是否有效
curl——cacert ~ / .minikube / ca。crt - cert ~ / .minikube / minikube。pfx:secret——cert-type P12 https://$(minikube ip):8443
添加一个Je必威国际有限公司nkins证书类型的证书,从上传~ / .minikube / minikube.pfx
、密码秘密
填满Kubernetes服务器证书键与内容~ / .minikube / ca.crt
谷歌容器引擎配置
创建一个集群
Gcloud容器集群创建Jenkins——num-nodes 1—必威国际有限公司—machine-type g1-small
并注意管理员密码和服务器证书。
或者使用谷歌Developer Console创建一个Container Engine集群,然后运行
GCLoud集装箱群GOT-Credentials Jenkins Kubectl 必威国际有限公司Config View --raw
最后一个命令将输出kubernetes集群配置,包括API服务器URL、管理员密码和根证书
故障排除
先看看詹金斯探员舱是否启动了。必威国际有限公司确保您在正确的集群和名称空间中。
库贝克特尔,拿个豆荚,看着
如果他们处于不同的状态运行
,使用描述
获取活动
kubectl描述豆荚/ my-jenkins-a必威国际有限公司gent
如果他们是运行
,使用日志
获取日志输出
kubectl logs -f pods / m必威国际有限公司y-jenkins-Agent JNLP
如果未启动POD或任何其他错误,请检查控制器侧的日志。
有关详细信息,请配置一个新的必威国际有限公司詹金斯日志记录器为org.csanchez.必威国际有限公司jenkins.plugins.kubernetes
在所有
等级。
要检查来回发送到Kubernetes API服务器的json消息,您可以配置一个新的必威国际有限公司詹金斯日志记录器为Okhttp3.
在调试
等级。
删除不良状态的豆荚
kubectl get pods -o name——selector=j必威国际有限公司enkins=slave——all-namespaces | xargs -I {} kubectl delete {}
上海
当使用多个容器时,步骤挂起
管道调试此问题,您需要设置-Dorg.必威国际有限公司jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS = true
系统属性,然后重启管道。在控制台日志中,你很可能会看到以下内容:
sh: can't create /home/必威国际有限公司jenkins/agent/workspace/thejob@tmp/durable-e0b7cd27/jenkins-log.txt: Permission denied . sh: could not create /home/jenkins/agent/workspace/thejob@tmp/durable-e0b7cd27/jenkins-log.txt: Permission deniedsh: can't create /home/必威国际有限公司jenkins/agent/workspace/thejob@tmp/durable-e0b7cd27/jenkins-result.txt.tmp: Permission denied . sh: can't create /home/jenkins/agent/workspace/thejob@tmp/durable-e0b7cd27/jenkins-result.txt.tmp: Permission denied . shmv: can't rename '/home/必威国际有限公司jenkins/agent/workspace/thejob@tmp/durable-e0b7cd27/jenkins-result.txt.tmp':没有这样的文件或目录点击:/home/jenk必威国际有限公司ins/agent/workspace/thejob@tmp/ dursible -e0b7cd27/jenkins-log.txt: Permission denied点击:/home/jenk必威国际有限公司ins/agent/workspace/thejob@tmp/ dursible -e0b7cd27/jenkins-log.txt: Permission denied点击:/home/jenk必威国际有限公司ins/agent/workspace/thejob@tmp/ dursible -e0b7cd27/jenkins-log.txt: Permission denied
通常当用户的UID在jnlp
容器与另一个容器中的容器不同。您使用的所有容器都应该具有相同的用户UID,这也可以通过设置来实现SecurityContext.
:
apiersion:v1种类:圆荚体规范:SecurityContext.:runAsUser:1000#代理图像中Jenkins用户的必威国际有限公司默认UID容器: -姓名:maven图像:maven: 3.8.1-jdk-8命令: -猫tty:真正的
使用带有自签名HTTPS证书的Jenkins控制必威国际有限公司器的WebSockets
使用WebSockets是在代理和运行在集群外的Jenkins控制器之间建立连接的最简单和推荐的方法。必威国际有限公司但是,如果您的Jenkins控制器必威国际有限公司使用自签名证书配置了HTTPS,那么您需要确保代理容器信任CA必威国际有限公司詹金斯/ inbound-agent
如下图所示,并添加证书:
从必威国际有限公司詹金斯/ inbound-agent用户根添加cert.pem / tmp / cert.pem运行keytool -noprompt -storepass crameit \ -keystore" $ JAVA_HOME / jre / lib / security / cacerts”\ -import -file /tmp/cert. txt/tmp/cert.p必威国际有限公司em -alias jenkinsMaster && \ rm -f /tmp/cert.pem用户必威国际有限公司
然后,用它作为jnlp
容器的pod模板。不需要指定命令或参数。
注意:使用WebSocket模式时,
-disableHttpsCertValidation
在这一点必威国际有限公司詹金斯/ inbound-agent
变得不可用,以及cert
,这就是为什么必须扩展docker映像的原因。
构建和测试
集成测试将使用从kube配置文件或服务帐户自动检测到的当前配置上下文。
手动测试
运行mvn全新安装
和复制目标/ kubernetes.hpi
到Je必威国际有限公司nkins Plugins文件夹。
运行Kubernetes集成测试
请注意您运行的系统mvn
需要从群集中访问。如果您看到代理发生连接到错误的主机,请查看您可以使用必威国际有限公司jenkins.host.address.
正如刚才提到的。
Minikube集成测试
对于集成测试,请安装并启动minikube.测试将检测它,并在新名称空间中运行一组集成测试。
一些集成测试运行一个本地jenkins,因此运行它们的主机需要能够从k必威国际有限公司ubernetes集群访问。詹金斯默认会听必威国际有限公司192.168.64.1.
仅接口,出于安全原因。如果你的minikube不在那个网络中运行,通过connectorHost
maven, ie。
mvn全新安装-DconnectorHost = $ (minikube ip | sed - e ' s / \([0 - 9] *[0 - 9] * \ \。[0 - 9]* \)。* 1.1 / \ /)
如果你不介意其他人在你的网络能够使用你的测试jenkins,你可以使用这个:必威国际有限公司
mvn clean install -dconnectorhost = 0.0.0.0
然后你的测试jenkins将监必威国际有限公司听所有的ip地址,这样构建荚将能够从你的minikube VM中的荚连接到你的主机。
如果您的minikube正在VM中运行(例如VirtualBox)和主机运行mvn
没有公共主机名为VM访问,您可以设置必威国际有限公司jenkins.host.address.
系统属性到主机的(仅限托管或NAT)IP:
mvn clean install -d必威国际有限公司jenkins.host.address = 192.168.99.1
使用Microk8s集成测试
如果Microk8s正在运行,并且是你的默认上下文~ / .kube /配置
,就以
mvn清除安装-Pmicrok8s
这假设从一个pod,主机系统可以作为IP地址访问10.1.1.1
.它可能是某种变体,比如10.1.37.1.
,在这种情况下,需要设置-DconnectorHost =…-D必威国际有限公司jenkins.host.address =…
代替。要查看实际地址,请尝试:
ifdata pa cni0
或者验证pod内的网络:
kubectl执行命令——rm——image=praqma/network-multitool——restart=Never——attach sh ip route|fgrep'默认情况下通过'
在不同的集群中集成测试
试一试
bash test-in-k8s.sh.
码头工人形象
为Jenkins安装了插件的Doc必威国际有限公司ker映像。基于官方图片.
运行Docker图像
Docker运行——rm——name Jenk必威国际有限公司ins -p 8080:8080 -p 5000:50000 -v /var/jenkins_home csanchez/ Jenkins -kubernetes
在Kubernetes中运行
示例配置将创建具有持久卷的状态设置Jenkins,并使用服务帐户进行身份验证到Kubernetes API。必威国际有限公司
使用minikube在本地运行
使用下面的命令可以创建带有一个节点的本地测试集群minikube
minikube开始
您可能需要设置主机已安装卷的正确权限
Minikube SSH sudo Chown 1000:1000 / TMP / Hostpath Provisioner / PVC-*
然后创建Jenkins名称空间、必威国际有限公司控制器和服务
Kubectl创建命名空间kubernetes-plugin$ (kubectl配置当前上下文)- jamespace = kubernetes-plugin kubectl create -f src / main / kubernetes / service-account.yml kubectl create -f src / main 必威国际有限公司/ kubernetes / jenkins.yml
获取连接到的url
Minikube服务Jenkins必威国际有限公司——命名空间kubernetes-plugin——url
运行在谷歌集装箱发动机GKE
假设您创建了名为的Kubernetes群集必威国际有限公司
这是如何在那里运行Jenkins和代理商。必威国际有限公司
创建所有元素并设置默认名称空间
Kubectl创建命名空间kubernetes-plugin$ (kubectl配置当前上下文)- jamespace = kubernetes-plugin kubectl create -f src / main / kubernetes / service-account.yml kubectl create -f src / main 必威国际有限公司/ kubernetes / jenkins.yml
连接到Kubernetes创建的网络负载均衡器的ip,端口80。获取ip(在本例中104.197.19.100
),kubectl描述服务/ jenkins必威国际有限公司
(可能需要一些填充)
$ kubectl描述服务/ jenkins名称:jen必威国际有限公司kins命名空间:默认标签:选择器:name = jenkins类型:loadbalancer ip:10.175.244.232 loadbalancer入口:104.197.19.100端口:http 80 / tcp nodeport:http 30080 / tcp端点:10.172.1.5:8080端口:代理50000 / TCP NodePort:代理32081 / TCP端点:10.172.1.5:50000会话关联:无任何事件。
在Kubernetes 1.4移除源ips的SNATing之前,似乎需要配置CSRF(在Jenkins 2中默认启用)来避免必威国际有限公司警告:请求中没有包含有效的crumb
错误。这可以做检查启用代理的兼容性在Manage Jenki必威国际有限公司ns ->配置全局安全
配置Jenkins,必威国际有限公司添加Kubernetes
将Kubernetes URL设置为容器引擎集群端点https://kubernetes.default.svc.cluster.local
.在凭证,点击添加
并选择Kubernetes服务帐户
,或者使用Kubernetes API的用户名和密码。如果kubernetes集群配置为使用客户端证书进行身份验证,则选择'Certificate'作为凭据类型。
使用Kubernetes服务帐户
将导致插件使用安装在Jenkins pod中的默认令牌。必威国际有限公司看到配置pod的服务帐号为更多的信息。
你可能想要设置必威国际有限公司詹金斯URL
修改为内部服务IP,http://10.175.244.232
在这种情况下,通过内部网络连接。
集容器盖
到一个合理的数目进行测试,即3。
添加图像
- 码头工人形象:
必威国际有限公司詹金斯/ inbound-agent
- 必威国际有限公司Jenkins代理根目录:
/home/必威国际有限公司jenkins/agent
现在可以使用了。
扯下来
/ kubernetes-plugin kubectl删除名称空间
自定义部署
修改cpu和内存请求/限制(Kubernetes资源API)
修改文件./src/main/kubernetes/必威国际有限公司jenkins.yml.
与期望的限制
资源:限制:cpu:1记忆:1GI.请求:cpu:0.5记忆:500米
注意:JVM将使用内存请求
作为堆限制(-xmx)
建筑
Docker build -t csanchez/必威国际有限公司jenkins-kubernetes.
相关项目
- Kubernetes管道插件:管道扩展,为使用Kubernetes荚、秘密和卷执行构建提供本机支持
- kubernetes-credentials:读取Kubernetes秘密的凭证提供者