基于nerdctl+buildkitd+containerd实现镜像构建

打印 上一主题 下一主题

主题 650|帖子 650|积分 1950

1、容器技术简介

容器技术除了的docker之外,还有coreOS的rkt、google的gvisor、以及docker开源的containerd、redhat的podman、阿⾥的pouch等,为了保证容器⽣态的标准性和健康可持续发展,包括Linux 基⾦会、Docker、微软、红帽、⾕歌和IBM等公司在2015年6⽉共同成⽴了⼀个叫open container(OCI)的组织,其⽬的就是制定开放的标准的容器规范,⽬前OCI⼀共发布了两个规范,分别是runtime spec和image format spec,有了这两个规范,不同的容器公司开发的容器只要兼容这两个规范,就可以保证容器的可移植性和相互可操作性。
containerd官网:https://containerd.io/
gvisor官网:https://gvisor.dev/
podman官网:https://podman.io
pouch项目地址:https://github.com/alibaba/pouch
buildkit: 从Docker公司的开源出来的⼀个镜像构建⼯具包,⽀持OCI标准的镜像构建,项目地址https://github.com/moby/buildkit
2、buildkitd组成部分


buildkitd(服务端),⽬前⽀持runc和containerd作为镜像构建环境,默认是runc,可以更换为containerd。
buildctl(客户端),负责解析Dockerfile⽂件,并向服务端buildkitd发出构建请求。
3、部署buildkitd

3.1、下载二进制包
  1. wget https://github.com/moby/buildkit/releases/download/v0.11.6/buildkit-v0.11.6.linux-amd64.tar.gz
复制代码
解压压缩包,将二进制文件软连接至path环境变量
  1. root@k8s-master01:/usr/local/src# ls
  2. buildkit-v0.11.6.linux-amd64.tar.gz
  3. root@k8s-master01:/usr/local/src# tar xf buildkit-v0.11.6.linux-amd64.tar.gz
  4. root@k8s-master01:/usr/local/src# ls
  5. bin  buildkit-v0.11.6.linux-amd64.tar.gz
  6. root@k8s-master01:/usr/local/src# cd bin
  7. root@k8s-master01:/usr/local/src/bin# ls
  8. buildctl               buildkit-qemu-arm   buildkit-qemu-mips64    buildkit-qemu-ppc64le  buildkit-qemu-s390x  buildkitd
  9. buildkit-qemu-aarch64  buildkit-qemu-i386  buildkit-qemu-mips64el  buildkit-qemu-riscv64  buildkit-runc
  10. root@k8s-master01:/usr/local/src/bin# ln -s /usr/local/src/bin/* /usr/local/bin/
  11. root@k8s-master01:/usr/local/src/bin# buildctl --help
  12. NAME:
  13.    buildctl - build utility
  14. USAGE:
  15.    buildctl [global options] command [command options] [arguments...]
  16. VERSION:
  17.    v0.11.6
  18. COMMANDS:
  19.    du        disk usage
  20.    prune     clean up build cache
  21.    build, b  build
  22.    debug     debug utilities
  23.    help, h   Shows a list of commands or help for one command
  24. GLOBAL OPTIONS:
  25.    --debug                enable debug output in logs
  26.    --addr value           buildkitd address (default: "unix:///run/buildkit/buildkitd.sock")
  27.    --tlsservername value  buildkitd server name for certificate validation
  28.    --tlscacert value      CA certificate for validation
  29.    --tlscert value        client certificate
  30.    --tlskey value         client key
  31.    --tlsdir value         directory containing CA certificate, client certificate, and client key
  32.    --timeout value        timeout backend connection after value seconds (default: 5)
  33.    --help, -h             show help
  34.    --version, -v          print the version
  35. root@k8s-master01:/usr/local/src/bin#
复制代码
能够正常在bash中执行buildkit --help ,表示对应命令已经正常软连接至path环境中。
3.2、提供buildkit.socket文件
  1. root@k8s-master01:/usr/local/src/bin# cat /lib/systemd/system/buildkit.socket
  2. [Unit]
  3. Description=BuildKit
  4. Documentation=https://github.com/moby/buildkit
  5. [Socket]
  6. ListenStream=%t/buildkit/buildkitd.sock
  7. [Install]
  8. WantedBy=sockets.target
  9. root@k8s-master01:/usr/local/src/bin#
复制代码
3.3、提供buildkit.service文件
  1. root@k8s-master01:/usr/local/src/bin# cat /lib/systemd/system/buildkitd.service
  2. [Unit]
  3. Description=BuildKit
  4. Requires=buildkit.socket
  5. After=buildkit.socketDocumentation=https://github.com/moby/buildkit
  6. [Service]
  7. ExecStart=/usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true
  8. [Install]
  9. WantedBy=multi-user.target
  10. root@k8s-master01:/usr/local/src/bin#
复制代码
3.4、启动buildiktd服务
  1. root@k8s-master01:/usr/local/src/bin# systemctl daemon-reload
  2. root@k8s-master01:/usr/local/src/bin# systemctl enable buildkitd
  3. Created symlink /etc/systemd/system/multi-user.target.wants/buildkitd.service → /lib/systemd/system/buildkitd.service.
  4. root@k8s-master01:/usr/local/src/bin# systemctl restart buildkitd
  5. root@k8s-master01:/usr/local/src/bin# systemctl status buildkitd
  6. ● buildkitd.service - BuildKit
  7.      Loaded: loaded (/lib/systemd/system/buildkitd.service; enabled; vendor preset: enabled)
  8.      Active: active (running) since Wed 2023-05-31 13:32:38 UTC; 4s ago
  9.    Main PID: 12191 (buildkitd)
  10.       Tasks: 9 (limit: 4571)
  11.      Memory: 7.8M
  12.         CPU: 125ms
  13.      CGroup: /system.slice/buildkitd.service
  14.              └─12191 /usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true
  15. May 31 13:32:38 k8s-master01.ik8s.cc systemd[1]: Started BuildKit.
  16. May 31 13:32:38 k8s-master01.ik8s.cc buildkitd[12191]: time="2023-05-31T13:32:38Z" level=warning msg="using host network as the default"
  17. May 31 13:32:38 k8s-master01.ik8s.cc buildkitd[12191]: time="2023-05-31T13:32:38Z" level=warning msg="git source cannot be enabled: failed to find git
  18. binary: exec: "git": executable file not found in $PATH"
  19. May 31 13:32:38 k8s-master01.ik8s.cc buildkitd[12191]: time="2023-05-31T13:32:38Z" level=info msg="found worker "kffvitvra0b27yi956wa4xcal", labels=m
  20. ap[org.mobyproject.buildkit.worker.containerd.namespace:buildkit org.mobyproject.buildkit.worker.containerd.uuid:f27e8d21-8b1d-44ac-9233-f55b9b028fc0 o
  21. rg.mobyproject.buildkit.worker.executor:containerd org.mobyproject.buildkit.worker.hostname:k8s-master01.ik8s.cc org.mobyproject.buildkit.worker.networ
  22. k:host org.mobyproject.buildkit.worker.selinux.enabled:false org.mobyproject.buildkit.worker.snapshotter:overlayfs], platforms=[linux/amd64 linux/amd64
  23. /v2 linux/386]"
  24. May 31 13:32:38 k8s-master01.ik8s.cc buildkitd[12191]: time="2023-05-31T13:32:38Z" level=info msg="found 1 workers, default="kffvitvra0b27yi956wa4xcal
  25. ""
  26. May 31 13:32:38 k8s-master01.ik8s.cc buildkitd[12191]: time="2023-05-31T13:32:38Z" level=warning msg="currently, only the default worker can be used."
  27. May 31 13:32:38 k8s-master01.ik8s.cc buildkitd[12191]: time="2023-05-31T13:32:38Z" level=info msg="running server on /run/buildkit/buildkitd.sock"
  28. root@k8s-master01:/usr/local/src/bin#
复制代码
4、基于nginx代理⾃签名证书harbor并实现https

4.1、将harbor修改为http协议

停止harbor服务
  1. root@harbor:/app/harbor# docker-compose down
  2. [+] Running 13/13
  3. ✔ Container notary-server       Removed                                                                                                          0.8s
  4. ✔ Container nginx               Removed                                                                                                          1.7s
  5. ✔ Container harbor-jobservice   Removed                                                                                                          0.7s
  6. ✔ Container trivy-adapter       Removed                                                                                                          0.6s
  7. ✔ Container notary-signer       Removed                                                                                                          0.5s
  8. ✔ Container harbor-portal       Removed                                                                                                          0.3s
  9. ✔ Container harbor-core         Removed                                                                                                          3.5s
  10. ✔ Container harbor-db           Removed                                                                                                          0.7s
  11. ✔ Container registry            Removed                                                                                                          0.5s
  12. ✔ Container redis               Removed                                                                                                          0.5s
  13. ✔ Network harbor_notary-sig     Removed                                                                                                          0.8s
  14. ✔ Network harbor_harbor         Removed                                                                                                          0.2s
  15. ✔ Network harbor_harbor-notary  Removed                                                                                                          0.5s
  16. root@harbor:/app/harbor#
复制代码
修改harbor配置文件,注释https和证书的配置

重新prepare
  1. root@harbor:/app/harbor# ls
  2. LICENSE  common  common.sh  docker-compose.yml  harbor.v2.8.0.tar.gz  harbor.yml  harbor.yml.tmpl  install.sh  prepare
  3. root@harbor:/app/harbor# ./prepare
  4. prepare base dir is set to /app/harbor
  5. WARNING:root:WARNING: HTTP protocol is insecure. Harbor will deprecate http protocol in the future. Please make sure to upgrade to https
  6. Clearing the configuration file: /config/db/env
  7. Clearing the configuration file: /config/registry/passwd
  8. Clearing the configuration file: /config/registry/config.yml
  9. Clearing the configuration file: /config/registry/root.crt
  10. Clearing the configuration file: /config/notary/notary-signer-ca.crt
  11. Clearing the configuration file: /config/notary/notary-signer.key
  12. Clearing the configuration file: /config/notary/server-config.postgres.json
  13. Clearing the configuration file: /config/notary/server_env
  14. Clearing the configuration file: /config/notary/notary-signer.crt
  15. Clearing the configuration file: /config/notary/signer_env
  16. Clearing the configuration file: /config/notary/signer-config.postgres.json
  17. Clearing the configuration file: /config/notary/root.crt
  18. Clearing the configuration file: /config/trivy-adapter/env
  19. Clearing the configuration file: /config/core/env
  20. Clearing the configuration file: /config/core/app.conf
  21. Clearing the configuration file: /config/jobservice/env
  22. Clearing the configuration file: /config/jobservice/config.yml
  23. Clearing the configuration file: /config/registryctl/env
  24. Clearing the configuration file: /config/registryctl/config.yml
  25. Clearing the configuration file: /config/nginx/conf.d/notary.upstream.conf
  26. Clearing the configuration file: /config/nginx/conf.d/notary.server.conf
  27. Clearing the configuration file: /config/nginx/nginx.conf
  28. Clearing the configuration file: /config/log/rsyslog_docker.conf
  29. Clearing the configuration file: /config/log/logrotate.conf
  30. Clearing the configuration file: /config/portal/nginx.conf
  31. Generated configuration file: /config/portal/nginx.conf
  32. Generated configuration file: /config/log/logrotate.conf
  33. Generated configuration file: /config/log/rsyslog_docker.conf
  34. Generated configuration file: /config/nginx/nginx.conf
  35. Generated configuration file: /config/core/env
  36. Generated configuration file: /config/core/app.conf
  37. Generated configuration file: /config/registry/config.yml
  38. Generated configuration file: /config/registryctl/env
  39. Generated configuration file: /config/registryctl/config.yml
  40. Generated configuration file: /config/db/env
  41. Generated configuration file: /config/jobservice/env
  42. Generated configuration file: /config/jobservice/config.yml
  43. loaded secret from file: /data/secret/keys/secretkey
  44. Generated configuration file: /compose_location/docker-compose.yml
  45. Clean up the input dir
  46. root@harbor:/app/harbor#
复制代码
启动harbor
  1. root@harbor:/app/harbor# docker-compose up -d
  2. [+] Running 10/10
  3. ✔ Network harbor_harbor        Created                                                                                                           0.2s
  4. ✔ Container harbor-log         Started                                                                                                           1.2s
  5. ✔ Container registry           Started                                                                                                           2.5s
  6. ✔ Container harbor-portal      Started                                                                                                           2.7s
  7. ✔ Container registryctl        Started                                                                                                           2.7s
  8. ✔ Container harbor-db          Started                                                                                                           2.7s
  9. ✔ Container redis              Started                                                                                                           2.6s
  10. ✔ Container harbor-core        Started                                                                                                           3.2s
  11. ✔ Container harbor-jobservice  Started                                                                                                           4.2s
  12. ✔ Container nginx              Started                                                                                                           4.3s
  13. root@harbor:/app/harbor#
复制代码
如果你给harbor添加的有service文件,也可以使用systemctl stop/start harbor来停止/启动harbor
验证harbor是否可以正常登录?

4.2、nginx实现harbor的反向代理

4.2.1、nginx安装及配置
  1. root@k8s-deploy:~# cd /usr/local/src/
  2. root@k8s-deploy:/usr/local/src# wget https://nginx.org/download/nginx-1.22.0.tar.gz
  3. --2023-05-31 13:59:55--  https://nginx.org/download/nginx-1.22.0.tar.gz
  4. Resolving nginx.org (nginx.org)... 52.58.199.22, 3.125.197.172, 2a05:d014:edb:5704::6, ...
  5. Connecting to nginx.org (nginx.org)|52.58.199.22|:443... connected.
  6. HTTP request sent, awaiting response... 200 OK
  7. Length: 1073322 (1.0M) [application/octet-stream]
  8. Saving to: ‘nginx-1.22.0.tar.gz’
  9. nginx-1.22.0.tar.gz                        100%[=======================================================================================>]   1.02M  37.8KB/s    in 27s     
  10. 2023-05-31 14:00:23 (38.9 KB/s) - ‘nginx-1.22.0.tar.gz’ saved [1073322/1073322]
  11. root@k8s-deploy:/usr/local/src# tar xf nginx-1.22.0.tar.gz
  12. root@k8s-deploy:/usr/local/src# cd nginx-1.22.0
  13. root@k8s-deploy:/usr/local/src/nginx-1.22.0# ./configure --prefix=/apps/nginx \
  14. > --with-http_ssl_module \
  15. > --with-http_v2_module \
  16. > --with-http_realip_module \
  17. > --with-http_stub_status_module \
  18. > --with-http_gzip_static_module \
  19. > --with-pcre \
  20. > --with-stream \
  21. > --with-stream_ssl_module \
  22. > --with-stream_realip_module
复制代码

上述报错没有找到http模块依赖的PCRE库
解决办法:安装libpcre3 libpcre3-dev
  1. root@k8s-deploy:/usr/local/src/nginx-1.22.0# apt install libpcre3 libpcre3-dev -y
复制代码
安装上述依赖后,重新configure

上述报错没有找到ssl模块依赖的openssl库
解决办法:安装openssl libssl-dev
  1. root@k8s-deploy:/usr/local/src/nginx-1.22.0# apt install openssl libssl-dev -y
复制代码

执行上述./configure 没有报错,并且能够看到上述截图,表示编译环境通过检查,可以进行下一步编译和安装
编译安装nginx
  1. root@k8s-deploy:/usr/local/src/nginx-1.22.0# make && make install
复制代码
创建证书⽬录,并生成私钥,证书
4.2.1.1、创建证书⽬录,并生成ca私钥
  1. root@k8s-deploy:/apps/nginx/sbin# mkdir /apps/nginx/certs
  2. root@k8s-deploy:/apps/nginx/sbin# cd /apps/nginx/certs
  3. root@k8s-deploy:/apps/nginx/certs# openssl genrsa -out ca.key 4096
复制代码
4.2.1.2、用ca私钥生成ca自签名证书
  1. root@k8s-deploy:/apps/nginx/certs# openssl req -x509 -new -nodes -sha512 -days 3650 \
  2. >  -subj "/C=CN/ST=Beijing/L=Beijing/O=Personal-CA/OU=Personal/CN=CA.com" \
  3. >  -key ca.key \
  4. >  -out ca.crt
  5. root@k8s-deploy:/apps/nginx/certs# ls
  6. ca.crt  ca.key
  7. root@k8s-deploy:/apps/nginx/certs#
复制代码
4.2.1.3、生成harbor服务器私钥
  1. root@k8s-deploy:/apps/nginx/certs# openssl genrsa -out magedu.net.key 4096
  2. root@k8s-deploy:/apps/nginx/certs# ls
  3. ca.crt  ca.key  magedu.net.key
  4. root@k8s-deploy:/apps/nginx/certs#
复制代码
4.2.1.4、用harbor服务器私钥生成生成证书签名请求csr文件
  1. root@k8s-deploy:/apps/nginx/certs# openssl req -sha512 -new \
  2. >     -subj "/C=CN/ST=Beijing/L=Beijing/O=test/OU=Personal/CN=magedu.net" \
  3. >     -key magedu.net.key \
  4. >     -out magedu.net.csr
  5. root@k8s-deploy:/apps/nginx/certs# ls
  6. ca.crt  ca.key  magedu.net.csr  magedu.net.key
  7. root@k8s-deploy:/apps/nginx/certs#
复制代码
4.2.1.5、使用ca证书和私钥为harbor服务器签发证书
  1. root@k8s-deploy:/apps/nginx/certs# openssl x509 -req -sha512 -days 3650 \
  2. >     -CA ca.crt -CAkey ca.key -CAcreateserial \
  3. >     -in magedu.net.csr \
  4. >     -out magedu.net.crt
  5. Certificate request self-signature ok
  6. subject=C = CN, ST = Beijing, L = Beijing, O = test, OU = Personal, CN = magedu.net
  7. root@k8s-deploy:/apps/nginx/certs# ls
  8. ca.crt  ca.key  magedu.net.crt  magedu.net.csr  magedu.net.key
  9. root@k8s-deploy:/apps/nginx/certs#
复制代码
编辑nginx配置文件,配置证书和反向代理harbor
  1. root@k8s-deploy:/apps/nginx/certs# cat /apps/nginx/conf/nginx.conf
  2. worker_processes  1;
  3. events {
  4.     worker_connections  1024;
  5. }
  6. http {
  7.     client_max_body_size 1000m;
  8.     server {
  9.         listen       80;
  10.         listen       443 ssl;
  11.         ssl_certificate /apps/nginx/certs/magedu.net.crt;
  12.         ssl_certificate_key /apps/nginx/certs/magedu.net.key;
  13.         ssl_session_cache shared:sslcache:20m;
  14.         ssl_session_timeout 10m;
  15.         location / {
  16.                 if ($scheme = http ){
  17.                         rewrite / https://harbor.magedu.net permanent;
  18.                 }
  19.                 proxy_pass http://192.168.0.42;
  20.         }
  21.     }
  22. }
  23. root@k8s-deploy:/apps/nginx/certs#
复制代码
检查nginx配置文件语法
  1. root@k8s-deploy:/apps/nginx/certs# cd ..
  2. root@k8s-deploy:/apps/nginx# /apps/nginx/sbin/nginx -t
  3. nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
  4. nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
  5. root@k8s-deploy:/apps/nginx#
复制代码
启动nginx
  1. root@k8s-deploy:/apps/nginx# /apps/nginx/sbin/nginx
  2. root@k8s-deploy:/apps/nginx# ss -tnl
  3. State            Recv-Q            Send-Q                       Local Address:Port                       Peer Address:Port           Process           
  4. LISTEN           0                 511                                0.0.0.0:80                              0.0.0.0:*                                
  5. LISTEN           0                 4096                         127.0.0.53%lo:53                              0.0.0.0:*                                
  6. LISTEN           0                 128                                0.0.0.0:22                              0.0.0.0:*                                
  7. LISTEN           0                 511                                0.0.0.0:443                             0.0.0.0:*                                
  8. root@k8s-deploy:/apps/nginx#
复制代码
4.2.2、浏览器访问测试nginx 看看是否反向代理给harbor?是否为https?


查看证书信息

4.2.3、buildkitd配置⽂件
  1. root@k8s-master01:/usr/local/src/bin# cat /etc/buildkit/buildkitd.toml
  2. [registry."harbor.magedu.net"]
  3.   http = true
  4.   insecure = true
  5. root@k8s-master01:
复制代码
4.2.4、nerdctl配置⽂件
  1. root@k8s-master01:/usr/local/src/bin# cat /etc/nerdctl/nerdctl.toml
  2. namespace = "k8s.io"
  3. debug = false
  4. debug_full = false
  5. insecure_registry = true
  6. root@k8s-master01:/usr/local/src/bin#
复制代码
5、测试镜像构建

5.1、nerdctl常⽤命令

5.1.1 给nerdctl添加命令补全

[code]root@k8s-master01:~# echo "source

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

海哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表