目录
Jenkins连接k8s集群
-
默认Jenkins是有2个执行器的,我们也可以通过增加节点的方式去让他拥有更多的执行器,连接固定节点的方法比较简单,按照他的步骤一步步来就好了,这里我们配置连接k8s集群
-
在我们需要连接k8s集群之前,是需要安装kubernetes插件的,不然是没有那个按钮的
1. Kubernetes插件简介
Kubernetes 插件的目的是能够使用 Kubernetes 配合,实现动态配置 Jenkins 代理(使用 Kubernetes 调度机制来优化负载),在执行 Jenkins Job 构建时,Jenkins Master 会在 kubernetes 中创建一个 Slave Pod 代理来执行任务。
该 Slave Pod 中可以包含多种镜像,例如需要 Maven 编译可以使用 Maven 镜像执行任务。使用 NPM编译则可以使用 NPM镜像。操作 Kubernetes 可以使用 Kubectl 插件镜像。
所有 Job 中所需要的环境及其依赖都交由镜像提供,而不需要手动搭配这些环境。在 Slave Pod 执行完 Job 任务后,该Slave Pod将会自动删除。所以 Kubernetes Plugin 简单用法就是,在 Kubernetes 中启动 Jenkins Slave 代理,让代理执行 Jenkins Job,执行完后释放删除 Slave 释放资源。
2. Kubernetes插件使用
Kubernetes Plugin的配置主要有两部分组成:
- kubernetes的连接参数:主要用于配置如果连接kubernetes
- kubernetes的pod模板:调用kubernetes创建jenkins slave使用的pod模板
2.1 kubernetes的连接参数
进入 **系统管理->节点管理->Configure Clouds **中,点击 “Add a new cloud” 选项,选择kubernetes,即可进行kubernetes插件的配置。Kubernetes 插件的基本配置,可以配置 Jenkins 连接 Kubernetes API 地址、凭据、超时时间、容器数量限制等参数,详细配置项说明如下:
- 名称: 用于该“云”配置的标识,可以配置多个“云”来对应多个 Kubernetes 环境,如:kubernetes
- Kubernetes 地址: Kubernetes API 的地址,一般在 Kubernetes 集群内部 Kubernetes API 为
https://kubernetes.default.svc.cluster.local
,集群外部 Kubernetes API 地址为 https://{K8S IP}:6443,Jenkins 如果也部署在 Kubernetes 集群中的话,可以使用内部地址,否则只能使用外部地址。 - 禁用 HTTPS 证书检查: 设置连接 Kubernetes API 时不检查 Https 证书,一般默认不勾选即可。
- Kubernetes 命名空间: 指定在哪个 Kubernetes 命名空间下执行任务,一般默认为空即可。
- Jenkins 地址: 指定 Jenkins Master 的 URL 地址,用于 Slave 连接 Jenkins 用,如果 Jenkins 配置了前缀也要带上。如http://jenkins.example.com:8080,也可以使用kubernetes的内部地址
http://jenkins-svc.devops.svc.cluster.local:8080
- Jenkins 通道: jenkins会提供一个独立的端口用于Jenkins slave的连接,该端口默认为50000;如:
jenkins-svc.devops.svc.cluster.local:50000
这里的内部地址规则是svc名字.命名空间.svc.cluster.local,一定要注意不要写错了
- Connection Timeout: 连接 Kubernetes API 超时时间,默认值即可。
- Read Timeout: 连接 Kubernetes API 读取超时时间,默认值即可。
- 容器数量: 运行 Slave Pod 的最大数量。为空则不限制,设置为 0 则一个都不能创建,默认是 10 个,一般推荐默认值。
- Pod Labels: Slave Pod 的 Label 标签设置,默认标签即可。
- Pod Retention: Pod 保留策略,在 Slave Pod 执行完任务后,是否删除或者保留策略,默认会删除,一般使用默认值即可。
- 镜像: Pod 模板配置,可以配置 Slave Pod 中多个容器的参数值,非常灵活。
最终的配置图片就是这样的
3. 测试
我们新建一个流水线,然后让他执行一些任务,看他能不能正确启动并连接
将这一段流水线代码复制进去,这里的cloud指的是你刚刚添加的k8s节点的名称,然后保存,点击立即执行
pipeline {
agent {
kubernetes {
cloud 'kubernetes'
showRawYaml true
yaml """
apiVersion: v1
kind: Pod
metadata:
labels:
run: jenkins-agent
name: jenkins-agent
spec:
serviceAccountName: jenkins-admin
containers:
- name: jnlp
image: jenkins/inbound-agent
args: ['\$(JENKINS_SECRET)', '\$(JENKINS_NAME)']
- name: busybox
image: busybox
command:
- cat
tty: true
imagePullPolicy: IfNotPresent
dnsPolicy: ClusterFirst
restartPolicy: Never
"""
}
}
stages {
stage('Hello') {
steps {
echo 'Hello World'
}
}
}
}
如果不出问题的话就可以构建成功了
4. 错误原因
- 当然,有极大可能会失败,因为目前国内的docker不能直接拉取镜像,所以你可以将镜像地址换一下
- 如果不是因为镜像的原因,正常情况下20秒以内就会执行完,你的流水线一直卡在那个地方的话就可能是你的jenkins的地址写错了,检查一下jenkins的svc然后去修改一下