jenkins agents jnlp-slave 镜像制作

一、启动镜像

参考资料

警告! 此 inbound-agent 镜像曾作为 jenkinsci/jnlp-slave 和 jenkins/jnlp-slave发布. 然后这些都被淘汰,弃用。

1
2
3
4
# 拉取镜像
docker pull jenkins/inbound-agent
# 启动镜像
docker run -itd jenkins/inbound-agent -url http://jenkins-server:port <secret> <agent name>

docker run 命令参数

  • –name 为启动的容器指定名称,不指定会默认随机一个名称
  • -p 访问的端口:镜像内程序的端口
  • -d 表示当前容器在后台运行
  • -it 指定要启动的镜像名称和标签 :
  • -v 本地路径:镜像内的路径 可以将本地路径和容器内的路径映射,可以即时修改文件即时生效,方便测试 -v 命令可以有多条 eg: -v E:/logs/:/var/logs/nginx/ 把nginx的日志文件映射到本地
  • –rm 当前容器退出后将自动删除

jenkins/inbound-agent可选环境变量:

  • JENKINS_JAVA_BIN:要使用的 Java 可执行文件的路径,而不是 PATH 中的默认值或从 JAVA_HOME 获取的路径
  • JENKINS_JAVA_OPTS:用于远程处理的 Java 选项,否则从 JAVA_OPTS 获得
  • JENKINS_URL:Jenkins 服务器的 url,可以用作-url选项的替代品,或设置备用 jenkins URL
  • JENKINS_TUNNEL:( HOST:PORT) 连接到这个代理主机和端口而不是 Jenkins 服务器,假设这个确实将 TCP 流量路由到 Jenkins 主服务器。当 Jenkins 在负载均衡器、反向代理等后面运行时很有用。
  • JENKINS_SECRET:代理秘密,如果没有设置为参数
  • JENKINS_AGENT_NAME:代理名称,如果未设置为参数
  • JENKINS_AGENT_WORKDIR:代理工作目录,如果未通过可选参数设置-workDir
  • JENKINS_WEB_SOCKET:true如果应该通过 WebSocket 而不是 TCP 建立连接
  • JENKINS_DIRECT_CONNECTION: ( HOST:PORT) 直接连接到此 TCP 代理端口,跳过 HTTP(S) 连接参数下载。
  • JENKINS_INSTANCE_IDENTITY:Jenkins master 的 base64 编码的 InstanceIdentity 字节数组。设置后,代理将跳过连接到 HTTP(S) 端口以获取连接信息。
  • JENKINS_PROTOCOLS:指定在提供时尝试的远程协议JENKINS_INSTANCE_IDENTITY。

查看是否启动

1
2
3
4
# 查看经常是否启动
docker ps
# 删除exited 退出的所有程序,测试的时候启动了一些有问题的容器
docker rm $(docker ps -a -q)

我们主要的目的是看下初始化容器里的情况,然后根据自己业务的情况增加工具 curl、get、rsync等。

所以不需要去连Jenkins

1
docker run -it -u 0 jenkins-jnlp:v1.0 /bin/bash

二、打包镜像并上传

登入远程仓库

1
2
# 登入
docker login --username=xxx 远程仓库地址 回车输入密码

编辑dockerfile

1
2
3
4
5
6
7
8
$ vim Dockerfile
FROM jenkins/inbound-agent:latest
USER root
RUN ln -fs /bin/bash /bin/sh
RUN ["apt-get","update"]
RUN apt-get install curl -y
RUN apt-get install wget -y
RUN apt-get install rsync -y

打包镜像

1
2
3
4
# 本地镜像
docker build -t jenkins-jnlp:v1.0 .
# 打包远程镜像
docker build -t xxxxx.net/xxx/system:jenkins-jnlp-v1.0 .

推送镜像

1
docker push xxxxx.net/xxx/system:jenkins-jnlp-v1.0

三、远程拉取镜像

我们在Jenkins上配置了镜像地址,但这个地址必须是要公开的。否则我们拉去不到,那怎么样才可以设置私有仓库呢。


这边配置的秘钥,是jnlp pod 起来之后在里面pull上传镜像的秘钥。

如果是私有仓库会报错

1
2
3
4
5
Error: ImagePullBackOff
Normal Pulling 78s (x4 over 2m45s) kubelet Pulling image "xxxxxxxx/system:jenkins-jnlp-v1.1"
Warning Failed 77s (x4 over 2m45s) kubelet Failed to pull image "xxxxxxxx/system:jenkins-jnlp-v1.1": rpc error: code = Unknown desc = failed to pull and unpack image "xxxxxxx/system:jenkins-jnlp-v1.1": failed to resolve reference "xxxxxx/system:jenkins-jnlp-v1.1": pulling from host xxxxx failed with status code [manifests jenkins-jnlp-v1.1]: 401 Unauthorized
Warning Failed 77s (x4 over 2m45s) kubelet Error: ErrImagePull
Normal BackOff 66s (x7 over 2m45s) kubelet Back-off pulling image "xxxxxx/system:jenkins-jnlp-v1.1"

注意 k8s2.3 之前使用的是docker,之后使用的containerd。

参考资料

3.1 我们可以在k8s 节点上 配置 containerd 仓库账号密码

1
2
3
4
5
6
7
8
9
10
11
vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://bqr1dr1n.mirror.aliyuncs.com"]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."you images address ".tls]
insecure_skip_verify = true
[plugins."io.containerd.grpc.v1.cri".registry.configs."you images address".auth]
username = "xxxx"
password = "xxxxxxxsxxxxxx"

重启containerd

1
2
systemctl restart containerd
systemctl status containerd

已经拉群成功了

3.2