{"id":38641,"date":"2020-11-13T12:37:22","date_gmt":"2020-11-13T03:37:22","guid":{"rendered":"https:\/\/www.creationline.com\/?p=38641"},"modified":"2021-07-09T20:30:49","modified_gmt":"2021-07-09T11:30:49","slug":"pod%e3%81%abnfs%e3%81%8cmount%e3%81%95%e3%82%8c%e3%82%8b%e3%81%be%e3%81%a7-kubernetes-%e3%82%b3%e3%83%bc%e3%83%89%e3%83%aa%e3%83%bc%e3%83%87%e3%82%a3%e3%83%b3%e3%82%b0","status":"publish","type":"post","link":"https:\/\/www.creationline.com\/tech-blog\/cloudnative\/docker\/38641","title":{"rendered":"pod\u306bNFS\u304cmount\u3055\u308c\u308b\u307e\u3067 #kubernetes #\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0"},"content":{"rendered":"<p>\u5148\u65e5\u3001Kubernetes\u306ePersistentVolume\u304b\u3089NFS\u3092\u5229\u7528\u3059\u308b\u5834\u5408\u306e\u6319\u52d5\u306b\u3064\u3044\u3066\u8abf\u67fb\u3059\u308b\u6a5f\u4f1a\u304c\u3042\u308a\u307e\u3057\u305f\u3002<br \/>\n\u8abf\u67fb\u306b\u3042\u305f\u3063\u3066Kubernetes\u306e\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0\u3092\u884c\u3044\u307e\u3057\u305f\u306e\u3067\u3001\u5185\u5bb9\u3092\u3053\u3061\u3089\u3067\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n<p>\u8abf\u67fb\u3057\u305f\u3044\u30c6\u30fc\u30de\u306f\u4e0b\u8a18\u306e\u3082\u306e\u3067\u3059\u3002<\/p>\n<ul>\n<li>Persistent Volume\u304b\u3089NFS\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u30de\u30a6\u30f3\u30c8\u3059\u308b\u969b\u306b\u3001\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u6307\u5b9a\u3055\u308c\u308b\u30de\u30a6\u30f3\u30c8\u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u5b58\u5728\u3059\u308b\u304b\uff1f<\/li>\n<\/ul>\n<p>\u4e00\u822c\u7684\u306aLinux\u30b5\u30fc\u30d0\u3067NFS\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u30de\u30a6\u30f3\u30c8\u3059\u308b\u969b\u306b\u306fmount\u30b3\u30de\u30f3\u30c9\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u6307\u5b9a\u3057\u3066\u3044\u307e\u3059\u304c\u3001kubernetes\u3067\u30de\u30a6\u30f3\u30c8\u3059\u308b\u5834\u5408\u306f\u3069\u3046\u306a\u308b\u306e\u304b\uff1f\u3068\u3044\u3046\u7591\u554f\u3067\u3059\u3002<\/p>\n<h1>\u6319\u52d5<\/h1>\n<p>\u307e\u305a\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092\u8aad\u3080\u524d\u306b\u6319\u52d5\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<br \/>\n\u5b9f\u969b\u306bPod\u306bPV,PVC\u3092\u4ecb\u3057\u3066NFS\u3092\u30de\u30a6\u30f3\u30c8\u3057\u305f\u969b\u306b\u3001Pod\u304c\u5b58\u5728\u3059\u308bNode\u4e0a\u3067 \/proc\/mounts \u3092\u898b\u3066\u307f\u307e\u3059\u3002<\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">\nroot@vanilla:~# cat \/proc\/mounts | grep 10.99.99.40\n10.99.99.40:\/srv\/hoge \/\/var\/lib\/kubelet\/pods\/704a1f4c-5634-4b66-8833-9d381adcac92\/volumes\/kubernetes.io~nfs\/pv0001 nfs4 \nrw,relatime,vers=4.2,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,\nretrans=2,sec=sys,clientaddr=10.99.99.42,local_lock=none,addr=10.99.99.40 0 0\n<\/pre>\n<p>(\u898b\u3084\u3059\u3055\u306e\u305f\u3081\u3001\u6539\u884c\u3092\u5165\u308c\u3066\u3044\u307e\u3059)<\/p>\n<p>10.99.99.40:\/srv\/hoge \u304c\u4eca\u56de\u30de\u30a6\u30f3\u30c8\u3057\u3066\u3044\u308bNFS\u30b5\u30fc\u30d0\u3067\u3059\u3002pod\u306evolume\u9818\u57df\u306b\u30de\u30a6\u30f3\u30c8\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u304c\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002\u7279\u306b\u5909\u308f\u3063\u305f\u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u898b\u5f53\u305f\u308a\u307e\u305b\u3093\u3002mount\u30b3\u30de\u30f3\u30c9\u3092\u30aa\u30d7\u30b7\u30e7\u30f3\u7121\u3057\u3067\u5b9f\u884c\u3057\u305f\u5834\u5408\u3068\u540c\u3058\u72b6\u614b\u306b\u898b\u3048\u307e\u3059\u3002\u3075\u3080\u3002<\/p>\n<p>\u3061\u306a\u307f\u306b\u3001\u30b3\u30f3\u30c6\u30ca\u306e\u4e2d\u304b\u3089\u5b9f\u884c\u3057\u3066\u3082\u540c\u3058\u3067\u3059\u3002\u552f\u4e00\u306e\u9055\u3044\u306f\u3001mount\u5148\u304c \/opt \u306b\u898b\u3048\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">\n10.99.99.40:\/srv\/hoge \/opt nfs4 \nrw,relatime,vers=4.2,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,\nretrans=2,sec=sys,clientaddr=10.99.99.42,local_lock=none,addr=10.99.99.40 0 0\n<\/pre>\n<\/p>\n<p>\u3053\u306e\/var\/lib\/kubelet\/pods\/~ \u3068 \/opt\u306f\u3001docker\u306b\u3088\u3063\u3066\u30ed\u30fc\u30ab\u30eb\u3067\u30d0\u30a4\u30f3\u30c9\u30de\u30a6\u30f3\u30c8\u3055\u308c\u3066\u308b\u3053\u3068\u304c\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002<\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">\nroot@vanilla:~# docker container inspect cddf9c510f43\n[\n    {\n        &quot;Id&quot;: &quot;cddf9c510f430df7f9300c6d0f93fbed2f81a8bad130bda7cdf7a65a25b4617e&quot;,\n        &quot;Created&quot;: &quot;2020-11-12T07:12:33.297648697Z&quot;,\n...\n        &quot;Mounts&quot;: [\n            {\n                &quot;Type&quot;: &quot;bind&quot;,\n                &quot;Source&quot;: &quot;\/var\/lib\/kubelet\/pods\/704a1f4c-5634-4b66-8833-9d381adcac92\/volumes\/kubernetes.io~nfs\/pv0001&quot;,\n                &quot;Destination&quot;: &quot;\/opt&quot;,\n                &quot;Mode&quot;: &quot;&quot;,\n                &quot;RW&quot;: true,\n                &quot;Propagation&quot;: &quot;rprivate&quot;\n            },\n...\n<\/pre>\n<\/p>\n<p>\u3068\u3044\u3046\u3053\u3068\u3067\u3001\/var\/lib\/kubelet\/pods\/~ \u306b\u3069\u3046NFS\u30dc\u30ea\u30e5\u30fc\u30e0\u304c\u30de\u30a6\u30f3\u30c8\u3055\u308c\u3066\u3044\u308b\u304b\u3092\u30b3\u30fc\u30c9\u304b\u3089\u78ba\u8a8d\u3059\u308c\u3070\u3088\u3055\u305d\u3046\u3067\u3059\u3002\u4ed6\u306e\u30b3\u30f3\u30c6\u30ca\u30e9\u30f3\u30bf\u30a4\u30e0\u3060\u3068\u3069\u3046\u306a\u3063\u3066\u3044\u308b\u304b\u306f\u3061\u3087\u3063\u3068\u6c17\u306b\u306a\u308a\u307e\u3059\u304c\u3002<\/p>\n<h1>\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0<\/h1>\n<p>\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u304b\u3089\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3059\u3002\u672c\u8a18\u4e8b\u3067\u306fNode\u306fLinux\u3001\u30d0\u30fc\u30b8\u30e7\u30f3\u306f1.19.3\u3068\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<h3>reconcile\u304b\u3089mount\u51e6\u7406\u307e\u3067<\/h3>\n<p>kubernetes\u3067Pod\u306bNFS\u3092mount\u3059\u308b\u5f79\u5272\u306fkubelet\u304c\u62c5\u3044\u307e\u3059\u3002\u305d\u306e\u4e2d\u3067\u3082\u3001\u7279\u306bvolume\u306eattach\/detach\u3092\u62c5\u3046\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u304cvolumemanager\u3068\u3044\u3046\u3082\u306e\u3067\u3059\u3002\u3055\u3066\u3001volumemanager\u306ereconcile loop\u306e\u4e2d\u3092\u63a2\u3059\u3068\u3001mountAttachVolumes\u306a\u308b\u95a2\u6570\u304c\u547c\u3070\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/kubelet\/volumemanager\/reconciler\/reconciler.go#L174\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/kubelet\/volumemanager\/reconciler\/reconciler.go#L174<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\nfunc (rc *reconciler) reconcile() {\n    \/\/ Unmounts are triggered before mounts so that a volume that was\n    \/\/ referenced by a pod that was deleted and is now referenced by another\n    \/\/ pod is unmounted from the first pod before being mounted to the new\n    \/\/ pod.\n    rc.unmountVolumes()\n\u3000\n    \/\/ Next we mount required volumes. This function could also trigger\n    \/\/ attach if kubelet is responsible for attaching volumes.\n    \/\/ If underlying PVC was resized while in-use then this function also handles volume\n    \/\/ resizing.\n    rc.mountAttachVolumes()\n\u3000\n    \/\/ Ensure devices that should be detached\/unmounted are detached\/unmounted.\n    rc.unmountDetachDevices()\n}\n<\/pre>\n<\/p>\n<p>mountAttachVolumes\u306e\u4e2d\u3067\u3044\u304f\u3064\u304b\u51e6\u7406\u306e\u5206\u5c90\u304c\u3042\u308a\u307e\u3059\u304c\u3001NFS\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u65b0\u305f\u306b\u30de\u30a6\u30f3\u30c8\u3059\u308b\u5834\u5408\u306b\u306frc.operationExecutor.MountVolume\u3067mount\u304c\u958b\u59cb\u3055\u308c\u307e\u3059\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/kubelet\/volumemanager\/reconciler\/reconciler.go#L255\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/kubelet\/volumemanager\/reconciler\/reconciler.go#L255<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\nfunc (rc *reconciler) mountAttachVolumes() {\n    \/\/ Ensure volumes that should be attached\/mounted are attached\/mounted.\n    for _, volumeToMount := range rc.desiredStateOfWorld.GetVolumesToMount() {\n        volMounted, devicePath, err := rc.actualStateOfWorld.PodExistsInVolume(volumeToMount.PodName, volumeToMount.VolumeName)\n        volumeToMount.DevicePath = devicePath\n        if cache.IsVolumeNotAttachedError(err) {\n\u3000\n            \/\/...\n\u3000\n        } else if !volMounted || cache.IsRemountRequiredError(err) {\n            \/\/ Volume is not mounted, or is already mounted, but requires remounting\n            remountingLogStr := &quot;&quot;\n            isRemount := cache.IsRemountRequiredError(err)\n            if isRemount {\n                remountingLogStr = &quot;Volume is already mounted to pod, but remount was requested.&quot;\n            }\n            klog.V(4).Infof(volumeToMount.GenerateMsgDetailed(&quot;Starting operationExecutor.MountVolume&quot;, remountingLogStr))\n            err := rc.operationExecutor.MountVolume(\n                rc.waitForAttachTimeout,\n                volumeToMount.VolumeToMount,\n                rc.actualStateOfWorld,\n                isRemount)\n<\/pre>\n<\/p>\n<p>\u51e6\u7406\u306foperationExecutor\u306b\u79fb\u8b72\u3055\u308c\u307e\u3059\u3002operationExecutor.MountVolume\u3067\u306f\u3001\u307e\u305aGenerateMountVolumeFunc\u3068\u3044\u3046\u95a2\u6570\u3067mount\u3059\u308b\u305f\u3081\u306eGeneratedOperations\u3068\u3044\u3046\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002GeneratedOperations\u306f\u95a2\u6570\u3092\u542b\u3093\u3060\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3067\u3059\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/util\/operationexecutor\/operation_executor.go#L811-L823\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/util\/operationexecutor\/operation_executor.go#L811-L823<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\nfunc (oe *operationExecutor) MountVolume(\n    waitForAttachTimeout time.Duration,\n    volumeToMount VolumeToMount,\n    actualStateOfWorld ActualStateOfWorldMounterUpdater,\n    isRemount bool) error {\n    fsVolume, err := util.CheckVolumeModeFilesystem(volumeToMount.VolumeSpec)\n    if err != nil {\n        return err\n    }\n    var generatedOperations volumetypes.GeneratedOperations\n    if fsVolume {\n        \/\/ Filesystem volume case\n        \/\/ Mount\/remount a volume when a volume is attached\n        generatedOperations = oe.operationGenerator.GenerateMountVolumeFunc(\n            waitForAttachTimeout, volumeToMount, actualStateOfWorld, isRemount)\n\u3000\n    } else {\n        \/\/ Block volume case\n        \/\/ Creates a map to device if a volume is attached\n        generatedOperations, err = oe.operationGenerator.GenerateMapVolumeFunc(\n            waitForAttachTimeout, volumeToMount, actualStateOfWorld)\n    }\n<\/pre>\n<\/p>\n<p>\u4f5c\u6210\u3057\u305fOperation\u3092\u3053\u3053\u3067\u5b9f\u884c\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/util\/operationexecutor\/operation_executor.go#L839-L840\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/util\/operationexecutor\/operation_executor.go#L839-L840<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\n    return oe.pendingOperations.Run(\n        volumeToMount.VolumeName, podName, &quot;&quot; \/* nodeName *\/, generatedOperations)\n<\/pre>\n<\/p>\n<p>\u3067\u306f\u3001GeneratedOperations\u306b\u542b\u307e\u308c\u308b\u95a2\u6570\u306e\u4e2d\u3092\u898b\u3066\u307f\u307e\u3059\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/util\/operationexecutor\/operation_generator.go#L489\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/util\/operationexecutor\/operation_generator.go#L489<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\nfunc (og *operationGenerator) GenerateMountVolumeFunc(\n    waitForAttachTimeout time.Duration,\n    volumeToMount VolumeToMount,\n    actualStateOfWorld ActualStateOfWorldMounterUpdater,\n    isRemount bool) volumetypes.GeneratedOperations {\n<\/pre>\n<\/p>\n<p>\u751f\u6210\u3055\u308c\u308b\u95a2\u6570\u3067\u3042\u308bmountVolumeFunc\u306e\u4e2d\u3067\u306f\u3001\u307e\u305avolumePlugin\u3092spec\u304b\u3089\u53d6\u5f97\u3057\u3066\u3044\u307e\u3059\u3002spec\u306fyaml\u30d5\u30a1\u30a4\u30eb\u306b\u3088\u304f\u51fa\u3066\u304f\u308b\u3042\u306espec\u3067\u3059\u306d\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/util\/operationexecutor\/operation_generator.go#L504\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/util\/operationexecutor\/operation_generator.go#L504<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\n    mountVolumeFunc := func() (error, error) {\n        \/\/ Get mounter plugin\n        volumePlugin, err := og.volumePluginMgr.FindPluginBySpec(volumeToMount.VolumeSpec)\n        if err != nil || volumePlugin == nil {\n            return volumeToMount.GenerateError(&quot;MountVolume.FindPluginBySpec failed&quot;, err)\n        }\n<\/pre>\n<\/p>\n<p>\u305d\u306e\u3042\u3068\u3001volumePlugin\u304b\u3089volumeMounter\u3092\u751f\u6210\u3057\u3001<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/util\/operationexecutor\/operation_generator.go#L514-L517\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/util\/operationexecutor\/operation_generator.go#L514-L517<\/a><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\n        volumeMounter, newMounterErr := volumePlugin.NewMounter(\n            volumeToMount.VolumeSpec,\n            volumeToMount.Pod,\n            volume.VolumeOptions{})\n<\/pre>\n<\/p>\n<p>\u3044\u304f\u3064\u304b\u306evalidation\u3092\u7d4c\u3066\u3001\u3053\u3053\u3067\u30de\u30a6\u30f3\u30c8\u304c\u5b9f\u884c\u3055\u308c\u307e\u3059\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/util\/operationexecutor\/operation_generator.go#L634-L639\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/util\/operationexecutor\/operation_generator.go#L634-L639<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\n        \/\/ Execute mount\n        mountErr := volumeMounter.SetUp(volume.MounterArgs{\n            FsUser:              ioutil.FsUserFrom(volumeToMount.Pod),\n            FsGroup:             fsGroup,\n            DesiredSize:         volumeToMount.DesiredSizeLimit,\n            FSGroupChangePolicy: fsGroupChangePolicy,\n        })\n<\/pre>\n<\/p>\n<p>\u3068\u3044\u3046\u3053\u3068\u3067\u3001\u30de\u30a6\u30f3\u30c8\u306e\u5b9f\u884c\u51e6\u7406\u306fvolumePlugin\u3068\u3001volumePlugin\u304b\u3089\u751f\u6210\u3055\u308c\u308bvolumeMounter\u306b\u79fb\u8b72\u3057\u3066\u3044\u308b\u3088\u3046\u3067\u3059\u3002\u3067\u306f\u3001\u4eca\u5ea6\u306f\u3053\u306evolumePlugin\u3092\u8ffd\u3044\u304b\u3051\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<h3>volumePlugin\u3092\u53d6\u5f97\u3059\u308b<\/h3>\n<p>volumePlugin\u3092\u53d6\u5f97\u3057\u3066\u3044\u308bFindPluginBySpec\u306e\u51e6\u7406\u3092\u307e\u305a\u78ba\u8a8d\u3057\u307e\u3059\u3002<br \/>\n\u3069\u3046\u3082\u3001volumePluginMgr\u306b\u683c\u7d0d\u3055\u308c\u3066\u3044\u308bvolumePlugin\u304b\u3089\u30de\u30c3\u30c1\u3059\u308b\u3082\u306e\u3092\u63a2\u3057\u3066\u3044\u308b\u3088\u3046\u3067\u3059\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/plugins.go#L654\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/plugins.go#L654<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\nfunc (pm *VolumePluginMgr) FindPluginBySpec(spec *Spec) (VolumePlugin, error) {\n    pm.mutex.Lock()\n    defer pm.mutex.Unlock()\n\u3000\n    if spec == nil {\n        return nil, fmt.Errorf(&quot;Could not find plugin because volume spec is nil&quot;)\n    }\n\u3000\n    matches := []VolumePlugin{}\n    for _, v := range pm.plugins {\n        if v.CanSupport(spec) {\n            matches = append(matches, v)\n        }\n    }\n\u3000\n        \/\/...\n\u3000\n    return matches[0], nil\n}\n<\/pre>\n<\/p>\n<p>\u3067\u306f\u3001volumePluginMgr\u306bvolumePlugin\u304c\u767b\u9332\u3055\u308c\u308b\u51e6\u7406\u3092\u63a2\u3057\u307e\u3059\u3002<\/p>\n<p>\u3053\u306evolumePluginMgr\u306f\u5f15\u6570\u3067\u5f15\u304d\u56de\u3055\u308c\u3066\u3044\u308b\u306e\u3067\u3059\u304c\u3001\u8ffd\u3044\u304b\u3051\u308b\u3068kubelet\u8d77\u52d5\u6642\u306b\u521d\u671f\u5316\u3057\u3066\u3044\u3066\u3001\u3069\u3046\u3082InitPlugins\u3068\u3044\u3046\u95a2\u6570\u306bplugins\u3068\u3044\u3046\u5f15\u6570\u3092\u4e0e\u3048\u3066\u30bb\u30c3\u30c8\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/kubelet\/kubelet.go#L708-L709\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/kubelet\/kubelet.go#L708-L709<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\nfunc NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration,\n    kubeDeps *Dependencies,\n\u3000\n    \/\/...\n\u3000\n    klet.volumePluginMgr, err =\n        NewInitializedVolumePluginMgr(klet, secretManager, configMapManager, tokenManager, kubeDeps.VolumePlugins, kubeDeps.DynamicPluginProber)\n<\/pre>\n<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/kubelet\/volume_host.go#L89\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/kubelet\/volume_host.go#L89<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\nfunc NewInitializedVolumePluginMgr(\n    kubelet \u22c6Kubelet,\n    secretManager secret.Manager,\n    configMapManager configmap.Manager,\n    tokenManager \u22c6token.Manager,\n    plugins []volume.VolumePlugin,\n    prober volume.DynamicPluginProber) (\u22c6volume.VolumePluginMgr, error) {\n\u3000\n    \/\/...\n\u3000\n    if err := kvh.volumePluginMgr.InitPlugins(plugins, prober, kvh); err != nil {\n        return nil, fmt.Errorf(\n            &quot;could not initialize volume plugins for KubeletVolumePluginMgr: %v&quot;,\n            err)\n    }\n\u3000\n    return \uff06kvh.volumePluginMgr, nil\n}\n<\/pre>\n<\/p>\n<p>\u3053\u306eplugins\u3067\u3059\u304c\u3001kubeDeps\u306a\u308b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306b\u683c\u7d0d\u3055\u308c\u3066\u3044\u307e\u3057\u305f\u306d\u3002\u4eca\u5ea6\u306f\u3053\u306ekubeDeps\u3092\u8ffd\u3044\u304b\u3051\u307e\u3059\u3002\u3053\u306ekubeDeps\u3082\u5f15\u304d\u56de\u3055\u308c\u3066\u3044\u308b\u5909\u6570\u306a\u306e\u3067\u3059\u304c\u3001\u5143\u3092\u8ffd\u3044\u304b\u3051\u308b\u3068kubelet\u306e\u8d77\u52d5\u30b3\u30de\u30f3\u30c9\u306b\u305f\u3069\u308a\u7740\u304d\u307e\u3059\u3002\u521d\u671f\u5316\u51e6\u7406\u3067\u3057\u3087\u3046\u3057\u5f53\u305f\u308a\u524d\u3068\u8a00\u3048\u3070\u5f53\u305f\u308a\u524d\u306a\u306e\u3067\u3059\u304c\u3001\u3053\u3053\u307e\u3067\u305f\u3069\u308a\u7740\u304f\u3068\u4f55\u304b\u611f\u52d5\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/cmd\/kubelet\/app\/server.go#L251\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/cmd\/kubelet\/app\/server.go#L251<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\nfunc NewKubeletCommand() *cobra.Command {\n    cleanFlagSet := pflag.NewFlagSet(componentKubelet, pflag.ContinueOnError)\n    cleanFlagSet.SetNormalizeFunc(cliflag.WordSepNormalizeFunc)\n    kubeletFlags := options.NewKubeletFlags()\n    kubeletConfig, err := options.NewKubeletConfiguration()\n    \/\/ programmer error\n    if err != nil {\n        klog.Fatal(err)\n    }\n\u3000\n    cmd := \uff06cobra.Command{\n        Use: componentKubelet,\n        \/\/...\n        Run: func(cmd *cobra.Command, args []string) {\n            \/\/ initial flag parse, since we disable cobra&#039;s flag parsing            \/\/ use kubeletServer to construct the default KubeletDeps\n            kubeletDeps, err := UnsecuredDependencies(kubeletServer, utilfeature.DefaultFeatureGate)\n<\/pre>\n<p>(\u95a2\u4fc2\u306a\u3044\u3067\u3059\u304c\u3001programmer error \u304c\u6c17\u306b\u306a\u308b)<\/p>\n<p>\u4eca\u5ea6\u306fUnsecuredDependencies\u306e\u4e2d\u8eab\u3092\u898b\u3066\u307f\u307e\u3059\u3002\u3059\u308b\u3068\u3001ProbeVolumePlugins\u306a\u308b\u3001\u305d\u308c\u3063\u307d\u3044\u51e6\u7406\u304c\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/cmd\/kubelet\/app\/server.go#L379\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/cmd\/kubelet\/app\/server.go#L379<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\nfunc UnsecuredDependencies(s \u22c6options.KubeletServer, featureGate featuregate.FeatureGate) (\u22c6kubelet.Dependencies, error) {\n    \/\/ Initialize the TLS Options\n    tlsOptions, err := InitializeTLS(\uff06s.KubeletFlags, \uff06s.KubeletConfiguration)\n\u3000\n    \/\/...\n\u3000\n    plugins, err := ProbeVolumePlugins(featureGate)\n<\/pre>\n<\/p>\n<p>\u4e2d\u3092\u898b\u3066\u307f\u308b\u3068...\u3042\u308a\u307e\u3057\u305f\uff01\u5404plugin\u3092\u547c\u3073\u51fa\u3057\u3066\u3044\u307e\u3059\u3002NFS\u3082\u66f8\u304b\u308c\u3066\u3044\u307e\u3059\u306d\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/cmd\/kubelet\/app\/plugins.go#L75\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/cmd\/kubelet\/app\/plugins.go#L75<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\nfunc ProbeVolumePlugins(featureGate featuregate.FeatureGate) ([]volume.VolumePlugin, error) {\n    allPlugins := []volume.VolumePlugin{}\n\u3000\n    \/\/ The list of plugins to probe is decided by the kubelet binary, not\n    \/\/ by dynamic linking or other &quot;magic&quot;.  Plugins will be analyzed and\n    \/\/ initialized later.\n    \/\/\n    \/\/ Kubelet does not currently need to configure volume plugins.\n    \/\/ If\/when it does, see kube-controller-manager\/app\/plugins.go for example of using volume.VolumeConfig\n    var err error\n    allPlugins, err = appendLegacyProviderVolumes(allPlugins, featureGate)\n    if err != nil {\n        return allPlugins, err\n    }\n    allPlugins = append(allPlugins, emptydir.ProbeVolumePlugins()...)\n    allPlugins = append(allPlugins, git_repo.ProbeVolumePlugins()...)\n    allPlugins = append(allPlugins, hostpath.ProbeVolumePlugins(volume.VolumeConfig{})...)\n    allPlugins = append(allPlugins, nfs.ProbeVolumePlugins(volume.VolumeConfig{})...)\n<\/pre>\n<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/nfs\/nfs.go#L40-L45\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/nfs\/nfs.go#L40-L45<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\n\/\/ ProbeVolumePlugins is the primary entrypoint for volume plugins.\n\/\/ This is the primary entrypoint for volume plugins.\n\/\/ The volumeConfig arg provides the ability to configure recycler behavior.  It is implemented as a pointer to allow nils.\n\/\/ The nfsPlugin is used to store the volumeConfig and give it, when needed, to the func that creates NFS Recyclers.\n\/\/ Tests that exercise recycling should not use this func but instead use ProbeRecyclablePlugins() to override default behavior.\nfunc ProbeVolumePlugins(volumeConfig volume.VolumeConfig) []volume.VolumePlugin {\n    return []volume.VolumePlugin{\n        \uff06nfsPlugin{\n            host:   nil,\n            config: volumeConfig,\n        },\n    }\n}\n<\/pre>\n<\/p>\n<p>\u3068\u3044\u3046\u3053\u3068\u3067\u3001volumePluginMgr\u306bNFS Plugin\u304c\u767b\u9332\u3055\u308c\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3067\u304d\u307e\u3057\u305f\u3002\u3053\u306eNFS Plugin\u304cvolumePluginMgr.FindPluginBySpec\u306b\u3088\u3063\u3066\u9078\u629e\u3055\u308c\u308b\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002\u3067\u306f\u7d9a\u3044\u3066\u3001NFS Plugin\u306e\u4e2d\u3092\u898b\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<h3>NFS Volume Plugin\u304cmount\u3059\u308b\u307e\u3067<\/h3>\n<p>\u524d\u306b\u898b\u305f\u3088\u3046\u306b\u3001volumePlugin\u304b\u3089volumeMounter \u304c\u751f\u6210\u3055\u308c\u307e\u3059\u3002nfs\u306e\u5834\u5408\u306f\u3053\u306e\u3042\u305f\u308a\u3067\u3059\u306d\u3002nfsMounter\u304c\u751f\u6210\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/nfs\/nfs.go#L113-L136\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/nfs\/nfs.go#L113-L136<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\nfunc (plugin *nfsPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.VolumeOptions) (volume.Mounter, error) {\n    return plugin.newMounterInternal(spec, pod, plugin.host.GetMounter(plugin.GetPluginName()))\n}\n\u3000\nfunc (plugin *nfsPlugin) newMounterInternal(spec *volume.Spec, pod *v1.Pod, mounter mount.Interface) (volume.Mounter, error) {\n    source, readOnly, err := getVolumeSource(spec)\n    if err != nil {\n        return nil, err\n    }\n\u3000\n    return \uff06nfsMounter{\n        nfs: \uff06nfs{\n            volName:         spec.Name(),\n            mounter:         mounter,\n            pod:             pod,\n            plugin:          plugin,\n            MetricsProvider: volume.NewMetricsStatFS(getPath(pod.UID, spec.Name(), plugin.host)),\n        },\n        server:       source.Server,\n        exportPath:   source.Path,\n        readOnly:     readOnly,\n        mountOptions: util.MountOptionFromSpec(spec),\n    }, nil\n}\n<\/pre>\n<\/p>\n<p>mount\u51e6\u7406\u3067\u306f\u3001\u3053\u306emounter\u304b\u3089mounter.SetUp\u3092\u547c\u3093\u3067\u3044\u307e\u3057\u305f\u306d\u3002\u898b\u3066\u3044\u304f\u3068\u3001SetUp\u304b\u3089SetUpAt\u304c\u547c\u3070\u308c\u307e\u3059\u3002<br \/>\n\u3053\u306e\u4e2d\u3092\u898b\u308b\u3068\u3001\u30de\u30a6\u30f3\u30c8\u30aa\u30d7\u30b7\u30e7\u30f3\u304c\u4f5c\u3089\u308c\u3066\u3044\u307e\u3059\u306d\uff01nfs.readOnly: true \u306e\u5834\u5408\u306b ro \u3092\u4ed8\u4e0e\u3057\u3066\u3001mounter\u306emountOptions\u3068\u30de\u30fc\u30b8\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/nfs\/nfs.go#L244\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/nfs\/nfs.go#L244-L261<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\n\/\/ SetUp attaches the disk and bind mounts to the volume path.\nfunc (nfsMounter *nfsMounter) SetUp(mounterArgs volume.MounterArgs) error {\n    return nfsMounter.SetUpAt(nfsMounter.GetPath(), mounterArgs)\n}\n\u3000\nfunc (nfsMounter *nfsMounter) SetUpAt(dir string, mounterArgs volume.MounterArgs) error {\n\u3000\n    \/\/...\n\u3000\n    options := []string{}\n    if nfsMounter.readOnly {\n        options = append(options, &quot;ro&quot;)\n    }\n    mountOptions := util.JoinMountOptions(nfsMounter.mountOptions, options)\n<\/pre>\n<\/p>\n<p>\u3061\u306a\u307f\u306b\u3001mounter\u306emountOptions\u306fspec.mountOptions\u304b\u3089\u53d6\u5f97\u3057\u3066\u3044\u307e\u3057\u305f\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/nfs\/nfs.go#L134\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/nfs\/nfs.go#L134<\/a><br \/>\n<a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/util\/util.go#L263\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/util\/util.go#L263<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\n\/\/ MountOptionFromSpec extracts and joins mount options from volume spec with supplied options\nfunc MountOptionFromSpec(spec *volume.Spec, options ...string) []string {\n    pv := spec.PersistentVolume\n\u3000\n    if pv != nil {\n        \/\/ Use beta annotation first\n        if mo, ok := pv.Annotations[v1.MountOptionAnnotation]; ok {\n            moList := strings.Split(mo, &quot;,&quot;)\n            return JoinMountOptions(moList, options)\n        }\n\u3000\n        if len(pv.Spec.MountOptions) &gt; 0 {\n            return JoinMountOptions(pv.Spec.MountOptions, options)\n        }\n    }\n\u3000\n    return options\n}\n<\/pre>\n<\/p>\n<p>SetUpAt\u306e\u51e6\u7406\u306b\u623b\u308a\u307e\u3059\u3002mountOption\u306e\u30bb\u30c3\u30c8\u5f8c\u306bmounter.Mount\u304c\u547c\u3070\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/nfs\/nfs.go#L262\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/nfs\/nfs.go#L262<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\nfunc (nfsMounter *nfsMounter) SetUpAt(dir string, mounterArgs volume.MounterArgs) error {\n\u3000\n    \/\/...\n\u3000\n    mountOptions := util.JoinMountOptions(nfsMounter.mountOptions, options)\n    err = nfsMounter.mounter.Mount(source, dir, &quot;nfs&quot;, mountOptions)\n<\/pre>\n<\/p>\n<p>\u3053\u306emounter\u306f\u3001nfsMounter\u306e\u521d\u671f\u5316\u6642\u306bplugin.host.GetMounter\u3067\u4e0e\u3048\u3089\u308c\u3066\u3044\u307e\u3057\u305f\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/nfs\/nfs.go#L114\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/pkg\/volume\/nfs\/nfs.go#L114<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\nfunc (plugin *nfsPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.VolumeOptions) (volume.Mounter, error) {\n    return plugin.newMounterInternal(spec, pod, plugin.host.GetMounter(plugin.GetPluginName()))\n}\n<\/pre>\n<\/p>\n<p>\u3067\u306f\u3053\u306eGetMounter\u3067\u3059\u304c\u3001\u3053\u308c\u3082\u5b9f\u306f\u8d77\u52d5\u6642\u306e\u51e6\u7406\u3067\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u3066\u3001\u9061\u308b\u3068kubeDeps\u306b\u30bb\u30c3\u30c8\u3055\u308c\u3066\u3044\u307e\u3057\u305f\u3002UnsecutredDependencies\u306e\u4e0b\u8a18\u306e\u51e6\u7406\u3067\u751f\u6210\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/cmd\/kubelet\/app\/server.go#L365\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/cmd\/kubelet\/app\/server.go#L365<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\nfunc UnsecuredDependencies(s \u22c6options.KubeletServer, featureGate featuregate.FeatureGate) (\u22c6kubelet.Dependencies, error) {\n    \/\/ Initialize the TLS Options\n    tlsOptions, err := InitializeTLS(\uff06s.KubeletFlags, \uff06s.KubeletConfiguration)\n    if err != nil {\n        return nil, err\n    }\n\u3000\n    mounter := mount.New(s.ExperimentalMounterPath)\n<\/pre>\n<\/p>\n<p>\u3053\u306e\u5148\u306e\u51e6\u7406\u306fmount\u30d1\u30c3\u30b1\u30fc\u30b8\u306b\u3042\u308a\u307e\u3059\u3002linux\u5411\u3051\u306e\u5834\u5408\u306f\u3001mount_linux.go\u304cbuild\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u3053\u3053\u306e\u51e6\u7406\u3067mouter\u304cnew\u3055\u308c\u3066\u3044\u307e\u3059\u306d\u3002\u3061\u306a\u307f\u306b\u4f59\u8ac7\u3067\u3059\u304c\u3001mount_windows.go\u898b\u308b\u3068cifs\u3084\u3089smb\u3084\u3089\u306e\u51e6\u7406\u304c\u66f8\u304b\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/vendor\/k8s.io\/utils\/mount\/mount_linux.go#L59\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/vendor\/k8s.io\/utils\/mount\/mount_linux.go#L59<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\nfunc New(mounterPath string) Interface {\n    return \uff06Mounter{\n        mounterPath: mounterPath,\n        withSystemd: detectSystemd(),\n    }\n}\n<\/pre>\n<\/p>\n<p>mounter.Mount\u3092\u8ffd\u3044\u304b\u3051\u308b\u3068\u3001\u5b9f\u969b\u306emount\u51e6\u7406\u306b\u305f\u3069\u308a\u7740\u304d\u307e\u3059\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/vendor\/k8s.io\/utils\/mount\/mount_linux.go#L147\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/vendor\/k8s.io\/utils\/mount\/mount_linux.go#L147<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\nfunc (mounter *Mounter) Mount(source string, target string, fstype string, options []string) error {\n    return mounter.MountSensitive(source, target, fstype, options, nil)\n}\n\u3000\nfunc (mounter *Mounter) MountSensitive(source string, target string, fstype string, options []string, sensitiveOptions []string) error {\n\u3000\n    \/\/...\n\u3000\n    return mounter.doMount(mounterPath, defaultMountCommand, source, target, fstype, options, sensitiveOptions)\n}\n\u3000\n\/\/ doMount runs the mount command. mounterPath is the path to mounter binary if containerized mounter is used.\n\/\/ sensitiveOptions is an extension of options except they will not be logged (because they may contain sensitive material)\nfunc (mounter *Mounter) doMount(mounterPath string, mountCmd string, source string, target string, fstype string, options []string, sensitiveOptions []string) error {\n    mountArgs, mountArgsLogStr := MakeMountArgsSensitive(source, target, fstype, options, sensitiveOptions)\n    if len(mounterPath) &gt; 0 {\n        mountArgs = append([]string{mountCmd}, mountArgs...)\n        mountArgsLogStr = mountCmd + &quot; &quot; + mountArgsLogStr\n        mountCmd = mounterPath\n    }\n\u3000\n    if mounter.withSystemd {\n\u3000\n        \/\/...\n\u3000\n        mountCmd, mountArgs, mountArgsLogStr = AddSystemdScopeSensitive(&quot;systemd-run&quot;, target, mountCmd, mountArgs, mountArgsLogStr)\n    } else {\n        \/\/ No systemd-run on the host (or we failed to check it), assume kubelet\n        \/\/ does not run as a systemd service.\n        \/\/ No code here, mountCmd and mountArgs are already populated.\n    }\n\u3000\n    \/\/ Logging with sensitive mount options removed.\n    klog.V(4).Infof(&quot;Mounting cmd (%s) with arguments (%s)&quot;, mountCmd, mountArgsLogStr)\n    command := exec.Command(mountCmd, mountArgs...)\n<\/pre>\n<\/p>\n<p>option\u306a\u3069\u306e\u5f15\u6570\u3092\u3054\u306b\u3087\u3054\u306b\u3087\u64cd\u4f5c\u3057\u3066mountCmd\u3001mountArgs\u3092\u4f5c\u3063\u3066\u3001exec.Command\u3067\u5358\u306b\u5b9f\u884c\u3057\u3066\u3044\u307e\u3059\u3002\u3061\u306a\u307f\u306bmounterPath\u306fnil\u3067\u6e21\u3063\u3066\u304f\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002systemd\u7ba1\u7406\u4e0b\u306eOS\u306e\u5834\u5408\u306f\u3001systemd-run --scope -- \u3092\u30b3\u30de\u30f3\u30c9\u306e\u982d\u306b\u3064\u3051\u3066\u3044\u308b\u3088\u3046\u3067\u3059\u306d\u3002\u3055\u3066\u3001mountCmd\u306e\u5927\u5143\u3068\u306a\u308bdefaultMountCommand\u3092\u305f\u3069\u308b\u3068...<\/p>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/vendor\/k8s.io\/utils\/mount\/mount.go#L33\">https:\/\/github.com\/kubernetes\/kubernetes\/blob\/v1.19.3\/vendor\/k8s.io\/utils\/mount\/mount.go#L33<\/a><\/p>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"go\">\npackage mount\n\u3000\n\/\/...\n\u3000\nconst (\n    \/\/ Default mount command if mounter path is not specified.\n    defaultMountCommand = &quot;mount&quot;\n    \/\/ Log message where sensitive mount options were removed\n    sensitiveOptionsRemoved = &quot;&lt;masked&gt;&quot;\n)\n<\/pre>\n<\/p>\n<p>\u306a\u308b\u307b\u3069\u3001\u5358\u306bmount\u3067\u3059\u306d\u3002\u3068\u3044\u3046\u3053\u3068\u3067\u3088\u3046\u3084\u304f\u3001kubelet\u304cmount\u30b3\u30de\u30f3\u30c9\u3092exec\u3057\u3066\u3044\u308b\u3068\u3053\u308d\u307e\u3067\u305f\u3069\u308a\u7740\u304d\u307e\u3057\u305f\u3002\u306a\u308b\u307b\u3069\u3001\u5358\u306bmountOption\u3092\u3064\u3051\u3066mount\u3092exec\u3057\u3066\u3044\u308b\u3068\u3044\u3046\u3053\u3068\u3067\u3059\u306d\u3002\u30bd\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3001\u30bf\u30fc\u30b2\u30c3\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3082\u6307\u5b9a\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u3053\u3053\u3067\u306f\u8ffd\u3044\u304b\u3051\u307e\u305b\u3093\u3002<\/p>\n<p>\u307e\u305f\u3001\u30b3\u30fc\u30c9\u3067\u306fExperimentalMounterPath\u3092\u6307\u5b9a\u3059\u308b\u3053\u3068\u3067\u3053\u306emountCmd\u3067\u3042\u308bmount\u3092default\u304b\u3089\u66f8\u304d\u63db\u3048\u3089\u308c\u308b\u3088\u3046\u306b\u898b\u3048\u307e\u3059\u304c\u3001\u5b9f\u969b\u306b\u66f8\u304d\u63db\u3048\u308b\u51e6\u7406\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u5b9f\u969b\u306bkubelet\u306econfig\u3067experimentalMounterPath\u3092\u66f8\u304d\u63db\u3048\u3066\u3082\u3001\u53cd\u6620\u3055\u308c\u306a\u3044\u3088\u3046\u3067\u3059\u3002<\/p>\n<h1>\u307e\u3068\u3081<\/h1>\n<p>\u3068\u3044\u3046\u3053\u3068\u3067\u3001\u30b3\u30fc\u30c9\u304b\u3089\u4e0b\u8a18\u306e\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3057\u305f\u3002\u5b9f\u969b\u306b\u306f\u74b0\u5883\u3084\u72b6\u6cc1\u306b\u5fdc\u3058\u3066\u3044\u304f\u3064\u304b\u306e\u5206\u5c90\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u6700\u7d42\u7684\u306b\u306fmount\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u3044\u308b\u3060\u3051\u306a\u3093\u3067\u3059\u306d\u3002<\/p>\n<ul>\n<li>kubernetes\u3067NFS\u3092mount\u3059\u308bPod\u3092\u4f5c\u6210\u3059\u308b\u3068\u3001kubelet\u304cmount\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3059\u308b<\/li>\n<li>\u30de\u30a6\u30f3\u30c8\u30aa\u30d7\u30b7\u30e7\u30f3\u306b\u306fspec.mountOptions\u3068\u3001nfs.readOnly: true\u306e\u3068\u304d\u3060\u3051ro\u304c\u8a2d\u5b9a\u3055\u308c\u308b<\/li>\n<\/ul>\n<p><a href=\"https:\/\/github.com\/kubernetes\/kubernetes\">https:\/\/github.com\/kubernetes\/kubernetes<\/a>\u306f\u5927\u304d\u306a\u30ec\u30dd\u30b8\u30c8\u30ea\u3067\u3059\u304c\u30011\u30641\u3064\u8ffd\u3044\u304b\u3051\u3066\u3044\u304f\u3068\u610f\u5916\u3068\u96e3\u3057\u304f\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u3068\u306f\u8a00\u3048\u3001\u5f53\u305f\u308a\u3092\u3064\u3051\u308b\u306e\u306bkubernetes\u306e\u57fa\u672c\u7684\u306a\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u3060\u3051\u7406\u89e3\u3057\u3066\u304a\u304f\u5fc5\u8981\u306f\u3042\u308a\u305d\u3046\u3067\u3059\u3002<\/p>\n<h1>\u304a\u308f\u308a\u306b<\/h1>\n<p>\u672c\u8a18\u4e8b\u3067\u306f\u3001Kubernetes\u306e\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u8abf\u67fb\u306e\u5185\u5bb9\u3092\u3054\u7d39\u4ecb\u3057\u307e\u3057\u305f\u3002\u30af\u30ea\u30a8\u30fc\u30b7\u30e7\u30f3\u30e9\u30a4\u30f3\u3067\u306f\u3001<a href=\"\/docker\/docker-enterprise\">Docker Enterprise<\/a>\u3092\u306f\u3058\u3081<a href=\"\/k8s\">Kubernetes Boost<\/a>, <a href=\"\/training\/kubernetes-fundamental\">Kubernetes Training<\/a>\u306a\u3069Kubernetes\u306b\u95a2\u308f\u308b\u88fd\u54c1\u306e\u53d6\u308a\u6271\u3044\u3084\u6280\u8853\u652f\u63f4\u3092\u884c\u3063\u3066\u3044\u307e\u3059\u3002\u3054\u76f8\u8ac7\u3092\u627f\u3063\u3066\u304a\u308a\u307e\u3059\u306e\u3067\u3001\u8208\u5473\u304c\u3042\u308a\u307e\u3057\u305f\u3089<a href=\"\/contactk\">\u304a\u554f\u3044\u5408\u308f\u305b<\/a>\u3088\u308a\u3054\u9023\u7d61\u304f\u3060\u3055\u3044\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5148\u65e5\u3001Kubernetes\u306ePersistentVolume\u304b\u3089NFS\u3092\u5229\u7528\u3059\u308b\u5834\u5408\u306e\u6319\u52d5\u306b\u3064\u3044\u3066\u8abf\u67fb\u3059\u308b\u6a5f\u4f1a\u304c\u3042\u308a\u307e\u3057\u305f\u3002 \u8abf\u67fb\u306b\u3042\u305f\u3063\u3066Kubernetes\u306e\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0\u3092\u884c\u3044\u307e\u3057\u305f\u306e\u3067\u3001\u5185\u5bb9\u3092\u3053\u3061\u3089\u3067\u7d39\u4ecb\u3057\u307e [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":20088,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"categories":[43,122],"tags":[],"class_list":["post-38641","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-docker","category-kubernetes"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>pod\u306bNFS\u304cmount\u3055\u308c\u308b\u307e\u3067 #kubernetes #\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0 - Tech Blog\uff5c\u30af\u30ea\u30a8\u30fc\u30b7\u30e7\u30f3\u30e9\u30a4\u30f3<\/title>\n<meta name=\"description\" content=\"Docker, Kubernetes |\u5148\u65e5\u3001Kubernetes\u306ePersistentVolume\u304b\u3089NFS\u3092\u5229\u7528\u3059\u308b\u5834\u5408\u306e\u6319\u52d5\u306b\u3064\u3044\u3066\u8abf\u67fb\u3059\u308b\u6a5f\u4f1a\u304c\u3042\u308a\u307e\u3057\u305f\u3002\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.creationline.com\/tech-blog\/38641\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"pod\u306bNFS\u304cmount\u3055\u308c\u308b\u307e\u3067 #kubernetes #\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0 - Tech Blog\uff5c\u30af\u30ea\u30a8\u30fc\u30b7\u30e7\u30f3\u30e9\u30a4\u30f3\" \/>\n<meta property=\"og:description\" content=\"Docker, Kubernetes |\u5148\u65e5\u3001Kubernetes\u306ePersistentVolume\u304b\u3089NFS\u3092\u5229\u7528\u3059\u308b\u5834\u5408\u306e\u6319\u52d5\u306b\u3064\u3044\u3066\u8abf\u67fb\u3059\u308b\u6a5f\u4f1a\u304c\u3042\u308a\u307e\u3057\u305f\u3002\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.creationline.com\/tech-blog\/38641\" \/>\n<meta property=\"og:site_name\" content=\"Tech Blog\uff5c\u30af\u30ea\u30a8\u30fc\u30b7\u30e7\u30f3\u30e9\u30a4\u30f3\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/creationline\" \/>\n<meta property=\"article:published_time\" content=\"2020-11-13T03:37:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-07-09T11:30:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.creationline.com\/tech-blog\/cms_x3GWkuX\/wp-content\/uploads\/2018\/02\/favicon.png\" \/>\n\t<meta property=\"og:image:width\" content=\"512\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@creationline\" \/>\n<meta name=\"twitter:site\" content=\"@creationline\" \/>\n<meta name=\"twitter:label1\" content=\"\u57f7\u7b46\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593\" \/>\n\t<meta name=\"twitter:data2\" content=\"10\u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/38641#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/38641\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/#\\\/schema\\\/person\\\/7d923d1c017568a1a5e66d7bb1c8764a\"},\"headline\":\"pod\u306bNFS\u304cmount\u3055\u308c\u308b\u307e\u3067 #kubernetes #\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0\",\"datePublished\":\"2020-11-13T03:37:22+00:00\",\"dateModified\":\"2021-07-09T11:30:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/38641\"},\"wordCount\":2043,\"image\":{\"@id\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/38641#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/cms_x3GWkuX\\\/wp-content\\\/uploads\\\/2018\\\/02\\\/favicon.png\",\"articleSection\":[\"Docker\",\"Kubernetes\"],\"inLanguage\":\"ja\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/38641\",\"url\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/38641\",\"name\":\"pod\u306bNFS\u304cmount\u3055\u308c\u308b\u307e\u3067 #kubernetes #\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0 - Tech Blog\uff5c\u30af\u30ea\u30a8\u30fc\u30b7\u30e7\u30f3\u30e9\u30a4\u30f3\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/38641#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/38641#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/cms_x3GWkuX\\\/wp-content\\\/uploads\\\/2018\\\/02\\\/favicon.png\",\"datePublished\":\"2020-11-13T03:37:22+00:00\",\"dateModified\":\"2021-07-09T11:30:49+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/#\\\/schema\\\/person\\\/7d923d1c017568a1a5e66d7bb1c8764a\"},\"description\":\"Docker, Kubernetes |\u5148\u65e5\u3001Kubernetes\u306ePersistentVolume\u304b\u3089NFS\u3092\u5229\u7528\u3059\u308b\u5834\u5408\u306e\u6319\u52d5\u306b\u3064\u3044\u3066\u8abf\u67fb\u3059\u308b\u6a5f\u4f1a\u304c\u3042\u308a\u307e\u3057\u305f\u3002\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/38641#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/38641\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/38641#primaryimage\",\"url\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/cms_x3GWkuX\\\/wp-content\\\/uploads\\\/2018\\\/02\\\/favicon.png\",\"contentUrl\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/cms_x3GWkuX\\\/wp-content\\\/uploads\\\/2018\\\/02\\\/favicon.png\",\"width\":512,\"height\":512},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/38641#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"HOME\",\"item\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u30af\u30e9\u30a6\u30c9\u30cd\u30a4\u30c6\u30a3\u30d6\",\"item\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/cloudnative\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Docker\",\"item\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/cloudnative\\\/docker\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"pod\u306bNFS\u304cmount\u3055\u308c\u308b\u307e\u3067 #kubernetes #\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/#website\",\"url\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/\",\"name\":\"Tech Blog\uff5c\u30af\u30ea\u30a8\u30fc\u30b7\u30e7\u30f3\u30e9\u30a4\u30f3\",\"description\":\"\u30a2\u30b8\u30e3\u30a4\u30eb\uff06DevOps\u3001\u30af\u30e9\u30a6\u30c9\u30cd\u30a4\u30c6\u30a3\u30d6\u3001AI\uff06LLM\u306e\u5148\u7aef\u6280\u8853\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ja\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/#\\\/schema\\\/person\\\/7d923d1c017568a1a5e66d7bb1c8764a\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/cms_x3GWkuX\\\/wp-content\\\/uploads\\\/2021\\\/12\\\/avatar.png\",\"url\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/cms_x3GWkuX\\\/wp-content\\\/uploads\\\/2021\\\/12\\\/avatar.png\",\"contentUrl\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/cms_x3GWkuX\\\/wp-content\\\/uploads\\\/2021\\\/12\\\/avatar.png\",\"caption\":\"admin\"},\"url\":\"https:\\\/\\\/www.creationline.com\\\/tech-blog\\\/author\\\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"pod\u306bNFS\u304cmount\u3055\u308c\u308b\u307e\u3067 #kubernetes #\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0 - Tech Blog\uff5c\u30af\u30ea\u30a8\u30fc\u30b7\u30e7\u30f3\u30e9\u30a4\u30f3","description":"Docker, Kubernetes |\u5148\u65e5\u3001Kubernetes\u306ePersistentVolume\u304b\u3089NFS\u3092\u5229\u7528\u3059\u308b\u5834\u5408\u306e\u6319\u52d5\u306b\u3064\u3044\u3066\u8abf\u67fb\u3059\u308b\u6a5f\u4f1a\u304c\u3042\u308a\u307e\u3057\u305f\u3002","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.creationline.com\/tech-blog\/38641","og_locale":"ja_JP","og_type":"article","og_title":"pod\u306bNFS\u304cmount\u3055\u308c\u308b\u307e\u3067 #kubernetes #\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0 - Tech Blog\uff5c\u30af\u30ea\u30a8\u30fc\u30b7\u30e7\u30f3\u30e9\u30a4\u30f3","og_description":"Docker, Kubernetes |\u5148\u65e5\u3001Kubernetes\u306ePersistentVolume\u304b\u3089NFS\u3092\u5229\u7528\u3059\u308b\u5834\u5408\u306e\u6319\u52d5\u306b\u3064\u3044\u3066\u8abf\u67fb\u3059\u308b\u6a5f\u4f1a\u304c\u3042\u308a\u307e\u3057\u305f\u3002","og_url":"https:\/\/www.creationline.com\/tech-blog\/38641","og_site_name":"Tech Blog\uff5c\u30af\u30ea\u30a8\u30fc\u30b7\u30e7\u30f3\u30e9\u30a4\u30f3","article_publisher":"https:\/\/www.facebook.com\/creationline","article_published_time":"2020-11-13T03:37:22+00:00","article_modified_time":"2021-07-09T11:30:49+00:00","og_image":[{"width":512,"height":512,"url":"https:\/\/www.creationline.com\/tech-blog\/cms_x3GWkuX\/wp-content\/uploads\/2018\/02\/favicon.png","type":"image\/png"}],"author":"admin","twitter_card":"summary_large_image","twitter_creator":"@creationline","twitter_site":"@creationline","twitter_misc":{"\u57f7\u7b46\u8005":"admin","\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593":"10\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.creationline.com\/tech-blog\/38641#article","isPartOf":{"@id":"https:\/\/www.creationline.com\/tech-blog\/38641"},"author":{"name":"admin","@id":"https:\/\/www.creationline.com\/tech-blog\/#\/schema\/person\/7d923d1c017568a1a5e66d7bb1c8764a"},"headline":"pod\u306bNFS\u304cmount\u3055\u308c\u308b\u307e\u3067 #kubernetes #\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0","datePublished":"2020-11-13T03:37:22+00:00","dateModified":"2021-07-09T11:30:49+00:00","mainEntityOfPage":{"@id":"https:\/\/www.creationline.com\/tech-blog\/38641"},"wordCount":2043,"image":{"@id":"https:\/\/www.creationline.com\/tech-blog\/38641#primaryimage"},"thumbnailUrl":"https:\/\/www.creationline.com\/tech-blog\/cms_x3GWkuX\/wp-content\/uploads\/2018\/02\/favicon.png","articleSection":["Docker","Kubernetes"],"inLanguage":"ja"},{"@type":"WebPage","@id":"https:\/\/www.creationline.com\/tech-blog\/38641","url":"https:\/\/www.creationline.com\/tech-blog\/38641","name":"pod\u306bNFS\u304cmount\u3055\u308c\u308b\u307e\u3067 #kubernetes #\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0 - Tech Blog\uff5c\u30af\u30ea\u30a8\u30fc\u30b7\u30e7\u30f3\u30e9\u30a4\u30f3","isPartOf":{"@id":"https:\/\/www.creationline.com\/tech-blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.creationline.com\/tech-blog\/38641#primaryimage"},"image":{"@id":"https:\/\/www.creationline.com\/tech-blog\/38641#primaryimage"},"thumbnailUrl":"https:\/\/www.creationline.com\/tech-blog\/cms_x3GWkuX\/wp-content\/uploads\/2018\/02\/favicon.png","datePublished":"2020-11-13T03:37:22+00:00","dateModified":"2021-07-09T11:30:49+00:00","author":{"@id":"https:\/\/www.creationline.com\/tech-blog\/#\/schema\/person\/7d923d1c017568a1a5e66d7bb1c8764a"},"description":"Docker, Kubernetes |\u5148\u65e5\u3001Kubernetes\u306ePersistentVolume\u304b\u3089NFS\u3092\u5229\u7528\u3059\u308b\u5834\u5408\u306e\u6319\u52d5\u306b\u3064\u3044\u3066\u8abf\u67fb\u3059\u308b\u6a5f\u4f1a\u304c\u3042\u308a\u307e\u3057\u305f\u3002","breadcrumb":{"@id":"https:\/\/www.creationline.com\/tech-blog\/38641#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.creationline.com\/tech-blog\/38641"]}]},{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/www.creationline.com\/tech-blog\/38641#primaryimage","url":"https:\/\/www.creationline.com\/tech-blog\/cms_x3GWkuX\/wp-content\/uploads\/2018\/02\/favicon.png","contentUrl":"https:\/\/www.creationline.com\/tech-blog\/cms_x3GWkuX\/wp-content\/uploads\/2018\/02\/favicon.png","width":512,"height":512},{"@type":"BreadcrumbList","@id":"https:\/\/www.creationline.com\/tech-blog\/38641#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"HOME","item":"https:\/\/www.creationline.com\/tech-blog"},{"@type":"ListItem","position":2,"name":"\u30af\u30e9\u30a6\u30c9\u30cd\u30a4\u30c6\u30a3\u30d6","item":"https:\/\/www.creationline.com\/tech-blog\/cloudnative"},{"@type":"ListItem","position":3,"name":"Docker","item":"https:\/\/www.creationline.com\/tech-blog\/cloudnative\/docker"},{"@type":"ListItem","position":4,"name":"pod\u306bNFS\u304cmount\u3055\u308c\u308b\u307e\u3067 #kubernetes #\u30b3\u30fc\u30c9\u30ea\u30fc\u30c7\u30a3\u30f3\u30b0"}]},{"@type":"WebSite","@id":"https:\/\/www.creationline.com\/tech-blog\/#website","url":"https:\/\/www.creationline.com\/tech-blog\/","name":"Tech Blog\uff5c\u30af\u30ea\u30a8\u30fc\u30b7\u30e7\u30f3\u30e9\u30a4\u30f3","description":"\u30a2\u30b8\u30e3\u30a4\u30eb\uff06DevOps\u3001\u30af\u30e9\u30a6\u30c9\u30cd\u30a4\u30c6\u30a3\u30d6\u3001AI\uff06LLM\u306e\u5148\u7aef\u6280\u8853","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.creationline.com\/tech-blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ja"},{"@type":"Person","@id":"https:\/\/www.creationline.com\/tech-blog\/#\/schema\/person\/7d923d1c017568a1a5e66d7bb1c8764a","name":"admin","image":{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/www.creationline.com\/tech-blog\/cms_x3GWkuX\/wp-content\/uploads\/2021\/12\/avatar.png","url":"https:\/\/www.creationline.com\/tech-blog\/cms_x3GWkuX\/wp-content\/uploads\/2021\/12\/avatar.png","contentUrl":"https:\/\/www.creationline.com\/tech-blog\/cms_x3GWkuX\/wp-content\/uploads\/2021\/12\/avatar.png","caption":"admin"},"url":"https:\/\/www.creationline.com\/tech-blog\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.creationline.com\/tech-blog\/wp-json\/wp\/v2\/posts\/38641","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.creationline.com\/tech-blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.creationline.com\/tech-blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.creationline.com\/tech-blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.creationline.com\/tech-blog\/wp-json\/wp\/v2\/comments?post=38641"}],"version-history":[{"count":28,"href":"https:\/\/www.creationline.com\/tech-blog\/wp-json\/wp\/v2\/posts\/38641\/revisions"}],"predecessor-version":[{"id":57848,"href":"https:\/\/www.creationline.com\/tech-blog\/wp-json\/wp\/v2\/posts\/38641\/revisions\/57848"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.creationline.com\/tech-blog\/wp-json\/wp\/v2\/media\/20088"}],"wp:attachment":[{"href":"https:\/\/www.creationline.com\/tech-blog\/wp-json\/wp\/v2\/media?parent=38641"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.creationline.com\/tech-blog\/wp-json\/wp\/v2\/categories?post=38641"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.creationline.com\/tech-blog\/wp-json\/wp\/v2\/tags?post=38641"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}