0%

搭建内部quay镜像库

搭建内部quay镜像库

22-411-17

前提:部署https内部quay镜像仓库
由于内网quay主机配置不够,仅提供配置步骤,不会保留该服务
**仅用作经验记录**

前提

    1. 移除系统自带runc/podman/conmon
    1. 关闭selinux
    1. 关闭firewalld
    1. 完成后重启
    1. 域名解析要配置完成,为确保不出错,可以配置到/etc/hosts文件中

开始安装

    1. 安装必要软件包
      1
      # yum install podman container-tools -y
    1. podman 登录官方镜像库 registry.redhat.io
      1
      # podman login registry.redhat.io
    1. 创建文件夹
      1
      2
      3
      # mkdir -p $QUAY/config
      # mkdir -p $QUAY/postgres-quay
      # mkdir -p $QUAY/storage
    1. 启动postgres
    • 4.1 启动postgres容器
      1
      2
      3
       # podman run -d --rm  --name postgresql-quay -e POSTGRESQL_USER=quayuser \
      -e POSTGRESQL_PASSWORD=quaypass -e POSTGRESQL_DATABASE=quay \
      -e POSTGRESQL_ADMIN_PASSWORD=adminpass -p 5432:5432 -v $QUAY/postgres-quay:/var/lib/pgsql/data:z registry.redhat.io/rhel8/postgresql-10:1
    • 4.2 确保 pg_trgm 模块安装
      1
      # podman exec -it postgresql-quay /bin/bash -c 'echo "CREATE EXTENSION IF NOT EXISTS pg_trgm" | psql -d quay -U postgres'
    1. 启动redis
      1
      podman run -d --rm --name redis -p 6379:6379 -e REDIS_PASSWORD=strongpassword registry.redhat.io/rhel8/redis-5:1
    1. 配置证书,步骤较多,命令如下
    • 6.1 创建证书存放目录
      1
      # mkdir /etc/crts
    • 6.2. 创建证书
      • 6.2.1 创建ca:

        1
        2
        # openssl genrsa -out /etc/crts/cert.ca.key 4096
        # openssl req -x509 -new -nodes -key /etc/crts/cert.ca.key -sha256 -days 36500 -out /etc/crts/cert.ca.crt -subj /CN="Local Red Hat Ren Signer" -reqexts SAN -extensions SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf '[SAN]\nbasicConstraints=critical, CA:TRUE\nkeyUsage=keyCertSign, cRLSign, digitalSignature'))
      • 6.2.2 创建key,其中红色部分替换为当前quay域名:

        1
        2
        3
        4
        # openssl genrsa -out /etc/crts/cert.key 2048
        # openssl req -new -sha256 -key /etc/crts/cert.key -subj "/O=Local Cert/CN=<font color=red>quay.linuxone.in</font>" -reqexts SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:<font color=red>quay.linuxone.in</font>\nbasicConstraints=critical, CA:FALSE\nkeyUsage=digitalSignature, keyEncipherment, keyAgreement, dataEncipherment\nextendedKeyUsage=serverAuth")) -out /etc/crts/cert.csr
        # openssl x509 -req -sha256 -extfile <(printf "subjectAltName=DNS:<font color=red>quay.linuxone.in</font>\nbasicConstraints=critical, CA:FALSE\nkeyUsage=digitalSignature, keyEncipherment, keyAgreement, dataEncipherment\nextendedKeyUsage=serverAuth") -days 3650 -in /etc/crts/cert.csr -CA /etc/crts/cert.ca.crt -CAkey /etc/crts/cert.ca.key -CAcreateserial -out /etc/crts/cert.crt
        # openssl x509 -in /etc/crts/cert.crt -text
      • 6.2.3. 将证书移动到以下目录并信任:

        1
        2
        # cp cert.ca.key  /etc/pki/ca-trust/source/anchors/
        # update-ca-trust extract</code></pre></html>
    1. 配置quay
    • 7.1 启动quay config 容器
      1
      # podman run --rm -it --name quay_config -p 8080:8080 -p 443:8443  registry.redhat.io/quay/quay-rhel8:v3.4.1 config secret  
      22-411-8
    • 7.2 访问8080端口,用户名:quayconfig,密码:secret,进入配置页面
      22-411-9
      • 7.2.1 配置Server Configuration
        22-411-10
        1. 填写quay fqdn
        2. 选择为 Red Hat Quay handles TLS
        3. 选择 cert.crt 文件
        4. 选择 cert.key 文件
      • 7.2.2 配置Database
        22-411-11
        1. 选择postgres
        2. Sever 配置为当前quay主机fqdn
        3. name配置为4.1POSTGRESQL_USER
        4. 密码配置为4.1POSTGRESQL_PASSWORD
        5. 数据库名配置为4.1POSTGRESQL_DATABASE
      • 7.2.3 配置Redis
        22-411-12
        1. 容器启动主机的fqdn
        2. 密码为5REDIS_PASSWORD
      • 7.2.4 配置 Registry Storage
        22-411-13
        1. 可以配置为本地存储,选择Locally mounted directory
        2. 配置目录请记住,默认为/datastorage/registry
      • 7.2.5 Access Settings配置超级用户,该步骤请于后续执行
        22-411-14
        1. 填写用户名
        2. 点击add 添加
      • 7.2.6 基本配置好后,点击Validate Configuration Changes,下载 quay-config.tar.gz 并解压到 $QUAY/config 目录中
        22-411-15
    1. 启动quay
      1
      # podman run -d --rm -p 80:8080 -p 443:8443     --name=quay    -v $QUAY/config:/conf/stack:Z    -v $QUAY/storage:/datastorage:Z    registry.redhat.io/quay/quay-rhel8:v3.6.3
    • 8.1 启动后点击 Create Account 创建用户,例quayadmin,密码为password
      22-411-16
    • 8.2 创建完成用户后,关闭该容器
      1
      # podman rm -f quay
    • 8.3 重新执行第7步,包括7.2.5,配置quayadmin为超级用户,配置完成后下载 quay-config.tar.gz,并覆盖之前$QUAY/config 目录中内容
    • 8.4 再次启动quay,使用quayadmin登录
    1. 配置podman信任本地quay
    • 9.1 将ca证书复制到对应目录,如果不存在,则创建
      1
      # cp /etc/crts/cert.ca.crt /etc/containers/certs.d/quay.linuxone.in/cert.ca.crt
    • 9.2 创建完成后,信任该证书
      1
      # update-ca-trust extract
    • 9.3 测试登录
      1
      # podman login quay.linuxone.in
    1. 配置容器重启后依旧生效
    • 10.1 podman自动生成service文件
      1
      2
      3
      # podman generate systemd --new --files --name redis
      # podman generate systemd --new --files --name postgresql-quay
      # podman generate systemd --new --files --name quay
    • 10.2 将service文件复制到指定目录
      1
      2
      3
      # cp -Z container-redis.service /usr/lib/systemd/system
      # cp -Z container-postgresql-quay.service /usr/lib/systemd/system
      # cp -Z container-quay.service /usr/lib/systemd/system
    • 10.3 使用systemd的方式进行管理
      1
      2
      3
      4
      # systemctl daemon-reload 
      # systemctl enable --now container-redis.service
      # systemctl enable --now container-postgresql-quay.service
      # systemctl enable --now container-quay.service
    1. 配置容器镜像漏洞扫描服务Clair
    • 11.1 创建Clair容器所需的目录

      1
      # mkdir -p $QUAY/postgres-clairv4/
    • 11.2 启动 Clair 所需单独使用的 postgresql 数据库

      1
      # podman run -d --rm --name postgresql-clairv4   -e POSTGRESQL_USER=clairuser   -e POSTGRESQL_PASSWORD=clairpass   -e POSTGRESQL_DATABASE=clair   -e POSTGRESQL_ADMIN_PASSWORD=adminpass   -p 5433:5432   -v $QUAY/postgres-clairv4:/var/lib/pgsql/data:Z   registry.redhat.io/rhel8/postgresql-10:1
    • 11.3 为postgresql 添加 Clair 所需的数据库

      1
      # podman exec -it postgresql-clairv4 /bin/bash -c 'echo "CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\"" | psql -d clair -U postgres'
    • 11.4 启动 quay 配置容器,额外进行以下配置

      1
      # podman run --rm -it --name quay_config   -p 80:8080 -p 443:8443   -v $QUAY/config:/conf/stack:Z   registry.redhat.io/quay/quay-rhel8:v3.6.4 config secret

      在配置页面进行以下配置并保存配置文件 quay-confg.tar.gz
      22-411-18

    • 将对应配置解压到$QUAY/config目录,然后配置 Clair 配置文件

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      # cat /etc/clairv4/config/config.yaml
      http_listen_addr: :8081
      introspection_addr: :8089
      log_level: debug
      indexer:
      connstring: host=quay.linuxone.in port=5433 dbname=clair user=clairuser password=clairpass sslmode=disable <<<
      scanlock_retry: 10
      layer_scan_concurrency: 5
      migrations: true
      matcher:
      connstring: host=quay.linuxone.in port=5433 dbname=clair user=clairuser password=clairpass sslmode=disable <<<
      max_conn_pool: 100
      run: ""
      migrations: true
      indexer_addr: clair-indexer
      notifier:
      connstring: host=quay.linuxone.in port=5433 dbname=clair user=clairuser password=clairpass sslmode=disable <<<
      delivery_interval: 1m
      poll_interval: 5m
      migrations: true
      auth:
      psk:
      key: "aDFiMmY2ajk4NjI1OQ==" <<<
      iss: ["quay"]
      # tracing and metrics
      trace:
      name: "jaeger"
      probability: 1
      jaeger:
      agent_endpoint: "localhost:6831"
      service_name: "clair"
      metrics:
      name: "prometheus"
    • 11.5 启动Clair 容器

      1
      # podman run -d --rm --name clairv4   -p 8081:8081 -p 8089:8089   -e CLAIR_CONF=/clair/config.yaml -e CLAIR_MODE=combo   -v /etc/clairv4/config:/clair:Z   registry.redhat.io/quay/clair-rhel8:v3.6.4
    • 11.6 然后启动 quay 容器

    • 11.7 由于 quay 容器依赖与Clair容器启动后启动,进行以下配置

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      # cat /usr/lib/systemd/system/container-quay.service
      [Unit]
      Description=Podman container-quay.service
      Documentation=man:podman-generate-systemd(1)
      Wants=network.target
      After=container-clairv4.service <<<

      [Service]
      Environment=PODMAN_SYSTEMD_UNIT=%n
      Restart=on-failure
      RestartSec=30
      ExecStartPre=/bin/rm -f %t/container-quay.pid %t/container-quay.ctr-id
      ExecStart=/usr/bin/podman run --conmon-pidfile %t/container-quay.pid --cidfile %t/container-quay.ctr-id --cgroups=no-conmon -d --rm -p 8080:8080 --name=quay -v /home/user1/quay/config:/conf/stack:Z -v /home/user1/quay/storage:/datastorage:Z registry.redhat.io/quay/quay-rhel8:v3.4.0
      ExecStop=/usr/bin/podman stop --ignore --cidfile %t/container-quay.ctr-id -t 10
      ExecStopPost=/usr/bin/podman rm --ignore -f --cidfile %t/container-quay.ctr-id
      PIDFile=%t/container-quay.pid
      KillMode=none
      Type=forking

      [Install]
      WantedBy=multi-user.target default.target
    • 11.8 关闭漏洞扫描的原因为,当前主机为我自己家用nas 4核心,开启漏洞扫描后负载为:
      22-411-18
      根本负担不起,所以就不开启此服务了。


一些遇到的小问题

  1. 不想进行安全验证,则添加--tls-verify=false

    1
    # podman login quay.linuxone.in --tls-verify=false
  2. 镜像被签名,无法推送到本地quay,则添加--remove-signatures

    1
    # podman push --remove-signatures quay.linuxone.in/quay/postgresql-10:1
  3. 配置podman对于docker.io加速

  • 3.1 已经有阿里云镜像加速器
  • 3.2 对应修改registry.conf文件
    # /etc/containers/registries.conf
    unqualified-search-registries = ["registry.fedoraproject.org", "registry.access.redhat.com", "registry.centos.org", "docker.io"]
    [[registry]]
    prefix = "docker.io"
    location = "xacs4bss.mirror.aliyuncs.com" 
  1. 本地配置https本地镜像库的证书
    将ca证书复制到以下以镜像库url命令的目录,如果不存在,则创建
# cp /etc/crts/cert.ca.crt /etc/containers/certs.d/quay.linuxone.in/cert.ca.crt