目錄
openEuler 24.03 (LTS-SP1) 下私有鏡像倉庫部署與自簽 SSL 全流程
1 創建根 CA 與服務器證書(修正版:SAN 寫法兼容所有 OpenSSL)
2 配置 Docker Compose 文件
3 客戶端節點信任 CA
3.1 Docker
3.2 containerd
4 推送 / 拉取測試
5 常見問題 & 排查
結語
注意:?ansible 相關命令請參考之前相關文章, 如下操作命令 實際驗證可用
openEuler 24.03 (LTS-SP1) 下私有鏡像倉庫部署與自簽 SSL 全流程
目標
主機 IP:
10.130.135.145
端口:
30500
(映射到容器 5000)數據目錄:
/app/registry
運行時:Docker / containerd 均可使用
證書目錄:
/app/registry/certs
客戶端:其余 K8s 節點或開發機
1 創建根 CA 與服務器證書(修正版:SAN 寫法兼容所有 OpenSSL)
# ① 準備目錄
sudo mkdir -p /app/registry/certs
cd /app/registry/certs# ② 生成根 CA(有效期 10 年)
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 \-subj "/CN=Brytech-Registry-CA" -out ca.crt# ③ 生成服務器私鑰
openssl genrsa -out registry.key 4096# ④ 生成帶 SAN 的 CSR(使用 alt_names 小節,100% 兼容)
cat > csr.cnf <<'EOF'
[ req ]
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = req_ext[ dn ]
CN = 10.130.135.145 # Common Name[ req_ext ]
subjectAltName = @alt_names[ alt_names ]
IP.1 = 10.130.135.145
EOFopenssl req -new -key registry.key -out registry.csr -config csr.cnf# ⑤ 用根 CA 簽發服務器證書(有效期 10 年)
openssl x509 -req -in registry.csr \-CA ca.crt -CAkey ca.key -CAcreateserial \-out registry.crt -days 3650 -sha256 \-extfile csr.cnf -extensions req_ext
驗證:
openssl x509 -in registry.crt -noout -text | grep -A1 "Subject Alternative Name"
# ? 必須看到 IP Address:10.130.135.145
2 配置 Docker Compose 文件
/app/registry/docker-compose.yml
version: '3.7'
services:registry:image: registry:3container_name: registryrestart: alwaysports:- "0.0.0.0:30500:5000"environment:REGISTRY_STORAGE: filesystemREGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /var/lib/registryREGISTRY_HTTP_SECRET: "a0393a48d72c4428a5aa87766430cb39c4e38d736e569a6cf6089445c823817c"REGISTRY_HTTP_TLS_CERTIFICATE: /certs/registry.crtREGISTRY_HTTP_TLS_KEY: /certs/registry.keyOTEL_TRACES_EXPORTER: "none"volumes:- /app/registry:/var/lib/registry # 鏡像數據- /app/registry/certs:/certs:ro # 證書只讀掛載
啟動:
cd /app/registry
docker compose up -d # 或 docker-compose up -d
日志中出現 listening on [::]:5000, tls
即代表 TLS 啟用成功。
3 客戶端節點信任 CA
以下以 節點 IP 為
NODE=10.130.135.145:30500
。
3.1 Docker
NODE=10.130.135.145:30500
sudo mkdir -p /etc/docker/certs.d/$NODE
# 將 ca.crt 拷貝到所有節點
sudo scp root@10.130.135.145:/app/registry/certs/ca.crt /etc/docker/certs.d/$NODE/
sudo systemctl restart docker
3.2 containerd
NODE=10.130.135.145:30500
sudo mkdir -p /etc/containerd/certs.d/$NODE
sudo cp /etc/docker/certs.d/$NODE/ca.crt /etc/containerd/certs.d/$NODE/cat <<EOF | sudo tee /etc/containerd/certs.d/$NODE/hosts.toml
server = "https://$NODE"[host."https://$NODE"]capabilities = ["pull", "resolve", "push"]ca = "/etc/containerd/certs.d/$NODE/ca.crt"
EOFsudo systemctl restart containerd
Kubernetes 節點批量分發
可用 Ansible:# 假設 NODE=10.130.135.145:30500 NODE=10.130.135.145:30500# ① 創建目錄(Docker + containerd) ansible all -m file -a "path=/etc/docker/certs.d/${NODE} state=directory mode=0755" ansible all -m file -a "path=/etc/containerd/certs.d/${NODE} state=directory mode=0755"# ② 拷貝 ca.crt(Docker 用) ansible all -m copy -a "src=/app/registry/certs/ca.crt dest=/etc/docker/certs.d/${NODE}/ca.crt owner=root mode=0644"# ③ 拷貝 ca.crt(containerd 用) ansible all -m copy -a "src=/app/registry/certs/ca.crt dest=/etc/containerd/certs.d/${NODE}/ca.crt owner=root mode=0644"# ④ 創建 hosts.toml(用于 containerd 識別 Registry) ansible all -m copy -a "content='server = \"https://${NODE}\"[host.\"https://${NODE}\"]capabilities = [\"pull\", \"resolve\", \"push\"]ca = \"/etc/containerd/certs.d/${NODE}/ca.crt\" ' dest=/etc/containerd/certs.d/${NODE}/hosts.toml mode=0644"# ⑤ 重啟運行時服務 ansible all -m shell -a "systemctl restart docker containerd"
4 推送 / 拉取測試
REG=10.130.135.145:30500
docker pull busybox:latest
docker tag busybox $REG/busybox:test
docker push $REG/busybox:test
docker pull $REG/busybox:test
# containerd 用戶:
# crictl pull $REG/busybox:test如果crictl 遇到錯誤 tls: failed to verify certificate: x509: certificate signed by unknown authority , 請參考如下文章解決:https://blog.csdn.net/gs80140/article/details/149248275?sharetype=blogdetail&sharerId=149248275&sharerefer=PC&sharesource=gs80140&spm=1011.2480.3001.8118
若過程無 x509: certificate signed by unknown authority
等錯誤,說明 CA 鏈配置成功。
5 常見問題 & 排查
現象 | 原因 | 解決 |
---|---|---|
unsupported option: subjectAltName | 舊 OpenSSL 不支持 @alt_names 語法 | 本文已改用兼容寫法;或升級 OpenSSL 至 ≥1.1.1 |
x509: certificate signed by unknown authority | 節點未加載 ca.crt | 確認路徑、文件權限,并重啟 Docker/containerd |
server gave HTTP response to HTTPS client | Registry 未啟用 TLS | 檢查 REGISTRY_HTTP_TLS_* 環境變量、端口映射 |
結語
通過上述步驟,在 openEuler 24.03 (LTS-SP1) 上零依賴外網地搭建了安全的私有鏡像倉庫,并讓集群節點可信任自簽 CA,實現了鏡像的高速本地化分發。后續可結合 Harbor 或 S3 遠端存儲進一步增強功能。祝部署順利!