
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
https://hub.docker.com/r/devopsnirvana/kubernetes-volume-autoscaler https://github.com/DevOps-Nirvana/Kubernetes-Volume-Autoscaler/releases/tag/1.0.6 https://github.com/DevOps-Nirvana/Kubernetes-Volume-Autoscaler/stargazers
本仓库包含一个Kubernetes控制器,当Kubernetes中的持久卷声明(PVC)接近满容量时,它会自动增加其大小。最初基于AWS EKS设计,但应支持任何支持Kubernetes动态卷热调整的Kubernetes集群或云提供商。
将卷保持在最小大小有助于降低成本,但手动扩展卷可能非常繁琐,会浪费DevOps/系统管理员的时间。它通常用于Kubernetes中的存储卷,例如Prometheus、MySQL、Redis、RabbitMQ或任何其他有状态服务。
allowVolumeExpansion == true 的存储类如前所述,您必须拥有支持卷扩展的StorageClass,且所使用的供应器也必须支持卷扩展。理想情况下是“热”卷扩展,这样您的服务无需重启。AWS EKS内置供应器 kubernetes.io/aws-ebs 支持此功能,efs.csi.aws.com CSI驱动也支持。要检查/启用此功能...
bash# 首先,检查您的存储类是否支持卷扩展... $ kubectl get storageclasses NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE standard aws-ebs Delete Immediate false 10d # 如果ALLOWVOLUMEEXPANSION未设置为true,通过补丁启用它 kubectl patch storageclass standard -p '{"allowVolumeExpansion": true}'
注意: 上述StorageClass随EKS提供,但它仅支持gp2,而gp2在很大程度上已被弃用,且比gp3慢得多。强烈建议在使用EKS之前安装AWS EBS CSI驱动,以获得gp3支持以及对Amazon各种存储卷及其生命周期的更具前瞻性的支持。
如果这样做,您可以/应该完全移除GP2支持,安装上述CSI驱动后,创建一个使用新驱动的StorageClass,并默认包含最佳实践...
bash# 为此,只需删除旧的默认StorageClass kubectl delete storageclass standard # 然后应用/创建一个使用您安装的AWS EBS CSI驱动的新默认gp3 kubectl apply -f https://raw.githubusercontent.com/DevOps-Nirvana/Kubernetes-Volume-Autoscaler/master/examples/gp3-default-encrypt-retain-allowExpansion-storageclass.yaml
现在您的集群已有支持扩展的StorageClass,可以安装卷自动扩展器了
bash# 首先,为Helm设置此仓库 helm repo add devops-nirvana https://devops-nirvana.s3.amazonaws.com/helm-charts/ # 安装前示例 - 空运行 + 详细模式,使用自动发现,必须与Prometheus在同一命名空间 # 如果您想查看此脚本“将要”执行的操作,请执行此命令。要查看结果,请在部署后查看此服务的日志 helm upgrade --install volume-autoscaler devops-nirvana/volume-autoscaler \ --namespace REPLACEME_WITH_PROMETHEUS_NAMESPACE \ --set "dry_run=true" \ --set "verbose=true" # 示例安装 1 - 使用自动发现,必须与Prometheus在同一命名空间 helm upgrade --install volume-autoscaler devops-nirvana/volume-autoscaler \ --namespace REPLACEME_WITH_PROMETHEUS_NAMESPACE # 示例 2 - 手动设置Prometheus位置 helm upgrade --install volume-autoscaler devops-nirvana/volume-autoscaler \ --namespace ANYWHERE_DOESNT_MATTER \ --set "prometheus_url=http://prometheus-server.namespace.svc.cluster.local" # 示例 3 - 推荐的最终用法,自动发现并使用Slack通知。注意:查看helm-chart/values.yml以获取其他可全局覆盖的变量 helm upgrade --install volume-autoscaler devops-nirvana/volume-autoscaler \ --namespace REPLACEME_WITH_PROMETHEUS_NAMESPACE \ --set "slack_webhook_url=https://hooks.slack.com/services/123123123/4564564564/789789789789789789" \ --set "slack_channel=my-slack-channel-name"
还有其他各种变量可以像上面那样轻松设置。请参见:https://github.com/DevOps-Nirvana/Kubernetes-Volume-Autoscaler/blob/master/helm-chart/values.yaml#L9 以获取所有可调整此服务的简单值。此外,如果您想调整其他内容(如资源限制、节点选择器、污点/容忍度、添加标签等),请查看该文件的其余部分。
bash# 要更新本地对远程仓库的了解,升级前可能需要执行此操作... helm repo update # 要查看更改将产生的影响(如果更改了内容),这需要helm diff插件 - https://github.com/databus23/helm-diff helm diff upgrade volume-autoscaler --allow-unreleased devops-nirvana/volume-autoscaler \ --namespace infrastructure \ --set "slack_webhook_url=https://hooks.slack.com/services/123123123/4564564564/789789789789789789" \ --set "slack_channel=my-slack-channel-name" \ --set "prometheus_url=http://prometheus-server.infrastructure.svc.cluster.local" # 要删除服务,只需运行... helm uninstall volume-autoscaler
kubectl安装bash# 只要将此安装在与Prometheus相同的命名空间中,这个简单的安装就会起作用 # 此yaml的默认命名空间硬编码为`infrastructure`。如果您想更改命名空间,可以运行以下前几个命令... # 如果您将`infrastructure`用作Prometheus的命名空间,只需... kubectl --namespace infrastructure apply https://devops-nirvana.s3.amazonaws.com/volume-autoscaler/volume-autoscaler-1.0.6.yaml # 或者,如果您需要更改命名空间... # #1: 下载yaml... wget https://devops-nirvana.s3.amazonaws.com/volume-autoscaler/volume-autoscaler-1.0.6.yaml # #1: 或者使用curl下载 curl https://devops-nirvana.s3.amazonaws.com/volume-autoscaler/volume-autoscaler-1.0.6.yaml -o volume-autoscaler-1.0.6.yaml # #2: 然后替换此文件中的命名空间,替换 cat volume-autoscaler-1.0.6.yaml | sed 's/"infrastructure"/"PROMETHEUS_NAMESPACE_HERE"/g' > ./to_be_applied.yaml # #3: 如果您希望有Slack通知,请编辑此to_be_applied.yaml,并在SLACK_WEBHOOK的值行嵌入您的webhook,并相应设置SLACK_CHANNEL # #4: 最后,应用它... kubectl --namespace REPLACEME_WITH_PROMETHEUS_NAMESPACE apply ./to_be_applied.yaml
为确认卷自动扩展器正常工作,此仓库提供了一个示例,您可以将其应用到Kubernetes集群,其中包含一个PVC和一个使用该PVC并不断填充磁盘的Pod。要执行此操作...
bash# 只需在终端上运行此命令 kubectl apply -f https://raw.githubusercontent.com/DevOps-Nirvana/Kubernetes-Volume-Autoscaler/master/examples/simple-pod-with-pvc.yaml # 然后如果您想跟踪,可以“跟踪”卷自动扩展器Pod的日志,观察它检测到磁盘已满并进行扩展。 kubectl get pods | grep -i volume-autoscaler kubectl logs --since=10m --follow volume-autoscaler-pod-goes-here-from-the-above-command-output
1. 卷必须正在使用中(Pod已挂载卷运行)
要使此软件正常工作,它必须知道已使用多少磁盘空间。大多数/所有云提供商都不知道此信息,因此在云提供商的门户上,通常无法看到“磁盘使用率百分比”,除非您在节点中运行特殊服务将此信息发送给提供商https://github.com/DevOps-Nirvana/aws-missing-tools/tree/master/aws-push-cloudwatch-instance-metrics%E3%80%82%E5%9B%A0%E6%AD%A4%EF%BC%8C%E9%99%A4%E9%9D%9E%E6%82%A8%E6%AD%A3%E5%9C%A8%E7%A7%AF%E6%9E%81%E4%BD%BF%E7%94%A8%E7%A3%81%E7%9B%98%EF%BC%8C%E5%90%A6%E5%88%99%E5%A6%82%E6%9E%9C%E6%B2%A1%E6%9C%89%E8%BF%90%E8%A1%8C%E5%B7%B2%E6%8C%82%E8%BD%BD%E6%AD%A4%E5%8D%B7%E7%9A%84Pod%EF%BC%8CPrometheus%E4%B8%8D%E7%9F%A5%E9%81%93%E7%A3%81%E7%9B%98%E6%9C%89%E5%A4%9A%E6%BB%A1%EF%BC%8C%E5%A6%82%E6%9E%9CPrometheus%E4%B8%8D%E7%9F%A5%E9%81%93%EF%BC%8C%E6%88%91%E4%BB%AC%E4%B9%9F%E4%B8%8D%E7%9F%A5%E9%81%93%E3%80%82
2. 必须等待上次调整大小后足够长的时间
此外,由于云提供商不允许您不断调整磁盘大小,您必须等待两次调整之间所需的时间。在AWS上,这是6小时,一旦此服务执行过一次,日志中会显示以下警告。
此控制器还支持通过注释为每个PVC调整卷自动扩展器配置。支持的注释如下...
yamlapiVersion: v1 kind: PersistentVolumeClaim metadata: name: sample-volume-claim annotations: # 当磁盘使用率达到此百分比(100分制)以上时触发扩展 volume.autoscaler.kubernetes.io/scale-above-percent: "80" # 默认值为80 # 磁盘使用率连续多少个周期超过scale-above-percent后触发自动扩展操作 volume.autoscaler.kubernetes.io/scale-after-intervals: "5" # 默认值为5 # 磁盘扩展的百分比,基于当前大小 # 例如:如果设置为"10"且磁盘为100GB,则扩展到110GB # 在磁盘较大时,您可能希望在PVC上设置为"5"或"10" volume.autoscaler.kubernetes.io/scale-up-percent: "20" # 默认值为20(百分比) # 最小扩展增量,单位为字节。这在磁盘非常小时很有帮助,并有助于达到每个提供商的最小增量值(AWS为1GB) volume.autoscaler.kubernetes.io/scale-up-min-increment: "1000000000" # 默认1GB(字节) # 最大扩展增量,单位为字节。这在磁盘非常大时很有帮助,防止一次扩展过多 # 可以替代scale-up-percent或与其一起使用 volume.autoscaler.kubernetes.io/scale-up-max-increment: "" # 默认未设置(字节) # 此工具允许扩展的最大磁盘大小,默认设置为16TB,因为这是AWS EBS的限制 volume.autoscaler.kubernetes.io/scale-up-max-size: "16000000000000" # 默认16TB(字节) # 再次扩展此卷前必须等待的时间(秒)。对于AWS EBS,这是6小时(21600秒),为了保险起见,我们额外增加10分钟,即22200秒 volume.autoscaler.kubernetes.io/scale-cooldown-time: "22200" # 如果希望自动扩展器完全忽略此PVC,设置为"true" volume.autoscaler.kubernetes.io/ignore: "false" # 最后,不要设置此注释,如果看到请忽略,这是卷自动扩展器保存其“状态”的方式 volume.autoscaler.kubernetes.io/last-resized-at: "123123123" # 这将是Unix时间戳 spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: standard
此控制器还支持自动发布Prometheus指标。它在端口8000上托管一个简单的HTTP服务器,并发布以下指标
| 指标名称 | 类型 | 描述 |
|---|---|---|
| volume_autoscaler_resize_evaluated_total | 计数器 | 每次评估PVC调整大小时增加 |
| volume_autoscaler_resize_attempted_total | 计数器 | 每次尝试调整大小时增加 |
| volume_autoscaler_resize_successful_total | 计数器 | 每次成功调整大小时增加 |
| volume_autoscaler_resize_failure_total | 计数器 | 每次调整大小失败时增加 |
| volume_autoscaler_num_valid_pvcs | gauge | 检测到的有效PVC数量 |
| volume_autoscaler_num_pvcs_above_threshold | gauge | 检测到的超过期望百分比阈值的PVC数量 |
| volume_autoscaler_num_pvcs_below_threshold | gauge | 检测到的低于期望百分比阈值的PVC数量 |
| volume_autoscaler_release_info | info | 此卷自动扩展器服务的版本信息(在标签中) |
| volume_autoscaler_settings_info | info | 此服务当前使用的设置(在标签中) |
次要文本修改、语法等(感谢@anthea-w) 实现victoriametrics模式 (#8)(感谢@martin31821) 将基础Docker镜像升级到python:3.9.16-alpine3.17 (#5)(感谢@sindvero / @abenoist) 修改Helm图表以添加Linux节点选择器,因为仅支持Linux 增加至少Kubernetes 1.25的兼容性(已测试) 修复一个致命错误
更好地处理低最大磁盘大小的边缘情况(感谢@GuillaumeOuint) 大幅改进人类可读的调试输出
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。


来自真实用户的反馈,见证轩辕镜像的优质服务