日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
徹底解決Gcr、Quay、DockerHub鏡像下載難題!

徹底解決 Gcr、Quay、dockerHub 鏡像下載難題!

作者:米開朗基楊 2021-02-18 08:22:26

云計算 國內(nèi)其他的鏡像加速方案大多都是采用定時同步的方式來緩存,這種方法是有一定延遲的,不能保證及時更新,ustc 和七牛云等鏡像加速器我都試過了,非常不靠譜,很多鏡像都沒有。

目前創(chuàng)新互聯(lián)已為1000多家的企業(yè)提供了網(wǎng)站建設、域名、虛擬主機、網(wǎng)站托管、服務器托管、企業(yè)網(wǎng)站設計、惠山網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

本文轉載自微信公眾號「云原生實驗室」,作者米開朗基楊。轉載本文請聯(lián)系云原生實驗室公眾號。

前言

在使用 Docker 和 Kubernetes 時,我們經(jīng)常需要訪問 gcr.io 和 quay.io 鏡像倉庫,由于眾所周知的原因,這些鏡像倉庫在中國都無法訪問,唯一能訪問的是 Docker Hub,但速度也是奇慢無比。gcr.azk8s.cn 是 gcr.io 鏡像倉庫的代理站點,原來可以通過 gcr.azk8s.cn 訪問 gcr.io 倉庫里的鏡像,但是目前 *.azk8s.cn 已經(jīng)僅限于 Azure 中國的 IP 使用,不再對外提供服務了。國內(nèi)其他的鏡像加速方案大多都是采用定時同步的方式來緩存,這種方法是有一定延遲的,不能保證及時更新,ustc 和七牛云等鏡像加速器我都試過了,非常不靠譜,很多鏡像都沒有。

為了能夠順利訪問 gcr.io 等鏡像倉庫,我們需要在墻外自己搭建一個類似于 gcr.azk8s.cn 的鏡像倉庫代理站點。利用 Docker 的開源項目 registry[1] 就可以實現(xiàn)這個需求,registry 不僅可以作為本地私有鏡像倉庫,還可以作為上游鏡像倉庫的緩存,也就是 pull through cache。

先來感受下速度:

1. 前提條件

一臺能夠施展魔法的服務器(你懂得,可以直接訪問 gcr.io)

一個域名和域名相關的 SSL 證書(docker pull 鏡像時需要驗證域名證書),一般用 Let's Encrypt[2] 就夠了。

2. 核心思路

registry 可以通過設置參數(shù) remoteurl 將其作為遠端倉庫的緩存?zhèn)}庫,這樣當你通過這個私有倉庫的地址拉取鏡像時,regiistry 會先將鏡像緩存到本地存儲,然后再提供給拉取的客戶端(有可能這兩個步驟是同時的,我也不太清楚)。我們可以先部署一個私有 registry,然后將 remoteurl 設為需要加速的鏡像倉庫地址,基本上就可以了。

3. 定制 registry

為了能夠支持緩存 docker.io、gcr.io、k8s.gcr.io、quay.io 和 ghcr.io 等常見的公共鏡像倉庫,我們需要對 registry 的配置文件進行定制,Dockerfile 如下:

  
 
 
 
  1. FROM registry:2.6
  2. LABEL maintainer="registry-proxy Docker Maintainers https://fuckcloudnative.io"
  3. ENV PROXY_REMOTE_URL="" \
  4.     DELETE_ENABLED=""
  5. COPY entrypoint.sh /entrypoint.sh

其中 entrypoint.sh 用來將環(huán)境變量傳入配置文件:

entrypoint.sh

  
 
 
 
  1. #!/bin/sh
  2. set -e
  3. CONFIG_YML=/etc/docker/registry/config.yml
  4. if [ -n "$PROXY_REMOTE_URL" -a `grep -c "$PROXY_REMOTE_URL" $CONFIG_YML` -eq 0 ]; then
  5.     echo "proxy:" >> $CONFIG_YML
  6.     echo "  remoteurl: $PROXY_REMOTE_URL" >> $CONFIG_YML
  7.     echo "  username: $PROXY_USERNAME" >> $CONFIG_YML
  8.     echo "  password: $PROXY_PASSWORD" >> $CONFIG_YML
  9.     echo "------ Enabled proxy to remote: $PROXY_REMOTE_URL ------"
  10. elif [ $DELETE_ENABLED = true -a `grep -c "delete:" $CONFIG_YML` -eq 0 ]; then
  11.     sed -i '/rootdirectory/a\  delete:' $CONFIG_YML
  12.     sed -i '/delete/a\    enabled: true' $CONFIG_YML
  13.     echo "------ Enabled local storage delete -----"
  14. fi
  15. sed -i "/headers/a\    Access-Control-Allow-Origin: ['*']" $CONFIG_YML
  16. sed -i "/headers/a\    Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE']" $CONFIG_YML
  17. sed -i "/headers/a\    Access-Control-Expose-Headers: ['Docker-Content-Digest']" $CONFIG_YML
  18. case "$1" in
  19.     *.yaml|*.yml) set -- registry serve "$@" ;;
  20.     serve|garbage-collect|help|-*) set -- registry "$@" ;;
  21. esac
  22. exec "$@"

4. 啟動緩存服務

構建好 Docker 鏡像之后,就可以啟動服務了。如果你不想自己構建,可以直接用我的鏡像:yangchuansheng/registry-proxy。

一般來說,即使你要同時緩存 docker.io、gcr.io、k8s.gcr.io、quay.io 和 ghcr.io,一臺 1C 2G 的云主機也足夠了(前提是你不在上面跑其他的服務)。我的博客、評論服務和其他一堆亂七八糟的服務都要跑在云主機上,所以一臺是不滿足我的需求的,我直接買了兩臺騰訊云香港輕量級服務器。

既然買了兩臺,肯定得組個 k3s 集群啦,看主機名就知道我是用來干啥的。其中 2C 4G 作為 master 節(jié)點,1C 2G 作為 node 節(jié)點。

以 docker.io 為例,創(chuàng)建資源清單:

dockerhub.yaml

  
 
 
 
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: dockerhub
  5.   labels:
  6.     app: dockerhub
  7. spec:
  8.   replicas: 1
  9.   selector:
  10.     matchLabels:
  11.       app: dockerhub
  12.   template:
  13.     metadata:
  14.       labels:
  15.         app: dockerhub
  16.     spec:
  17.       affinity:
  18.         podAntiAffinity:
  19.           preferredDuringSchedulingIgnoredDuringExecution:
  20.           - podAffinityTerm:
  21.               labelSelector:
  22.                 matchExpressions:
  23.                 - key: app
  24.                   operator: In
  25.                   values:
  26.                   - dockerhub
  27.               topologyKey: kubernetes.io/hostname
  28.             weight: 1
  29.       dnsPolicy: None
  30.       dnsConfig:
  31.         nameservers:
  32.           - 8.8.8.8
  33.           - 8.8.4.4
  34.       containers:
  35.       - name: dockerhub
  36.         image: yangchuansheng/registry-proxy:latest
  37.         env:
  38.         - name: PROXY_REMOTE_URL
  39.           value: https://registry-1.docker.io
  40.         - name: PROXY_USERNAME
  41.           value: yangchuansheng
  42.         - name: PROXY_PASSWORD
  43.           value: ********
  44.         ports:
  45.         - containerPort: 5000
  46.           protocol: TCP
  47.         volumeMounts:
  48.         - mountPath: /etc/localtime
  49.           name: localtime
  50.         - mountPath: /var/lib/registry
  51.           name: registry
  52.       volumes:
  53.       - name: localtime
  54.         hostPath:
  55.           path: /etc/localtime
  56.       - name: registry
  57.         hostPath:
  58.           path: /var/lib/registry
  59. ---
  60. apiVersion: v1
  61. kind: Service
  62. metadata:
  63.   name: dockerhub
  64.   labels:
  65.     app: dockerhub
  66. spec:
  67.   selector:
  68.     app: dockerhub
  69.   ports:
  70.     - protocol: TCP
  71.       name: http
  72.       port: 5000
  73.       targetPort: 5000

使用資源清單創(chuàng)建對應的服務:

  
 
 
 
  1.   → kubectl apply -f dockerhub.yaml

如果你只有一臺主機,可以使用 docker-compose 來編排容器,配置文件可以自己參考 k8s 的配置修改,本文就不贅述了。

5. 代理選擇

如果只緩存 docker.io,可以直接將 registry-proxy 的端口改成 443,并添加 SSL 證書配置。如果要緩存多個公共鏡像倉庫,就不太推薦這么做了,因為 443 端口只有一個,多個 registry-proxy 服務不能共用一個端口,合理的做法是使用邊緣代理服務根據(jù)域名來轉發(fā)請求到不同的 registry-proxy 服務。

對于 Kubernetes 集群來說,Ingress Controller 即邊緣代理,常見的 Ingress Controller 基本上都是由 Nginx 或者 Envoy 來實現(xiàn)。Envoy 雖為代理界新秀,但生而逢時,它的很多特性都是原生為云準備的,是真正意義上的 Cloud Native L7 代理和通信總線。比如它的服務發(fā)現(xiàn)和動態(tài)配置功能,與 Nginx 等代理的熱加載不同,Envoy 可以通過 API 來實現(xiàn)其控制平面,控制平面可以集中服務發(fā)現(xiàn),并通過 API 接口動態(tài)更新數(shù)據(jù)平面的配置,不需要重啟數(shù)據(jù)平面的代理。不僅如此,控制平面還可以通過 API 將配置進行分層,然后逐層更新。

目前使用 Envoy 實現(xiàn)的 Ingress Controller 有 ??Contour 和 Gloo[3] 等,如果你對 Envoy 比較感興趣,并且想使用 Ingress Controller 作為邊緣代理,可以試試 ??Contour。Ingress Controller 對底層做了抽象,屏蔽了很多細節(jié),無法顧及到所有細節(jié)的配置,必然不會支持底層代理所有的配置項,所以我選擇使用原生的 Envoy 來作為邊緣代理。如果你是單機跑的 registry-proxy 服務,也可以試試 Envoy。

6. 代理配置

首先創(chuàng)建 Envoy 的資源清單:

envoy.yaml

  
 
 
 
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: envoy
  5.   namespace: kube-system
  6.   labels:
  7.     app: envoy
  8. spec:
  9.   replicas: 2
  10.   selector:
  11.     matchLabels:
  12.       app: envoy
  13.   strategy:
  14.     rollingUpdate:
  15.       maxSurge: 0
  16.       maxUnavailable: 1
  17.     type: RollingUpdate
  18.   template:
  19.     metadata:
  20.       labels:
  21.         app: envoy
  22.     spec:
  23.       hostNetwork: true
  24.       dnsPolicy: ClusterFirstWithHostNet
  25.       containers:
  26.       - name: envoy
  27.         image: envoyproxy/envoy:v1.17-latest
  28.         imagePullPolicy: IfNotPresent
  29.         command:
  30.         - envoy
  31.         - /etc/envoy/envoy.yaml
  32.         ports:
  33.         - containerPort: 443
  34.           name: https
  35.         - containerPort: 80
  36.           name: http
  37.         - containerPort: 15001
  38.           name: http-metrics
  39.         volumeMounts:
  40.         - mountPath: /etc/localtime
  41.           name: localtime
  42.         - mountPath: /etc/envoy
  43.           name: envoy
  44.         - mountPath: /root/.acme.sh/fuckcloudnative.io
  45.           name: ssl
  46.       volumes:
  47.       - name: localtime
  48.         hostPath:
  49.           path: /etc/localtime
  50.       - name: ssl
  51.         hostPath:
  52.           path: /root/.acme.sh/fuckcloudnative.io
  53.       - name: envoy
  54.         hostPath:
  55.           path: /etc/envoy

使用資源清單創(chuàng)建對應的服務:

  
 
 
 
  1.   → kubectl apply -f envoy.yaml

這里選擇使用 hostPath 將 envoy 的配置掛載到容器中,然后??通過文件來動態(tài)更新配置。來看下 Envoy 的配置,先進入 /etc/envoy 目錄。

bootstrap 配置:

  
 
 
 
  1. node:
  2.   id: node0
  3.   cluster: cluster0
  4. dynamic_resources:
  5.   lds_config:
  6.     path: /etc/envoy/lds.yaml
  7.   cds_config:
  8.     path: /etc/envoy/cds.yaml
  9. admin:
  10.   access_log_path: "/dev/stdout"
  11.   address:
  12.     socket_address:
  13.       address: "0.0.0.0"
  14.       port_value: 15001

LDS 的配置:

lds.yaml

  
 
 
 
  1. version_info: "0"
  2. resources:
  3. - "@type": type.googleapis.com/envoy.config.listener.v3.Listener
  4.   name: listener_http
  5.   address:
  6.     socket_address:
  7.       address: 0.0.0.0
  8.       port_value: 80
  9.   filter_chains:
  10.   - filters:
  11.     - name: envoy.filters.network.http_connection_manager
  12.       typed_config:
  13.         "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
  14.         stat_prefix: ingress_http
  15.         codec_type: AUTO
  16.         access_log:
  17.           name: envoy.access_loggers.file
  18.           typed_config:
  19.             "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
  20.             path: /dev/stdout
  21.         route_config:
  22.           name: http_route
  23.           virtual_hosts:
  24.           - name: default
  25.             domains:
  26.             - "*"
  27.             routes:
  28.             - match:
  29.                 prefix: "/"
  30.               redirect:
  31.                 https_redirect: true
  32.                 port_redirect: 443
  33.                 response_code: "FOUND"
  34.         http_filters:
  35.         - name: envoy.filters.http.router
  36. - "@type": type.googleapis.com/envoy.config.listener.v3.Listener
  37.   name: listener_https
  38.   address:
  39.     socket_address:
  40.       address: 0.0.0.0
  41.       port_value: 443
  42.   listener_filters:
  43.   - name: "envoy.filters.listener.tls_inspector"
  44.     typed_config: {}
  45.   filter_chains:
  46.   - transport_socket:
  47.       name: envoy.transport_sockets.tls
  48.       typed_config:
  49.         "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
  50.         common_tls_context:
  51.           alpn_protocols: h2,http/1.1
  52.           tls_certificates:
  53.           - certificate_chain:
  54.               filename: "/root/.acme.sh/fuckcloudnative.io/fullchain.cer"
  55.             private_key:
  56.               filename: "/root/.acme.sh/fuckcloudnative.io/fuckcloudnative.io.key"
  57.     filters:
  58.     - name: envoy.filters.network.http_connection_manager
  59.       typed_config:
  60.         "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
  61.         stat_prefix: ingress_https
  62.         codec_type: AUTO
  63.         use_remote_address: true
  64.         access_log:
  65.           name: envoy.access_loggers.file
  66.           typed_config:
  67.             "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
  68.             path: /dev/stdout
  69.         route_config:
  70.           name: https_route
  71.           response_headers_to_add:
  72.           - header:
  73.               key: Strict-Transport-Security
  74.               value: "max-age=15552000; includeSubdomains; preload"
  75.           virtual_hosts:
  76.           - name: docker
  77.             domains:
  78.             - docker.fuckcloudnative.io
  79.             routes:
  80.             - match:
  81.                 prefix: "/"
  82.               route:
  83.                 cluster: dockerhub
  84.                 timeout: 600s
  85.         http_filters:
  86.         - name: envoy.filters.http.router
  87.           typed_config:
  88.             "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router 

CDS 的配置:

cds.yaml

  
 
 
 
  1. version_info: "0"
  2. resources:
  3. - "@type": type.googleapis.com/envoy.config.cluster.v3.Cluster
  4.   name: dockerhub
  5.   connect_timeout: 15s
  6.   type: strict_dns
  7.   dns_lookup_family: V4_ONLY
  8.   lb_policy: ROUND_ROBIN
  9.   load_assignment:
  10.     cluster_name: dockerhub
  11.     endpoints:
  12.     - lb_endpoints:
  13.       - endpoint:
  14.           address:
  15.             socket_address:
  16.               address: dockerhub.default
  17.               port_value: 5000

這里的 address 使用的是 Kubernetes 集群內(nèi)部域名,其他部署方式請自己斟酌。

配置好了 Envoy 之后,就可以通過代理服務器拉取 docker.io 的鏡像了。

7. 驗證加速效果

現(xiàn)在你就可以通過代理服務器來拉取公共鏡像了。比如你想拉取 nginx:alpine 鏡像,可以使用下面的命令:

  
 
 
 
  1.   → docker pull docker.fuckcloudnative.io/library/nginx:alpine
  2. alpine: Pulling from library/nginx
  3. 801bfaa63ef2: Pull complete
  4. b1242e25d284: Pull complete
  5. 7453d3e6b909: Pull complete
  6. 07ce7418c4f8: Pull complete
  7. e295e0624aa3: Pull complete
  8. Digest: sha256:c2ce58e024275728b00a554ac25628af25c54782865b3487b11c21cafb7fabda
  9. Status: Downloaded newer image for docker.fuckcloudnative.io/library/nginx:alpine
  10. docker.fuckcloudnative.io/library/nginx:alpine

8. 緩存所有鏡像倉庫

前面的示例只是緩存了 docker.io,如果要緩存所有的公共鏡像倉庫,可以參考 4-6 節(jié)的內(nèi)容。以 k8s.gcr.io 為例,先準備一個資源清單:

gcr-k8s.yaml

  
 
 
 
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: gcr-k8s
  5.   labels:
  6.     app: gcr-k8s
  7. spec:
  8.   replicas: 1
  9.   selector:
  10.     matchLabels:
  11.       app: gcr-k8s
  12.   template:
  13.     metadata:
  14.       labels:
  15.         app: gcr-k8s
  16.     spec:
  17.       affinity:
  18.         podAntiAffinity:
  19.           preferredDuringSchedulingIgnoredDuringExecution:
  20.           - podAffinityTerm:
  21.               labelSelector:
  22.                 matchExpressions:
  23.                 - key: app
  24.                   operator: In
  25.                   values:
  26.                   - gcr-k8s
  27.               topologyKey: kubernetes.io/hostname
  28.             weight: 1
  29.       dnsPolicy: None
  30.       dnsConfig:
  31.         nameservers:
  32.           - 8.8.8.8
  33.           - 8.8.4.4
  34.       containers:
  35.       - name: gcr-k8s
  36.         image: yangchuansheng/registry-proxy:latest
  37.         env:
  38.         - name: PROXY_REMOTE_URL
  39.           value: https://k8s.gcr.io
  40.         ports:
  41.         - containerPort: 5000
  42.           protocol: TCP
  43.         volumeMounts:
  44.         - mountPath: /etc/localtime
  45.           name: localtime
  46.         - mountPath: /var/lib/registry
  47.           name: registry
  48.       volumes:
  49.       - name: localtime
  50.         hostPath:
  51.           path: /etc/localtime
  52.       - name: registry
  53.         hostPath:
  54.           path: /var/lib/registry
  55. ---
  56. apiVersion: v1
  57. kind: Service
  58. metadata:
  59.   name: gcr-k8s
  60.   labels:
  61.     app: gcr-k8s
  62. spec:
  63.   selector:
  64.     app: gcr-k8s
  65.   ports:
  66.     - protocol: TCP
  67.       name: http
  68.       port: 5000
  69.       targetPort: 5000

將其部署到 Kubernetes 集群中:

  
 
 
 
  1.   → kubectl apply -f gcr-k8s.yaml

在 lds.yaml 中添加相關配置:

  
 
 
 
  1. virtual_hosts:
  2.          - name: docker
  3.            ...
  4.            ...
  5.          - name: k8s
  6.            domains:
  7.            - k8s.fuckcloudnative.io
  8.            routes:
  9.            - match:
  10.                prefix: "/"
  11.              route:
  12.                cluster: gcr-k8s
  13.                timeout: 600s

在 cds.yaml 中添加相關配置:

  
 
 
 
  1. - "@type": type.googleapis.com/envoy.config.cluster.v3.Cluster
  2.   name: gcr-k8s
  3.   connect_timeout: 1s
  4.   type: strict_dns
  5.   dns_lookup_family: V4_ONLY
  6.   lb_policy: ROUND_ROBIN
  7.   load_assignment:
  8.     cluster_name: gcr-k8s
  9.     endpoints:
  10.     - lb_endpoints:
  11.       - endpoint:
  12.           address:
  13.             socket_address:
  14.               address: gcr-k8s.default
  15.               port_value: 5000

其他鏡像倉庫可照搬上述步驟,以下是我自己跑的所有緩存服務容器:

  
 
 
 
  1.   → kubectl get pod -o wide
  2. gcr-8647ffb586-67c6g                     1/1     Running   0          21h     10.42.1.52    blog-k3s02
  3. ghcr-7765f6788b-hxxvc                    1/1     Running   0          21h     10.42.1.55    blog-k3s01
  4. dockerhub-94bbb7497-x4zwg                1/1     Running   0          21h     10.42.1.54    blog-k3s02
  5. gcr-k8s-644db84879-7xssb                 1/1     Running   0          21h     10.42.1.53    blog-k3s01
  6. quay-559b65848b-ljclb                    1/1     Running   0          21h     10.42.0.154   blog-k3s01

9. 容器運行時配置

配置好所有的緩存服務后,就可以通過代理來拉取公共鏡像了,只需按照下面的列表替換鏡像地址中的字段就行了:

原 URL 替換后的 URL
docker.io/xxx/xxx 或 xxx/xxx docker.fuckcloudnative.io/xxx/xxx
docker.io/library/xxx 或 xxx docker.fuckcloudnative.io/library/xxx
gcr.io/xxx/xxx gcr.fuckcloudnative.io/xxx/xxx
k8s.gcr.io/xxx/xxx k8s.fuckcloudnative.io/xxx/xxx
quay.io/xxx/xxx quay.fuckcloudnative.io/xxx/xxx
ghcr.io/xxx/xxx ghcr.fuckcloudnative.io/xxx/xxx

當然,最好的方式還是直接配置 registry mirror,Docker 只支持配置 docker.io 的 registry mirror,Containerd 和 Podman 支持配置所有鏡像倉庫的 registry mirror。

Docker

Docker 可以修改配置文件 /etc/docker/daemon.json,添加下面的內(nèi)容:

  
 
 
 
  1. {
  2.     "registry-mirrors": [
  3.         "https://docker.fuckcloudnative.io"
  4.     ]
  5. }

然后重啟 Docker 服務,就可以直接拉取 docker.io 的鏡像了,不需要顯示指定代理服務器的地址,Docker 服務本身會自動通過代理服務器去拉取鏡像。比如:

  
 
 
 
  1.  → docker pull nginx:alpine
  2.  → docker pull docker.io/library/nginx:alpine

Containerd

Containerd 就比較簡單了,它支持任意 registry 的 mirror,只需要修改配置文件 /etc/containerd/config.toml,添加如下的配置:

  
 
 
 
  1. [plugins."io.containerd.grpc.v1.cri".registry]
  2.      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  3.        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
  4.          endpoint = ["https://docker.fuckcloudnative.io"]
  5.        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
  6.          endpoint = ["https://k8s.fuckcloudnative.io"]
  7.        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]
  8.          endpoint = ["https://gcr.fuckcloudnative.io"]
  9.        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."ghcr.io"]
  10.          endpoint = ["https://ghcr.fuckcloudnative.io"]
  11.        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."quay.io"]
  12.          endpoint = ["https://quay.fuckcloudnative.io"]

重啟 Containerd 服務后,就可以直接拉取所有鏡像了,不需要修改任何前綴,Containerd 會根據(jù)配置自動選擇相應的代理 URL 拉取鏡像。

Podman

Podman 也支持任意 registry 的 mirror,只需要修改配置文件 /etc/containers/registries.conf,添加如下的配置:

  
 
 
 
  1. unqualified-search-registries = ['docker.io', 'k8s.gcr.io', 'gcr.io', 'ghcr.io', 'quay.io']
  2. [[registry]]
  3. prefix = "docker.io"
  4. insecure = true
  5. location = "registry-1.docker.io"
  6. [[registry.mirror]]
  7. location = "docker.fuckcloudnative.io"
  8. [[registry]]
  9. prefix = "k8s.gcr.io"
  10. insecure = true
  11. location = "k8s.gcr.io"
  12. [[registry.mirror]]
  13. location = "k8s.fuckcloudnative.io"
  14. [[registry]]
  15. prefix = "gcr.io"
  16. insecure = true
  17. location = "gcr.io"
  18. [[registry.mirror]]
  19. location = "gcr.fuckcloudnative.io"
  20. [[registry]]
  21. prefix = "ghcr.io"
  22. insecure = true
  23. location = "ghcr.io"
  24. [[registry.mirror]]
  25. location = "ghcr.fuckcloudnative.io"
  26. [[registry]]
  27. prefix = "quay.io"
  28. insecure = true
  29. location = "quay.io"
  30. [[registry.mirror]]
  31. location = "quay.fuckcloudnative.io"

然后就可以直接拉取所有鏡像了,不需要修改任何前綴,Podman 會根據(jù)配置自動選擇相應的代理 URL 拉取鏡像。而且 Podman 還有 fallback 機制,上面的配置表示先嘗試通過 registry.mirror 中 location 字段的 URL 來拉取鏡像,如果失敗就會嘗試通過 registry 中 location 字段的 URL 來拉取。

10. 清理緩存

緩存服務會將拉取的鏡像緩存到本地,所以需要消耗磁盤容量。一般云主機的磁盤容量都不是很大,OSS 和 s3 存儲都比較貴,不太劃算。

為了解決這個問題,我推薦定期刪除緩存到本地磁盤的部分鏡像,或者刪除所有鏡像。方法也比較簡單,單獨再部署一個 registry,共用其他 registry 的存儲,并啟用 delete 功能,然后再通過 API 或者 Dashboard 進行刪除。

先準備一個資源清單:

  
 
 
 
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: reg-local
  5.   labels:
  6.     app: reg-local
  7. spec:
  8.   replicas: 1
  9.   selector:
  10.     matchLabels:
  11.       app: reg-local
  12.   template:
  13.     metadata:
  14.       labels:
  15.         app: reg-local
  16.     spec:
  17.       affinity:
  18.         podAntiAffinity:
  19.           preferredDuringSchedulingIgnoredDuringExecution:
  20.           - podAffinityTerm:
  21.   
    文章名稱:徹底解決Gcr、Quay、DockerHub鏡像下載難題!
    網(wǎng)站鏈接:http://www.dlmjj.cn/article/djoojhj.html