kubernetes ceph-csi分析目录导航
当ceph-csi组件启动时指定的driver type为rbd时,会启动rbd driver相关的服务。然后再根据controllerserver
、nodeserver
的参数配置,决定启动ControllerServer
与IdentityServer
,或NodeServer
与IdentityServer
。
https://github.com/ceph/ceph-csi/releases/tag/v3.0.0
rbd driver分析将分为4个部分,分别是服务入口分析、controllerserver分析、nodeserver分析与IdentityServer分析。
这节进行IdentityServer分析,IdentityServer主要包括了GetPluginInfo(获取driver信息)、Probe(探测接口)、GetPluginCapabilities(获取driver能力)三个方法,将一一进行分析。
GetPluginInfo主要用于获取该ceph-csi driver的信息,如driver名称、版本等。
GetPluginInfo returns plugin information.
// internal/csi-common/identityserver-default.go // GetPluginInfo returns plugin information. func (ids *DefaultIdentityServer) GetPluginInfo(ctx context.Context, req *csi.GetPluginInfoRequest) (*csi.GetPluginInfoResponse, error) { util.TraceLog(ctx, "Using default GetPluginInfo") if ids.Driver.name == "" { return nil, status.Error(codes.Unavailable, "Driver name not configured") } if ids.Driver.version == "" { return nil, status.Error(codes.Unavailable, "Driver is missing version") } return &csi.GetPluginInfoResponse{ Name: ids.Driver.name, VendorVersion: ids.Driver.version, }, nil }
Probe是一个探测接口,用于探测该driver是否启动/存活。
Probe returns empty response.
Probe方法由liveness driver调用,liveness driver定时调用该方法,探测csi driver的存活,然后统计到prometheus metrics中。(liveness driver的相关代码相对简单,不再单独展开分析)
liveness driver调用Probe的有关代码位于internal/liveness/liveness.go-getLiveness()
。
// internal/csi-common/identityserver-default.go // Probe returns empty response. func (ids *DefaultIdentityServer) Probe(ctx context.Context, req *csi.ProbeRequest) (*csi.ProbeResponse, error) { return &csi.ProbeResponse{}, nil }
被sidecar容器liveness调用,探测csi组件健康存活情况。
GetPluginCapabilities用于获取driver的能力。
GetPluginCapabilities returns available capabilities of the rbd driver.
// internal/rbd/identityserver.go // GetPluginCapabilities returns available capabilities of the rbd driver. func (is *IdentityServer) GetPluginCapabilities(ctx context.Context, req *csi.GetPluginCapabilitiesRequest) (*csi.GetPluginCapabilitiesResponse, error) { return &csi.GetPluginCapabilitiesResponse{ Capabilities: []*csi.PluginCapability{ { Type: &csi.PluginCapability_Service_{ Service: &csi.PluginCapability_Service{ Type: csi.PluginCapability_Service_CONTROLLER_SERVICE, }, }, }, { Type: &csi.PluginCapability_VolumeExpansion_{ VolumeExpansion: &csi.PluginCapability_VolumeExpansion{ Type: csi.PluginCapability_VolumeExpansion_ONLINE, }, }, }, { Type: &csi.PluginCapability_Service_{ Service: &csi.PluginCapability_Service{ Type: csi.PluginCapability_Service_VOLUME_ACCESSIBILITY_CONSTRAINTS, }, }, }, }, }, nil }
这节分析了GetPluginInfo
、Probe
、GetPluginCapabilities
方法,作用分别如下: