设置和配置 Registry
使用此页面为 Alauda Container Platform Registry 配置存储、Registry 请求行为、服务账户拉取凭证、镜像限制和计划的镜像清理。
前提条件
- Registry 已安装,并且
Config/cluster 已存在。
- 你有权限更新
configs.imageregistry.operator.alauda.io、imagepruners.imageregistry.operator.alauda.io、LimitRange、ResourceQuota 及相关 Kubernetes 资源。
- 对于持久化存储,请在配置
Config/cluster 之前准备好存储后端和所需凭证。
配置开发存储
警告:emptyDir 将镜像数据存储在临时 Pod 存储中。Registry Pod 从其节点中移除时,数据会被删除;此存储类型不能与多个 Registry 副本一起使用。仅在可以丢弃所有推送镜像数据的开发或测试环境中使用。请勿将 emptyDir 用于生产环境或任何必须保留镜像的环境。
修补 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,
"swift": null,
"gcs": null,
"ibmcos": null,
"azure": null
},
"resources": {
"requests": {
"cpu": "500m",
"memory": "500Mi"
},
"limits": {
"cpu": "500m",
"memory": "500Mi"
}
}
}
}'
验证配置并检查发布状态:
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 成功发布。
配置 PVC 存储
生产环境请使用持久化后端。此示例使用 ReadWriteOnce、一个 Registry 副本,以及 Operator 针对 RWO 存储所需的 Recreate 发布策略。创建名为 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
修补 Config/cluster 以使用 PVC。使用合并修补,以免删除其他 Config/cluster.spec 字段(例如路由或拉取密钥设置)。null 字段会从当前配置中移除互斥的存储后端:
kubectl patch configs.imageregistry.operator.alauda.io cluster \
--type=merge \
-p '{
"spec": {
"managementState": "Managed",
"replicas": 1,
"rolloutStrategy": "Recreate",
"storage": {
"managementState": "Unmanaged",
"emptyDir": null,
"pvc": {
"claim": "image-registry"
},
"s3": null,
"swift": null,
"gcs": null,
"ibmcos": null,
"azure": null
},
"resources": {
"requests": {
"cpu": "500m",
"memory": "500Mi"
},
"limits": {
"cpu": "500m",
"memory": "500Mi"
}
}
}
}'
验证 PVC、配置和发布状态:
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 成功发布。
配置 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> \
--dry-run=client -o yaml | kubectl apply -f -
在不打印其内容的情况下验证 Secret:
kubectl -n image-registry-system get secret image-registry-private-configuration-user \
-o jsonpath='{.type}{"\n"}'
kubectl -n image-registry-system get secret image-registry-private-configuration-user \
-o jsonpath='{.data}' | wc -c
预期结果:
- Secret 存在于
image-registry-system 中。
- 第二条命令返回非零字节数。请勿打印或解码 Secret 数据。
当客户端无法直接访问对象存储端点,且所有内容都必须通过 Registry 提供时,使用 disableRedirect: true。
如果 S3 端点使用私有 CA,请创建包含所需键的引用 ConfigMap:
kubectl -n image-registry-system create configmap <trusted-ca-configmap> \
--from-file=ca-bundle.crt=/path/to/ca-bundle.crt \
--dry-run=client -o yaml | kubectl apply -f -
在不显示证书的情况下验证 ConfigMap 键:
kubectl -n image-registry-system get configmap <trusted-ca-configmap> \
-o jsonpath='{.data.ca-bundle\.crt}' | wc -c
预期结果:
- 对于
ca-bundle.crt,命令返回非零字节数。
修补 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,
"swift": null,
"gcs": null,
"ibmcos": null,
"azure": null,
"s3": {
"bucket": "<bucket-name>",
"region": "<region>",
"regionEndpoint": "https://<s3-endpoint>",
"trustedCA": {
"name": "<trusted-ca-configmap>"
}
}
},
"disableRedirect": true
}
}'
当前 operator 支持以下存储字段:emptyDir、pvc、s3、swift、gcs、
ibmcos 和 azure。请勿配置其他存储字段。
注意:Config CRD 还公开了一个 storage.oss 字段,该字段继承自上游 image
registry operator。此 operator 未实现该字段。将 storage.oss 设置为任何值都会被视为“未配置存储后端”:Operator 会报告原因
为 StorageNotConfigured 的 Degraded=True,并且 Registry 数据平面不会进行调谐。仅使用上面列出的七个受支持字段。
验证配置和发布状态:
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 日志中不显示存储身份验证、存储桶、端点或证书错误。
配置云存储后端
当相应的平台集成和凭证可用时,Operator 可以使用 Swift、GCS、IBM COS 或 Azure 存储。在
Config/cluster.spec.storage 中仅配置一个存储字段;使用上文所示的相同合并补丁模式,并将其他
受支持的存储字段设置为 null。
Provider 集成可以填充地域、项目、账户或端点信息等平台特定值。请与存储
管理员确认所需的 Provider 资源和凭证。配置后端后,按照上述存储流程所示,验证 Config/cluster 条件和 Registry
发布状态。排查问题时请勿打印 Secret 数据。
配置请求处理
使用 Config/cluster.spec.readOnly 拒绝镜像推送和删除。使用 requests 设置限制并发读取和写入、排队请求数以及队列等待时间:
kubectl patch configs.imageregistry.operator.alauda.io cluster \
--type=merge \
-p '{
"spec": {
"readOnly": false,
"requests": {
"read": {
"maxRunning": 100,
"maxInQueue": 500,
"maxWaitInQueue": "30s"
},
"write": {
"maxRunning": 50,
"maxInQueue": 200,
"maxWaitInQueue": "30s"
}
}
}
}'
当集群代理设置不足时,proxy.http、proxy.https 和 proxy.noProxy 字段用于配置 Registry 出站连接。logLevel 接受 Normal、Debug、Trace 或 TraceAll。Config/cluster.spec 还支持资源请求和限制、节点选择、容忍度、亲和性以及拓扑分布。
验证请求处理设置和发布状态:
kubectl get configs.imageregistry.operator.alauda.io cluster -o yaml
kubectl -n image-registry-system rollout status deployment/image-registry --timeout=300s
预期结果:
Config/cluster.spec.readOnly 和 Config/cluster.spec.requests 包含请求的值。
- Registry Deployment 成功完成发布。
配置托管服务账户拉取 Secret
Operator 包含一个托管的 imagePullSecret 控制器。当 Config/cluster 由其管理时,该控制器可以为内部 Registry 创建、注入、刷新和删除服务账户拉取 Secret。
使用其他主机或忽略的命名空间修补 Config/cluster。此补丁中的数组字段会替换当前数组,因此请包含所有必须保留配置的主机和命名空间:
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 包含配置的管理状态、其他主机和忽略的命名空间设置。
控制器会异步协调拉取凭证。在控制器有足够时间完成协调后,验证托管的 RoleBinding 和一个
ServiceAccount:
kubectl -n <workload-namespace> get rolebinding image-registry-system-image-pullers -o yaml
kubectl -n <workload-namespace> get serviceaccount default \
-o jsonpath='{.imagePullSecrets[*].name}{"\n"}'
kubectl -n <workload-namespace> get secret \
-l imageregistry.operator.alauda.io/managed-pull-secret=true -o name
预期结果:
- RoleBinding 将
system:image-puller ClusterRole 授予命名空间中的服务账户。
- 异步协调后,ServiceAccount 至少列出一个托管的拉取 Secret。
- 至少存在一个带有 managed-pull-secret 标签的 Secret。使用
kubectl get secret 仅检查元数据;不要打印或解码凭证数据。
配置镜像限制
在 Registry 中,镜像大小和标签数量限制通过 Kubernetes LimitRange 和 ResourceQuota 对象表示。
创建名为 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
验证清理器资源和渲染后的 CronJob:
kubectl get imagepruners.imageregistry.operator.alauda.io cluster -o yaml
kubectl -n image-registry-system get cronjob image-pruner
预期结果:
ImagePruner/cluster 包含配置的计划和保留策略。
- Operator 在
image-registry-system 中渲染 image-pruner CronJob。
生成的 CronJob 运行 ac adm prune images --confirm。当 Registry 管理状态为
Managed 时,Operator 会添加 --prune-registry=true,因此计划的作业也会在镜像元数据清理后执行 Registry
垃圾回收。对于手动运行的清理,仅当需要回收 blob 时添加
--prune-registry;否则,应将垃圾回收作为单独的经审核操作执行。
有关手动清理和 Registry 垃圾回收命令,请参阅管理访问权限和清理。
操作存储
对于由 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 或对象存储数据。