Registry v2:设置和配置 Registry
使用此页面配置存储、Registry 请求行为、service account 拉取凭据、镜像限制以及计划的镜像清理,适用于 Registry v2。
前提条件
- 已安装 Registry v2,且
Config/cluster 已存在。
- 你有权限更新
configs.imageregistry.operator.alauda.io、imagepruners.imageregistry.operator.alauda.io、LimitRange、ResourceQuota 以及相关的 Kubernetes 资源。
- 对于持久化存储,请在配置
Config/cluster 之前准备好存储后端和所需凭据。
配置开发环境存储
emptyDir 将镜像数据存储在临时 Pod 存储中。仅在所有已推送的镜像数据都可以在 Registry Pod 重建时丢弃的开发或测试环境中使用它。不要在生产环境或任何必须保留镜像的环境中使用 emptyDir。
Patch Config/cluster。null 字段会从当前配置中移除互斥的存储后端:
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=True、Progressing=False 和 Degraded=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>
应用 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=True、Progressing=False 和 Degraded=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>
当客户端无法直接访问对象存储端点,且所有内容都必须通过 Registry 提供时,请使用 disableRedirect: true。
Patch Config/cluster。null 字段会从当前配置中移除互斥的存储后端:
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
}
}'
验证配置并进行 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=True、Progressing=False 和 Degraded=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 LimitRange 和 ResourceQuota 对象表示。不要在 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/Image 和 alauda.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 或对象存储数据。