kubernetesサードパーティストレージの追加(二)


前回はpvを格納するプロセスを紹介しましたが、コンテナにマウントする必要があるストレージがあります.次に、コンテナに格納をマウントする汎用インタフェースfelxが必要です.kubernetesストレージの使用と協力には、それぞれマウントとマウントを実現するインタフェースkubernetesの下にpkg/volume/volumeが必要である.go
type Attacher interface {
    //  
    Attach(spec *Spec, nodeName types.NodeName) (string, error)

    //  
    VolumesAreAttached(specs []*Spec, nodeName types.NodeName) (map[*Spec]bool, error)

    //  
    WaitForAttach(spec *Spec, devicePath string, pod *v1.Pod, timeout time.Duration) (string, error)

    //  
    GetDeviceMountPath(spec *Spec) (string, error)

    //  pod 
    MountDevice(spec *Spec, devicePath string, deviceMountPath string) error
}

次のインタフェース
type Detacher interface {
    //  
    Detach(deviceName string, nodeName types.NodeName) error

    //  pod 
    UnmountDevice(deviceMountPath string) error
}

インタフェースを紹介しました.では、サードパーティのストレージはどのようにドッキングしますか.それはflexvolumeです.サードパーティが格納したバイナリ実行可能ファイルを呼び出すことで、ストレージを使用します.具体的には、そのコードを見てpkg/volume/flexvolume/attacherを実現します.go、これはロードの例です
func (a *flexVolumeAttacher) Attach(spec *volume.Spec, hostName types.NodeName) (string, error) {

    call := a.plugin.NewDriverCall(attachCmd)
    call.AppendSpec(spec, a.plugin.host, nil)
    call.Append(string(hostName))

    status, err := call.Run()
    if isCmdNotSupportedErr(err) {
        return (*attacherDefaults)(a).Attach(spec, hostName)
    } else if err != nil {
        return "", err
    }
    return status.DevicePath, err
}

これはマウントの例です
func (a *flexVolumeAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error {
    // Mount only once.
    alreadyMounted, err := prepareForMount(a.plugin.host.GetMounter(a.plugin.GetPluginName()), deviceMountPath)
    if err != nil {
        return err
    }
    if alreadyMounted {
        return nil
    }

    call := a.plugin.NewDriverCall(mountDeviceCmd)
    call.Append(deviceMountPath)
    call.Append(devicePath)
    call.AppendSpec(spec, a.plugin.host, nil)

    _, err = call.Run()
    if isCmdNotSupportedErr(err) {
        // Devicepath is empty if the plugin does not support attach calls. Ignore mountDevice calls if the
        // plugin does not implement attach interface.
        if devicePath != "" {
            return (*attacherDefaults)(a).MountDevice(spec, devicePath, deviceMountPath, a.plugin.host.GetMounter(a.plugin.GetPluginName()))
        } else {
            return nil
        }
    }
    return err
}

driverに興味があるならpkg/volume/flexvolume/driver-call.goとは、golangのos/execを介してバイナリファイルを呼び出すことです.これにより、我々の第3のストレージは、これらのインタフェースをk 8 sによって呼び出すことができることを実現する.ではkubeletはどうしてあなたのストレージプラグインがそこにあることを知っていますか?答えは-volume-plugin-dirでプラグインを格納する場所を指定します.デフォルトは/usr/libexec/kubernetes/kubelet-plugins/volume/exec/です.あなたのバイナリファイルをこのディレクトリの下に置いて、これはcniの実行と同じです.