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

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

Status: Alpha

Latest release Branch Min CSI Version Max CSI Version Container Image Min K8s Version Max K8s Version Recommended K8s Version
external-resizer v0.2.0 master v1.1.0 - quay.io/k8scsi/csi-resizer:v0.2.0 v1.15 - v1.15
external-resizer v0.1.0 master v1.1.0 - quay.io/k8scsi/csi-resizer:v0.1.0 v1.14 v1.14 v1.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
	}
发布了236 篇原创文章 · 获赞 301 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/zhonglinzhang/article/details/94720298