一、systemd方式提供docker sock不足

  1. 节点需要额外安装 docker-ce 的服务组件,后期扩容node节点需要额外定制,相对麻烦

  2. 管理node进程状态麻烦,运行日志,进程挂掉等需要人为干预,升级也需要手动操作。

  3. 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/

image-20230113141741468

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用户构建:

image-20230113141938122

2) 非root 用户构建

image-20230113142607175

3) 非root 用户push 镜像:

image-20230113142445559