Jenkins Pipeline Slave中Docker Server版本老旧问题及升级方法问询
一、老旧Docker Server版本的来源
你看到的老旧Docker Server版本,其实来自Kubernetes集群宿主机节点的Docker守护进程。
具体来说:你的Jenkins本身是以Kubernetes容器形式运行的,自身并没有安装Docker;而Pipeline里的Slave容器通过挂载/var/run/docker.sock(就是你Jenkinsfile里的hostPathVolume配置项),直接复用了Kubernetes宿主机上的Docker后台进程。因为你的K8s集群是用kops在AWS上创建的,kops默认配置的Docker版本本身就比较老旧,所以执行docker version时,Server端显示的就是宿主机上这个旧版本的Docker。
而Slave镜像里的Docker客户端版本较新,只是容器内的客户端程序,它通过socket连接到宿主机的旧版Server,所以会出现客户端版本高于Server的情况(你也能看到输出里的API版本降级提示)。
二、更新Docker版本的具体步骤
要让Jenkins用上更新的Docker版本,本质是要更新Kubernetes集群所有宿主机节点的Docker版本,用kops可以按以下步骤操作:
编辑集群配置
执行以下命令打开集群配置文件(默认使用vi编辑器):kops edit cluster在
spec节点下添加Docker的配置块,注意logDriver是必填项(缺失会报错),然后指定你要升级的Docker版本(注意kops仅支持特定Docker版本,这里以17.09.0为例):spec: docker: # 添加Docker配置 logDriver: json-file # 必填属性,不可省略 version: 17.09.0 # 注意:仅特定Docker版本被kops支持保存并退出编辑器即可。
应用集群配置更新
执行以下命令让kops生成并确认更新后的集群配置:kops update cluster滚动更新集群节点
执行以下命令触发集群节点的滚动更新,让所有节点完成Docker版本升级(--yes参数会直接执行操作,无需二次确认):kops rolling-update cluster --yes
等滚动更新全部完成后,再回到Jenkins Pipeline里执行docker version,就能看到Server端的Docker版本已经更新到你指定的版本了。
内容的提问来源于stack exchange,提问作者frankd

