Registry v2:设置和配置 Registry

使用此页面配置存储、Registry 请求行为、service account 拉取凭据、镜像限制以及计划的镜像清理,适用于 Registry v2

前提条件

  • 已安装 Registry v2,且 Config/cluster 已存在。
  • 你有权限更新 configs.imageregistry.operator.alauda.ioimagepruners.imageregistry.operator.alauda.ioLimitRangeResourceQuota 以及相关的 Kubernetes 资源。
  • 对于持久化存储,请在配置 Config/cluster 之前准备好存储后端和所需凭据。

配置开发环境存储

emptyDir 将镜像数据存储在临时 Pod 存储中。仅在所有已推送的镜像数据都可以在 Registry Pod 重建时丢弃的开发或测试环境中使用它。不要在生产环境或任何必须保留镜像的环境中使用 emptyDir

Patch Config/clusternull 字段会从当前配置中移除互斥的存储后端:

kubectl patch configs.imageregistry.operator.alauda.io cluster \
  --type=merge \
  -p '{
    "spec": {
      "managementState": "Managed",
      "replicas": 1,
      "storage": {
        "emptyDir": {},
        "pvc": null,
        "s3": null
      },
      "resources": {
        "requests": {
          "cpu": "500m",
          "memory": "500Mi"
        },
        "limits": {
          "cpu": "500m",
          "memory": "500Mi"
        }
      }
    }
  }'

验证配置并进行 rollout:

kubectl get configs.imageregistry.operator.alauda.io cluster -o yaml
kubectl -n image-registry-system rollout status deployment/image-registry --timeout=300s

预期结果:

  • Config/cluster 报告 Available=TrueProgressing=FalseDegraded=False
  • image-registry Deployment 成功完成 rollout。

配置 PVC 存储

生产环境请使用持久化后端。创建一个名为 image-registry-pvc.yaml 的文件:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: image-registry
  namespace: image-registry-system
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Gi
  storageClassName: <storage-class-name>
占位符描述
<storage-class-name>为 Registry PVC 提供动态供给的 StorageClass。运行 kubectl get storageclass 以列出可用值。对于多副本 Registry 部署,请选择支持所需访问模式的存储。

应用 PVC:

kubectl apply -f image-registry-pvc.yaml

Patch Config/cluster 以使用 PVC。请使用 merge patch,这样 Config/cluster.spec 中的其他字段(例如 routes 或 pull-secret 设置)不会被移除。null 字段会从当前配置中移除互斥的存储后端:

kubectl patch configs.imageregistry.operator.alauda.io cluster \
  --type=merge \
  -p '{
    "spec": {
      "managementState": "Managed",
      "replicas": 1,
      "storage": {
        "managementState": "Unmanaged",
        "emptyDir": null,
        "pvc": {
          "claim": "image-registry"
        },
        "s3": null
      },
      "resources": {
        "requests": {
          "cpu": "500m",
          "memory": "500Mi"
        },
        "limits": {
          "cpu": "500m",
          "memory": "500Mi"
        }
      }
    }
  }'

验证 PVC、配置和 rollout:

kubectl -n image-registry-system get pvc image-registry
kubectl get configs.imageregistry.operator.alauda.io cluster -o yaml
kubectl -n image-registry-system rollout status deployment/image-registry --timeout=300s

预期结果:

  • image-registry PVC 处于 Bound 状态。
  • Config/cluster 报告 Available=TrueProgressing=FalseDegraded=False
  • image-registry Deployment 成功完成 rollout。

配置兼容 S3 的存储凭据

在配置 Config/cluster 之前,先创建由用户管理的存储 Secret。Operator 会将此 Secret 合并到 Registry 的私有配置中:

kubectl -n image-registry-system create secret generic image-registry-private-configuration-user \
  --from-literal=REGISTRY_STORAGE_S3_ACCESSKEY=<access-key-id> \
  --from-literal=REGISTRY_STORAGE_S3_SECRETKEY=<secret-access-key>
占位符描述
<access-key-id>S3 兼容存储账户的访问密钥 ID。请从存储管理员处获取。
<secret-access-key>S3 兼容存储账户的 secret access key。请仅将其存储在 Kubernetes Secret 中。

当客户端无法直接访问对象存储端点,且所有内容都必须通过 Registry 提供时,请使用 disableRedirect: true

Patch Config/clusternull 字段会从当前配置中移除互斥的存储后端:

kubectl patch configs.imageregistry.operator.alauda.io cluster \
  --type=merge \
  -p '{
    "spec": {
      "managementState": "Managed",
      "replicas": 2,
      "storage": {
        "managementState": "Unmanaged",
        "emptyDir": null,
        "pvc": null,
        "s3": {
          "bucket": "<bucket-name>",
          "region": "<region>",
          "regionEndpoint": "https://<s3-endpoint>",
          "trustedCA": {
            "name": "<trusted-ca-configmap>"
          }
        }
      },
      "disableRedirect": true
    }
  }'
占位符描述
<bucket-name>用于 Registry blob 的现有对象存储 bucket 或等效容器。
<region>存储后端所需的 region 值。请使用提供商的值,或 S3 兼容服务要求的值。
<s3-endpoint>可从 Registry Pod 访问的 S3 兼容端点,不包含 bucket 名称。
<trusted-ca-configmap>image-registry-system 中包含对象存储端点 CA 证书的 ConfigMap。如果该端点使用 Registry Pod 信任的公共 CA,则省略 trustedCA

验证配置并进行 rollout:

kubectl get configs.imageregistry.operator.alauda.io cluster -o yaml
kubectl -n image-registry-system rollout status deployment/image-registry --timeout=300s
kubectl -n image-registry-system logs deployment/image-registry -c registry --tail=80

预期结果:

  • Config/cluster 报告 Available=TrueProgressing=FalseDegraded=False
  • Registry 日志中没有存储认证、bucket、endpoint 或证书错误。

配置受管的 Service Account Pull Secret

Operator 包含一个受管的 imagePullSecret controller。当 Config/cluster 受管时,该 controller 可以为内部 Registry 创建、注入、刷新和移除 service account pull secret。

通过附加主机或忽略的命名空间来 patch Config/cluster。此 patch 中的数组字段会替换当前数组,因此请包含所有必须保留配置的主机和命名空间:

kubectl patch configs.imageregistry.operator.alauda.io cluster \
  --type=merge \
  -p '{
    "spec": {
      "managementState": "Managed",
      "imagePullSecret": {
        "managementState": "Managed",
        "additionalRegistryHosts": [
          "registry.example.com"
        ],
        "ignoredNamespaces": [
          "kube-public"
        ],
        "ignoreSystemNamespaces": true
      }
    }
  }'

验证配置:

kubectl get configs.imageregistry.operator.alauda.io cluster -o yaml

预期结果:

  • Config/cluster.spec.imagePullSecret 包含已配置的管理状态、附加主机和被忽略的命名空间设置。

配置镜像限制

在 Registry v2 中,镜像大小和标签数量限制通过 Kubernetes LimitRangeResourceQuota 对象表示。不要在 Registry v2 部署中使用旧的 Registry gateway limit ConfigMap。

创建一个名为 team-a-image-quota.yaml 的文件,用于命名空间级配额:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: image-registry-quota
  namespace: team-a
spec:
  hard:
    alauda.io/imagestreams: "20"
    alauda.io/images: "200"
    alauda.io/image-tags: "200"

应用配额:

kubectl apply -f team-a-image-quota.yaml

创建一个名为 team-a-image-limits.yaml 的文件,用于每个镜像和每个 ImageStream 的限制:

apiVersion: v1
kind: LimitRange
metadata:
  name: image-registry-limits
  namespace: team-a
spec:
  limits:
    - type: alauda.io/Image
      max:
        storage: 1Gi
    - type: alauda.io/ImageStream
      max:
        alauda.io/images: "100"
        alauda.io/image-tags: "100"

应用限制:

kubectl apply -f team-a-image-limits.yaml

验证配额和限制:

kubectl -n team-a get resourcequota image-registry-quota -o yaml
kubectl -n team-a get limitrange image-registry-limits -o yaml

预期结果:

  • ResourceQuota 包含已配置的 Image API 限制。
  • LimitRange 包含已配置的 alauda.io/Imagealauda.io/ImageStream 限制。

配置计划的镜像清理

创建或更新单例 ImagePruner/cluster 以配置计划的镜像清理。在启用计划之前,请先确认保留策略,因为清理会删除未使用的镜像元数据。

创建一个名为 image-pruner.yaml 的文件:

apiVersion: imageregistry.operator.alauda.io/v1
kind: ImagePruner
metadata:
  name: cluster
spec:
  schedule: "0 0 * * *"
  suspend: false
  keepTagRevisions: 3
  keepYoungerThanDuration: 60m
  resources:
    requests:
      cpu: 500m
      memory: 500Mi
    limits:
      cpu: 500m
      memory: 500Mi

应用配置:

kubectl apply -f image-pruner.yaml

验证 pruner 资源和渲染后的 CronJob:

kubectl get imagepruners.imageregistry.operator.alauda.io cluster -o yaml
kubectl -n image-registry-system get cronjob image-pruner

预期结果:

  • ImagePruner/cluster 包含已配置的 schedule 和 retention policy。
  • Operator 会在 image-registry-system 中渲染 image-pruner CronJob。

清理会删除未使用的镜像元数据。当需要回收 blob 存储空间时,请单独运行 registry garbage collection。

有关手动清理和 registry garbage collection 命令,请参见 管理访问和清理

操作存储

对于基于 PVC 的 Registry 存储:

kubectl -n image-registry-system get pvc
kubectl -n image-registry-system describe pvc image-registry
kubectl get pv

常见操作:

  • 如果 PVC 处于 Pending 状态,请检查 StorageClass、访问模式、容量、配额和事件。
  • 如果 Registry Pod 无法挂载存储,请检查 PV 绑定、节点附加以及后端存储可用性。
  • 如果镜像元数据存在但 blob 数据缺失,请确认 Registry 是否使用了 emptyDir,或者存储后端是否已更改。
  • 在确认数据保留决策之前,不要删除 PVC、PV 或对象存储数据。