20230113_docker.sock构建镜像
一、systemd方式提供docker sock不足
-
节点需要额外安装 docker-ce 的服务组件,后期扩容node节点需要额外定制,相对麻烦
-
管理node进程状态麻烦,运行日志,进程挂掉等需要人为干预,升级也需要手动操作。
-
docker in pod 可以独立运行与管理自己的containerd 与docker 进程,与宿主机的 containerd 完全隔离的存在。
二、部署与使用
介于以上原因,因而改进使用daemonset的方式提供docker.sock 给构建容器。
2.1 daemonset部署清单如下:
1apiVersion: apps/v1
2kind: DaemonSet
3metadata:
4 name: dinp-daemonset
5 namespace: default
6spec:
7 selector:
8 matchLabels:
9 name: dinp-daemonset
10 template:
11 metadata:
12 labels:
13 name: dinp-daemonset
14 spec:
15 hostNetwork: true
16 containers:
17 - name: dind
18 image: docker:20.10.12-dind
19 args: ["--insecure-registry=$(REGISTRY1)","--insecure-registry=$(REGISTRY2)","--host=unix:///var/run/docker.sock","--host=tcp://127.0.0.1:2376"]
20 lifecycle:
21 postStart:
22 # 默认 /var/run/docker.sock 文件权限无法给非root用户进行使用,此处需要修改其权限。
23 exec:
24 command: ["/bin/sh", "-c", "sleep 5 && echo $(date) 'After postStart change local file /var/run/docker.sock umask 666 .' && chmod 666 /var/run/docker.sock"]
25 env:
26 # 如果本地有私有搭建的镜像仓库,依次在此处添加仓库的域名,如果没有域名可独立添加IP地址
27 - name: REGISTRY1
28 value: hub1.k8s.li
29 - name: REGISTRY2
30 value: hub2.k8s.li
31 - name: DOCKER_TLS_CERTDIR
32 value: ""
33 securityContext:
34 privileged: true
35 tty: true
36 volumeMounts:
37 - name: docker-storage
38 mountPath: /var/lib/docker
39 - mountPath: /home/kubedeploy/images
40 name: dockerfile
41 - mountPath: /var/run/
42 name: docker-run
43 readinessProbe:
44 exec:
45 command: ["docker", "info"]
46 initialDelaySeconds: 10
47 failureThreshold: 6
48 livenessProbe:
49 exec:
50 command: ["docker", "info"]
51 initialDelaySeconds: 60
52 failureThreshold: 10
53 volumes:
54 # 修改docker 构建镜像的存储与缓存目录,该挂载点已经在node节点部署过程当中独立部署高速磁盘。
55 - name: docker-data-root
56 hostPath:
57 path: /ccdata/docker_cache
58 #path: /var/lib/docker
59 # 用于测试构建image的Dockerfile文件夹,可忽略
60 #- name: dockerfile
61 # hostPath:
62 # path: /root/kubedeploy/images
63 # 此处主机上的路径需要注意,该路径不可以直接默认的主机/var/run/ 目录进行直接挂载,会出现“OCI runtime create failed: rootfs” 或“libnetwork-setkey -e” 的错误,因而此处独立挂载了一个不存在的目录/docker-run/run , 在部署daemonset时该目录node节点上不存时会自动被创建。
64 - name: docker-run
65 hostPath:
66 path: /docker-run/run/
2.2 测试构建容器清单
1apiVersion: v1
2kind: Pod
3metadata:
4 name: clean-ci
5spec:
6 #securityContext:
7 # runAsUser: 1001
8 # runAsGroup: 1001
9 # fsGroup: 1001
10 containers:
11 - name: clean-ci
12 image: 'amd64/docker:20.10.22-git'
13 command: ["/bin/sh"]
14 args: ["-c", "tail -f /dev/null"]
15 env:
16 #- name: DOCKER_HOST
17 # valueFrom:
18 # fieldRef:
19 # fieldPath: status.hostIP
20 - name: DOCKER_TLS_VERIFY
21 value: ""
22 #args: ["-c", "cd /root/kubedeploy/images && docker build -t example-image:latest ."]
23 # 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"]
24 volumeMounts:
25 - mountPath: /var/run/docker.sock
26 name: docker-run-sock
27 - mountPath: /home/kubedeploy/images
28 name: dockerfile
29 #- mountPath: /var/lib/docker
30 # name: docker-rootfs
31 volumes:
32 # 构建容器只需要挂载如下一个文件到容器当中即可,** 如果在公司内部的SCM系统当中该处需要修改SCM当中json配置@朱华 **
33 - name: docker-run-sock
34 hostPath:
35 path: /docker-run/run/docker.sock
36 - name: dockerfile
37 hostPath:
38 path: /root/kubedeploy/images
39 #- name: docker-rootfs
40 # hostPath:
41 # path: /var/lib/docker/
2.3 使用过程
1) root用户构建:
2) 非root 用户构建
3) 非root 用户push 镜像:
- 原文作者:Kid
- 原文链接:https://shuanglu.life/post/20230113_docker.sock%E6%9E%84%E5%BB%BA%E9%95%9C%E5%83%8F/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。