在 Kubernetes 集群中,部分 CI/CD 流水线业务可能需要使用 Docker 来提供镜像打包服务。可通过宿主机的 Docker 实现,将 Docker 的 UNIX Socket(/var/run/docker.sock
)作为 hostPath 挂载到 CI/CD 的业务 Pod 中,之后在容器里通过 UNIX Socket 来调用宿主机上的 Docker 进行构建。该方式操作简单,比真正意义上的 Docker in Docker 更节省资源,但该方式可能会遇到以下问题:
docker exec
接口操作其他容器。针对上述第1个问题,Kubernetes 在官方博客宣布将在1.22版本之后弃用 Docker,这部分用户可能会将业务转投到 containerd。对于部分需要 containerd 集群,而不改变 CI/CD 业务流程仍使用 Docker 构建镜像一部分的场景,可以通过在原有 Pod 上添加 DinD 容器作为 Sidecar 或者使用 DaemonSet 在节点上部署专门用于构建镜像的 Docker 服务。
本文将为您介绍以下两种方式实现在 CI/CD 流水线业务上使用 Docker 构建镜像:
DinD(Docker in Docker)实现原理可参见 DinD 官方文档,本文示例将为 clean-ci 容器添加一个 Sidecar,配合 emptyDir 使 clean-ci 容器可以通过 UNIX Socket 访问 DinD 容器。示例如下:
apiVersion: v1
kind: Pod
metadata:
name: clean-ci
spec:
containers:
- name: dind
image: 'docker:stable-dind'
command:
- dockerd
- --host=unix:///var/run/docker.sock
- --host=tcp://0.0.0.0:8000
securityContext:
privileged: true
volumeMounts:
- mountPath: /var/run
name: cache-dir
- name: clean-ci
image: 'docker:stable'
command: ["/bin/sh"]
args: ["-c", "docker info >/dev/null 2>&1; while [ $? -ne 0 ] ; do sleep 3; docker info >/dev/null 2>&1; done; docker pull library/busybox:latest; docker save -o busybox-latest.tar library/busybox:latest; docker rmi library/busybox:latest; while true; do sleep 86400; done"]
volumeMounts:
- mountPath: /var/run
name: cache-dir
volumes:
- name: cache-dir
emptyDir: {}
该方式较为简单,直接在 containerd 集群中下发 DaemonSet 即可(挂载 hostPath),为不影响节点上 /var/run
路径,可以指定其他路径。
使用以下 YAML 部署 DaemonSet。示例如下:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: docker-ci
spec:
selector:
matchLabels:
app: docker-ci
template:
metadata:
labels:
app: docker-ci
spec:
containers:
- name: docker-ci
image: 'docker:stable-dind'
command:
- dockerd
- --host=unix:///var/run/docker.sock
- --host=tcp://0.0.0.0:8000
securityContext:
privileged: true
volumeMounts:
- mountPath: /var/run
name: host
volumes:
- name: host
hostPath:
path: /var/run
将业务 Pod 与 DaemonSet 共享同一个 hostPath。示例如下:
apiVersion: v1
kind: Pod
metadata:
name: clean-ci
spec:
containers:
- name: clean-ci
image: 'docker:stable'
command: ["/bin/sh"]
args: ["-c", "docker info >/dev/null 2>&1; while [ $? -ne 0 ] ; do sleep 3; docker info >/dev/null 2>&1; done; docker pull library/busybox:latest; docker save -o busybox-latest.tar library/busybox:latest; docker rmi library/busybox:latest; while true; do sleep 86400; done"]
volumeMounts:
- mountPath: /var/run
name: host
volumes:
- name: host
hostPath:
path: /var/run
React组件规范 --------------------------- # 文件命名 ? 每一个文件只包含一个...
日前,福安市检察院对利用 域名交易 行骗的刘某某等七人批准逮捕。至2018年5月9...
2012年9月26日,全球知名的IT行业巨头惠普在北京举行发布会,宣布推出两款全新HP...
一、简介 一 DataStax公司 DataStax?公司长久以来被人们认为是Apache Cassandra...
本文为您介绍轻量应用服务器的计费套餐,您可以根据业务情况进行选择。 轻量应用...
【51CTO.com原创稿件】新冠肺炎自发现以来对人们的生产生活造成了极大的影响,并...
海口地处海南岛北部 是海南省的省会城市。2018年4月 海口同阿里云达成合作 计划...
本文转载自微信公众号「过往记忆大数据」,作者过往记忆大数据 。转载本文请联系...
阿里 云服务器 服务怎么样?阿里云的服务器整体上还是不错的,是国内很知名的云...
在某些情况下,您可能需要从JavaScript代码生成输出。例如,您可能想查看变量的...