【kubernetes/k8s源码分析】 kubernetes csi external-resizer 源码分析

本文深入探讨了CSI(容器存储接口)外部调整器的工作原理,包括其如何通过GRPC连接与CSI驱动通信,检查插件是否支持控制器服务及卷调整功能,以及在不同情况下选择控制器或节点调整的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Git Repository: https://github.com/kubernetes-csi/external-resizer

Status: Alpha

Latest releaseBranchMin CSI VersionMax CSI VersionContainer ImageMin K8s VersionMax K8s VersionRecommended K8s Version
external-resizer v0.2.0masterv1.1.0-quay.io/k8scsi/csi-resizer:v0.2.0v1.15-v1.15
external-resizer v0.1.0masterv1.1.0-quay.io/k8scsi/csi-resizer:v0.1.0v1.14v1.14v1.14

 

默认命令行

    /csi-resizer --v=5 --csi-address=/var/lib/csi/sockets/pluginproxy/mock.socket 

 

1. NewResizer 函数

    csi.New 建立GRPC 连接

// NewResizer creates a new resizer responsible for resizing CSI volumes.
func NewResizer(
	address string,
	timeout time.Duration,
	k8sClient kubernetes.Interface,
	informerFactory informers.SharedInformerFactory) (Resizer, error) {
	csiClient, err := csi.New(address, timeout)
	if err != nil {
		return nil, err
	}
	return NewResizerFromClient(csiClient, timeout, k8sClient, informerFactory)
}

   1.1 NewResizerFromClient 函数

func NewResizerFromClient(
	csiClient csi.Client,
	timeout time.Duration,
	k8sClient kubernetes.Interface,
	informerFactory informers.SharedInformerFactory) (Resizer, error) {
	driverName, err := getDriverName(csiClient, timeout)
	if err != nil {
		return nil, fmt.Errorf("get driver name failed: %v", err)
	}

    1.1.1 插件是否支持 controller service

      是否 controller 设置能力 PluginCapability_Service_CONTROLLER_SERVICE

supportControllerService, err := supportsPluginControllerService(csiClient, timeout)
if err != nil {
	return nil, fmt.Errorf("failed to check if plugin supports controller service: %v", err)
}

if !supportControllerService {
	return nil, controllerServiceNotSupportErr
}

    1.1.2 controller 是否有能力 resize

    主要时插件是否设置了能力 ControllerServiceCapability_RPC_EXPAND_VOLUME

    如果 contoller 没有设置能力,试试看 node 是否设置了能力

	supportControllerResize, err := supportsControllerResize(csiClient, timeout)
	if err != nil {
		return nil, fmt.Errorf("failed to check if plugin supports controller resize: %v", err)
	}

	if !supportControllerResize {
		supportsNodeResize, err := supportsNodeResize(csiClient, timeout)
		if err != nil {
			return nil, fmt.Errorf("failed to check if plugin supports node resize: %v", err)
		}
		if supportsNodeResize {
			klog.Info("The CSI driver supports node resize only, using trivial resizer to handle resize requests")
			return newTrivialResizer(driverName), nil
		}
		return nil, resizeNotSupportErr
	}

 

<think>嗯,用户现在的问题是想要把一组Kubernetes CSI(容器存储接口)相关的镜像从公共仓库下载下来,然后上传到自己的私有镜像仓库。他们给出的例子都是来自registry.k8s.io的镜像,比如ROOK_CSI_REGISTRAR_IMAGE等。用户之前已经讨论过如何在单个仓库下通过标签管理多个镜像,所以这次可能需要更具体的步骤,特别是针对这些CSI组件的操作。 首先,我需要确认用户对Docker的基本操作是否熟悉,比如docker pull、docker tag、docker push这些命令。不过从用户的问题来看,他们可能已经有一定的基础,但需要明确的步骤指导。接下来,用户可能需要知道如何批量处理这些镜像,因为手动一个个处理会比较麻烦,特别是当有多个镜像的时候。 用户提到的镜像都是Kubernetes SIG-Storage维护的,这些镜像在部署Rook或者其他存储解决方案时可能会用到。用户可能是在内网环境或者需要符合公司的镜像管理策略,所以必须将这些镜像转移到私有仓库。另外,用户可能在使用阿里云的容器镜像服务,因为之前的对话中提到过阿里云的CR(容器镜像服务)地址,所以可能需要适配对应的登录和推送流程。 需要注意的点包括:如何正确地进行镜像的重命名和标签管理,避免标签冲突;确保私有仓库的地址正确,并且用户有权限进行推送;另外,如果镜像较多,可以考虑编写脚本自动化处理,以提高效率并减少出错的可能。同时,用户可能需要了解如何验证镜像是否成功上传,以及后续如何在Kubernetes的部署文件中替换这些镜像的地址。 另外,用户可能关心的是如何保持这些镜像的版本更新,是否需要定期同步,或者是否有办法自动化这一过程。但当前的问题可能主要集中在如何一次性迁移现有的镜像,所以暂时不需要深入讨论持续集成的问题。 总结下来,回答的结构应该包括具体的步骤:下载镜像、重新打标签、登录私有仓库、推送镜像,以及验证和使用。同时,提供批量处理的脚本示例会很有帮助,特别是处理多个镜像的情况。最后,注意事项部分需要强调标签命名的规范性,以及可能的网络问题或权限问题。</think>### 一、操作步骤 #### 1. 下载官方镜像 ```bash docker pull registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.11.1 docker pull registry.k8s.io/sig-storage/csi-resizer:v1.11.1 docker pull registry.k8s.io/sig-storage/csi-provisioner:v5.0.1 docker pull registry.k8s.io/sig-storage/csi-snapshotter:v8.0.1 docker pull registry.k8s.io/sig-storage/csi-attacher:v4.6.1 ``` #### 2. 重命名镜像(以阿里云CR为例) ```bash # 格式: docker tag [原镜像名] [私有仓库地址]/[命名空间]/[仓库名]:[自定义标签] # 实际命令: docker tag registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.11.1 \ crpi-wciq3q7jwigeugs7.cn-shanghai.personal.cr.aliyuncs.com/your-namespace/rook-csi:csi-node-driver-registrar-v2.11.1 docker tag registry.k8s.io/sig-storage/csi-resizer:v1.11.1 \ crpi-wciq3q7jwigeugs7.cn-shanghai.personal.cr.aliyuncs.com/your-namespace/rook-csi:csi-resizer-v1.11.1 ``` #### 3. 登录私有仓库 ```bash docker login --username=your_username crpi-wciq3q7jwigeugs7.cn-shanghai.personal.cr.aliyuncs.com ``` #### 4. 推送镜像 ```bash docker push crpi-wciq3q7jwigeugs7.cn-shanghai.personal.cr.aliyuncs.com/your-namespace/rook-csi:csi-node-driver-registrar-v2.11.1 docker push crpi-wciq3q7jwigeugs7.cn-shanghai.personal.cr.aliyuncs.com/your-namespace/rook-csi:csi-resizer-v1.11.1 ``` --- ### 二、批量处理脚本(Shell示例) ```bash #!/bin/bash REGISTRY="crpi-wciq3q7jwigeugs7.cn-shanghai.personal.cr.aliyuncs.com" NAMESPACE="your-namespace" REPO="rook-csi" IMAGES=( "sig-storage/csi-node-driver-registrar:v2.11.1" "sig-storage/csi-resizer:v1.11.1" "sig-storage/csi-provisioner:v5.0.1" "sig-storage/csi-snapshotter:v8.0.1" "sig-storage/csi-attacher:v4.6.1" ) for img in "${IMAGES[@]}"; do # 提取组件名称 component=$(echo $img | cut -d'/' -f2 | cut -d':' -f1) # 原镜像地址 src="registry.k8s.io/${img}" # 新标签 tag="${component}-$(echo $img | cut -d':' -f2)" docker pull $src docker tag $src "$REGISTRY/$NAMESPACE/$REPO:$tag" docker push "$REGISTRY/$NAMESPACE/$REPO:$tag" done ``` --- ### 三、配置文件修改示例 原配置: ```yaml # ROOK_CSI_REGISTRAR_IMAGE: "registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.11.1" ``` 修改后: ```yaml ROOK_CSI_REGISTRAR_IMAGE: "crpi-wciq3q7jwigeugs7.cn-shanghai.personal.cr.aliyuncs.com/your-namespace/rook-csi:csi-node-driver-registrar-v2.11.1" ``` --- ### 四、注意事项 1. **标签命名规范**建议: - 保留原始组件名称(如 `csi-node-driver-registrar`) - 追加版本号(`v2.11.1`) - 使用连字符连接(不要用下划线) 2. **镜像层级验证**: ```bash docker inspect --format='{{.RepoTags}} {{.RootFS.Layers}}' [镜像ID] ``` 3. **阿里云CR限制**: - 单镜像最多1000个标签 - 推送频率限制:100次/分钟 4. **版本同步**:当上游镜像更新时,需重新执行下载-重传流程 --- ### 五、替代方案 若需长期维护,建议使用以下工具: 1. **Harbor镜像同步**:配置registry仓库同步策略 2. **Skopeo工具**:直接跨仓库复制 ```bash skopeo copy docker://registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.11.1 \ docker://crpi-wciq3q7jwigeugs7.cn-shanghai.personal.cr.aliyuncs.com/your-namespace/rook-csi:csi-node-driver-registrar-v2.11.1 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值