kubernetesサードパーティストレージの追加(二)
6484 ワード
前回はpvを格納するプロセスを紹介しましたが、コンテナにマウントする必要があるストレージがあります.次に、コンテナに格納をマウントする汎用インタフェースfelxが必要です.kubernetesストレージの使用と協力には、それぞれマウントとマウントを実現するインタフェースkubernetesの下にpkg/volume/volumeが必要である.go
次のインタフェース
インタフェースを紹介しました.では、サードパーティのストレージはどのようにドッキングしますか.それはflexvolumeです.サードパーティが格納したバイナリ実行可能ファイルを呼び出すことで、ストレージを使用します.具体的には、そのコードを見てpkg/volume/flexvolume/attacherを実現します.go、これはロードの例です
これはマウントの例です
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の実行と同じです.
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の実行と同じです.