弹性容器服务(Elastic Kubernetes Service,EKS)是腾讯云容器服务推出的无须用户购买节点即可部署工作负载的服务模式。弹性容器服务 EKS 完全兼容原生 Kubernetes,支持使用原生方式购买及管理资源,按照容器真实使用的资源量计费。弹性容器服务 EKS 还扩展支持腾讯云的存储及网络等产品,同时确保用户容器的安全隔离,开箱即用。
现在很多业务都部署到了eks上,部署的过程中,会遇到一些部署的问题,比如pod因为镜像拉取失败起不来,但是eks是没有节点的,无法执行docker命令测试,那么我要怎么测试eks内拉取镜像呢? 很多人会想到,可以采用docker in docker的方式,但是这个方式是需要挂载节点的docker.sock的,eks没有节点,每个pod相当于一台精简的cvm,并且pod底层用的也不是docker,而是containerd,那是不是就没有办法用docker命令来测试拉取镜像? 其实这里我们可以在集群部署一个deploy,配置2个容器,一个容器作为docker服务端,然后另外一个容器作为docker客户端,这2个容器共享docker.sock文件,然后就可以在客户端容器执行docker命令了。
具体的部署可以参考下面yaml文件
代码语言:javascript复制apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: docker-in-containerd
qcloud-app: docker-in-containerd
name: docker-in-containerd
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: docker-in-containerd
qcloud-app: docker-in-containerd
template:
metadata:
annotations:
eks.tke.cloud.tencent.com/root-cbs-size: "20"
labels:
k8s-app: docker-in-containerd
qcloud-app: docker-in-containerd
spec:
affinity: {}
containers:
- command:
- dockerd
- --host=unix:///var/run/docker.sock
- --host=tcp://0.0.0.0:8000
image: docker:stable-dind
imagePullPolicy: IfNotPresent
name: docker-ci
resources:
limits:
cpu: 500m
memory: 1Gi
requests:
cpu: 250m
memory: 256Mi
securityContext:
privileged: true
volumeMounts:
- mountPath: /var/run
name: host
- command:
- sleep
- 70d
image: docker:stable
imagePullPolicy: IfNotPresent
name: client
resources:
limits:
cpu: 500m
memory: 1Gi
requests:
cpu: 250m
memory: 256Mi
securityContext:
privileged: true
volumeMounts:
- mountPath: /var/run
name: host
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: qcloudregistrykey
restartPolicy: Always
schedulerName: default-scheduler
volumes:
- emptyDir: {}
name: host
yaml说明:
- docker-ci容器作为docker服务端
- client作为容器客户端
- 通过emptyDir,2个容器共享/var/run/docker.sock文件
- 2个容器都需要开启特权模式,不然docker服务端起不来
pod启动正常后,登陆client容器就可以执行docker命令了,下面我们测试下,用sh的方式登陆client容器