拉取自建镜像仓库的镜像

拉取自建镜像仓库中的镜像时,可能会碰到因协议不同或者证书认证失败而导致镜像拉取失败的问题。本文介绍在自建镜像仓库采用HTTP协议和使用自签发证书的情况下,如何拉取自建镜像仓库中的镜像来创建ECI Pod或者ImageCache。

功能说明

拉取自建镜像仓库中的镜像时,可能会碰到“ErrImagePull”告警事件,出现镜像拉取失败的问题。在保证ECI与镜像仓库网络连通性的前提下,问题原因和解决方法如下:

场景

原因

解决方法

自建镜像仓库采用HTTP协议。

ECI默认使用HTTPS协议拉取镜像,协议不同导致镜像拉取失败。

配置ECI使用HTTP协议与镜像仓库进行交互。

自建镜像仓库采用HTTPS协议,但使用的证书是自签发证书。

使用自签发证书的情况下,拉取镜像时无法通过证书认证,导致镜像拉取失败。

配置跳过证书认证。

配置说明

拉取自建镜像仓库中的镜像时,如果镜像仓库采用HTTP协议,或者使用自签发证书,需配置Annotation来避免镜像拉取失败。相关Annotation说明如下:

配置项

示例值

说明

k8s.aliyun.com/plain-http-registry

"harbor***.pre.com,192.168.XX.XX:5000,reg***.test.com:80"

取值为自建镜像仓库地址。

拉取采用HTTP协议的自建镜像仓库中的镜像时,需配置该Annotation,使得ECI使用HTTP协议拉取镜像,避免因协议不同而导致镜像拉取失败。

k8s.aliyun.com/insecure-registry

"harbor***.pre.com,192.168.XX.XX:5000,reg***.test.com:80"

取值为自建镜像仓库地址。

拉取使用自签发证书的自建镜像仓库中的镜像时,需配置该Annotation来跳过证书认证,避免因证书认证失败而导致镜像拉取失败。

说明
  • 如果有多个容器的镜像需要从不同的镜像仓库中拉取,支持填写多个镜像仓库地址,各个地址之间采用半角逗号隔开,例如harbor***.pre.com,192.168.XX.XX

  • 如果镜像仓库地址有端口号,则需要带上端口号,例如:镜像地址为192.168.XX.XX:5000/nginx:latest,则参数值需设置为192.168.XX.XX:5000

配置示例

拉取自建镜像仓库中的镜像创建ECI Pod

重要
  • Annotation请添加在Pod的metadata下,例如:创建Deployment时,Annotation需添加在spec>template>metadata下。

  • 仅支持在创建ECI Pod时添加ECI相关Annotation来生效ECI功能,更新ECI Pod时添加或者修改ECI相关Annotation均不会生效。

  • 示例一:自建镜像仓库采用HTTP协议

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 4
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-test
          annotations:
            k8s.aliyun.com/plain-http-registry: "192.168.XX.XX:5000" # 指定自建镜像仓库地址,使用HTTP协议拉取镜像
          labels:
            app: nginx
            alibabacloud.com/eci: "true" 
        spec:
          containers:
          - name: nginx
            image: 192.168.XX.XX:5000/test/nginx:latest
  • 示例二:自建镜像仓库使用自签发证书

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 4
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-test
          annotations:
            k8s.aliyun.com/insecure-registry: "harbor***.pre.com" # 指定自建镜像仓库地址,拉取镜像时跳过证书认证
          labels:
            app: nginx
            alibabacloud.com/eci: "true" 
        spec:
          containers:
          - name: nginx
            image: harbor***.pre.com/test/nginx:latest

拉取自建镜像仓库中的镜像创建ImageCache

  • 示例一:自建镜像仓库采用HTTP协议

    apiVersion: eci.alibabacloud.com/v1
    kind: ImageCache
    metadata:
      name: imagecache-sample
      annotations:
        k8s.aliyun.com/plain-http-registry: "192.168.XX.XX:5000"  # 指定自建镜像仓库地址,使用HTTP协议拉取镜像
    spec:
      images:
      - 192.168.XX.XX:5000/test/nginx:latest
      imagePullSecrets:
      - default:secret1
      - default:secret2
      - kube-system:secret3
      imageCacheSize:
       25
      retentionDays:
       7
  • 示例二:自建镜像仓库使用自签发证书

    apiVersion: eci.alibabacloud.com/v1
    kind: ImageCache
    metadata:
      name: imagecache-sample
      annotations:
        k8s.aliyun.com/insecure-registry: "harbor***.pre.com"  # 指定自建镜像仓库地址,拉取镜像时跳过证书认证
    spec:
      images:
      - harbor***.pre.com/test/nginx:latest
      imagePullSecrets:
      - default:secret1
      - default:secret2
      - kube-system:secret3
      imageCacheSize:
       25
      retentionDays:
       7