上云无忧 > 文档中心 > 腾讯云容器服务实战教程 - 在 containerd 集群中使用 Docker 做镜像构建服务
容器服务 TKE
腾讯云容器服务实战教程 - 在 containerd 集群中使用 Docker 做镜像构建服务

文档简介:
操作场景: 在 Kubernetes 集群中,部分 CI/CD 流水线业务可能需要使用 Docker 来提供镜像打包服务。可通过宿主机的 Docker 实现,将 Docker 的 UNIX Socket(/var/run/docker.sock)作为 hostPath 挂载到 CI/CD 的业务 Pod 中,之后在容器里通过 UNIX Socket 来调用宿主机上的 Docker 进行构建。
*此产品及展示信息均由腾讯云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

操作场景

在 Kubernetes 集群中,部分 CI/CD 流水线业务可能需要使用 Docker 来提供镜像打包服务。可通过宿主机的 Docker 实现,将 Docker 的 UNIX Socket(/var/run/docker.sock)作为 hostPath 挂载到 CI/CD 的业务 Pod 中,之后在容器里通过 UNIX Socket 来调用宿主机上的 Docker 进行构建。该方式操作简单,比真正意义上的 Docker in Docker 更节省资源,但该方式可能会遇到以下问题:
无法运行在 Runtime 是 containerd 的集群中。
如果不加以控制,可能会覆盖掉节点上已有的镜像。
在需要修改 Docker Daemon 配置文件的情况下,可能会影响到其他业务。
在多租户的场景下并不安全,当拥有特权的 Pod 获取到 Docker 的 UNIX Socket 之后,Pod 中的容器不仅可以调用宿主机的 Docker 构建镜像、删除已有镜像或容器,甚至可以通过 docker exec 接口操作其他容器。
针对上述第1个问题,Kubernetes 在官方博客宣布将在1.22版本之后弃用 Docker,这部分用户可能会将业务转投到 containerd。对于部分需要 containerd 集群,而不改变 CI/CD 业务流程仍使用 Docker 构建镜像一部分的场景,可以通过在原有 Pod 上添加 DinD 容器作为 Sidecar 或者使用 DaemonSet 在节点上部署专门用于构建镜像的 Docker 服务。本文将为您介绍以下两种方式实现在 CI/CD 流水线业务上使用 Docker 构建镜像:
方式1:使用 DinD 作为 Pod 的 Sidecar
方式2:使用 DaemonSet 在每个 containerd 节点上部署 Docker

操作步骤

方式1:使用 DinD 作为 Pod 的 Sidecar

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: {}

方式2:使用 DaemonSet 在每个 containerd 节点上部署 Docker

该方式较为简单,直接在 containerd 集群中下发 DaemonSet 即可(挂载 hostPath),为不影响节点上 /var/run 路径,可以指定其他路径。
1. 使用以下 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
2. 将业务 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

相似文档
  • 操作场景: 许多 DevOps 的需求需要借助 Jenkins 来实现,本文将介绍如何在容器服务 TKE 上部署 Jenkins。 前提条件: 已创建 TKE 集群。
  • 腾讯云容器服务(Tencent Kubernetes Engine,TKE)提供集群和服务两个层级的弹性伸缩能力, 能够根据业务运行情况监控容器的 CPU、内存、带宽等指标,进行自动扩缩服务。同时您可以根据容器的部署情况,在容器不够资源分配或者有过多剩余资源的情况下自动伸缩集群。
  • 操作场景: 如 TKE 集群配置了节点池并启用弹性伸缩,则在节点资源不够时可以触发节点的自动扩容(自动购买机器并加入集群),该扩容流程需要一定的时间才能完成,在一些流量突高的场景,该扩容速度可能会显得太慢,影响业务正常运行。
  • 操作场景: metrics-server 可实现 Kubernetes 的 Resource Metrics API(metrics.k8s.io),通过此 API 可以查询 Pod 与 Node 的部分监控指标,Pod 的监控指标用于 HPA、VPA 与 kubectl top pods 命令,而 Node 指标目前只用于 kubectl top nodes 命令。
  • 操作场景: 容器服务 TKE 基于 Custom Metrics API 支持许多用于弹性伸缩的指标,涵盖 CPU、内存、硬盘、网络以及 GPU 相关的指标,覆盖绝大多数的 HPA 弹性伸缩场景,详细列表请参见 自动伸缩指标说明。针对例如基于业务单副本 QPS 大小来进行自动扩缩容等复杂场景,可通过安装 prometheus-adapter 来实现自动扩缩容。
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部