{"id":90512,"date":"2020-05-03T23:10:21","date_gmt":"2020-05-03T15:10:21","guid":{"rendered":"http:\/\/4563.org\/?p=90512"},"modified":"2020-05-03T23:10:21","modified_gmt":"2020-05-03T15:10:21","slug":"%e4%b8%80%e6%96%87%e8%af%bb%e6%87%82-k8s-%e6%8c%81%e4%b9%85%e5%8c%96%e5%ad%98%e5%82%a8%e6%b5%81%e7%a8%8b","status":"publish","type":"post","link":"http:\/\/4563.org\/?p=90512","title":{"rendered":"\u4e00\u6587\u8bfb\u61c2 K8s \u6301\u4e45\u5316\u5b58\u50a8\u6d41\u7a0b"},"content":{"rendered":"<div>\n<div>\n<div>\n<h1>                  \u4e00\u6587\u8bfb\u61c2 K8s \u6301\u4e45\u5316\u5b58\u50a8\u6d41\u7a0b               <\/h1>\n<p> <\/p>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : AlibabaSS <\/span>  <span><i><\/i> 20<\/span> <\/div>\n<div> <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div isfirst=\"1\"> <\/p>\n<p><img decoding=\"async\" src=\"http:\/\/4563.org\/wp-content\/uploads\/2020\/05\/20200519_5ec36fe141634.png\" alt=\"\u4e00\u6587\u8bfb\u61c2 K8s \u6301\u4e45\u5316\u5b58\u50a8\u6d41\u7a0b\" \/><\/p>\n<p>\u4f5c\u8005 | \u5b59\u5fd7\u6052\uff08\u60e0\u5fd7\uff09\u00a0 \u963f\u91cc\u5df4\u5df4\u5f00\u53d1\u5de5\u7a0b\u5e08<\/p>\n<blockquote>\n<p><strong>\u5bfc\u8bfb<\/strong>\uff1a\u4f17\u6240\u5468\u77e5\uff0cK8s \u7684\u6301\u4e45\u5316\u5b58\u50a8\uff08 Persistent Storage \uff09\u4fdd\u8bc1\u4e86\u5e94\u7528\u6570\u636e\u72ec\u7acb\u4e8e\u5e94\u7528\u751f\u547d\u5468\u671f\u800c\u5b58\u5728\uff0c\u4f46\u5176\u5185\u90e8\u5b9e\u73b0\u5374\u5c11\u6709\u4eba\u63d0\u53ca\u3002K8s\u00a0\u5185\u90e8\u7684\u5b58\u50a8\u6d41\u7a0b\u5230\u5e95\u662f\u600e\u6837\u7684\uff1f PV \u3001PVC \u3001StorageClass \u3001Kubelet \u3001CSI \u63d2\u4ef6\u7b49\u4e4b\u95f4\u7684\u8c03\u7528\u5173\u7cfb\u53c8\u5982\u4f55\uff0c\u8fd9\u4e9b\u8c1c\u5e95\u5c06\u5728\u672c\u6587\u4e2d\u4e00\u4e00\u63ed\u6653\u3002<\/p>\n<\/blockquote>\n<h1>K8s \u6301\u4e45\u5316\u5b58\u50a8\u57fa\u7840<\/h1>\n<p> <\/p>\n<p>\u5728\u8fdb\u884c K8s \u5b58\u50a8\u6d41\u7a0b\u8bb2\u89e3\u4e4b\u524d\uff0c\u5148\u56de\u987e\u4e00\u4e0b K8s \u4e2d\u6301\u4e45\u5316\u5b58\u50a8\u7684\u57fa\u7840\u6982\u5ff5\u3002<\/p>\n<h2>1. \u540d\u8bcd\u89e3\u91ca<\/h2>\n<ul>\n<li>\n<p><strong>in-tree<\/strong>\uff1a\u4ee3\u7801\u903b\u8f91\u5728 K8s \u5b98\u65b9\u4ed3\u5e93\u4e2d\uff1b<\/p>\n<\/li>\n<li>\n<p><strong>out-of-tree<\/strong>\uff1a\u4ee3\u7801\u903b\u8f91\u5728 K8s \u5b98\u65b9\u4ed3\u5e93\u4e4b\u5916\uff0c\u5b9e\u73b0\u4e0e K8s \u4ee3\u7801\u7684\u89e3\u8026\uff1b<\/p>\n<\/li>\n<li>\n<p><strong>PV<\/strong>\uff1aPersistentVolume\uff0c\u96c6\u7fa4\u7ea7\u522b\u7684\u8d44\u6e90\uff0c\u7531 \u96c6\u7fa4\u7ba1\u7406\u5458 or External Provisioner \u521b\u5efa\u3002PV \u7684\u751f\u547d\u5468\u671f\u72ec\u7acb\u4e8e\u4f7f\u7528 PV \u7684 Pod\uff0cPV \u7684 .Spec \u4e2d\u4fdd\u5b58\u4e86\u5b58\u50a8\u8bbe\u5907\u7684\u8be6\u7ec6\u4fe1\u606f\uff1b<\/p>\n<\/li>\n<li>\n<p><strong>PVC<\/strong>\uff1aPersistentVolumeClaim\uff0c\u547d\u540d\u7a7a\u95f4\uff08 namespace \uff09\u7ea7\u522b\u7684\u8d44\u6e90\uff0c\u7531 \u7528\u6237 or StatefulSet \u63a7\u5236\u5668\uff08\u6839\u636e VolumeClaimTemplate \uff09 \u521b\u5efa\u3002PVC \u7c7b\u4f3c\u4e8e Pod\uff0cPod \u6d88\u8017 Node \u8d44\u6e90\uff0cPVC \u6d88\u8017 PV \u8d44\u6e90\u3002Pod \u53ef\u4ee5\u8bf7\u6c42\u7279\u5b9a\u7ea7\u522b\u7684\u8d44\u6e90\uff08 CPU \u548c\u5185\u5b58\uff09\uff0c\u800c PVC \u53ef\u4ee5\u8bf7\u6c42\u7279\u5b9a\u5b58\u50a8\u5377\u7684\u5927\u5c0f\u53ca\u8bbf\u95ee\u6a21\u5f0f\uff08 Access Mode \uff09\uff1b<\/p>\n<\/li>\n<li>\n<p><strong>StorageClass<\/strong>\uff1aStorageClass \u662f\u96c6\u7fa4\u7ea7\u522b\u7684\u8d44\u6e90\uff0c\u7531\u96c6\u7fa4\u7ba1\u7406\u5458\u521b\u5efa\u3002SC \u4e3a\u7ba1\u7406\u5458\u63d0\u4f9b\u4e86\u4e00\u79cd\u52a8\u6001\u63d0\u4f9b\u5b58\u50a8\u5377\u7684\u201c\u7c7b\u201d\u6a21\u677f\uff0cSC \u4e2d\u7684 .Spec \u4e2d\u8be6\u7ec6\u5b9a\u4e49\u4e86\u5b58\u50a8\u5377 PV \u7684\u4e0d\u540c\u670d\u52a1\u8d28\u91cf\u7ea7\u522b\u3001\u5907\u4efd\u7b56\u7565\u7b49\u7b49\uff1b<\/p>\n<\/li>\n<li>\n<p><strong>CSI<\/strong>\uff1aContainer Storage Interface\uff0c\u76ee\u7684\u662f\u5b9a\u4e49\u884c\u4e1a\u6807\u51c6\u7684\u201c\u5bb9\u5668\u5b58\u50a8\u63a5\u53e3\u201d\uff0c\u4f7f\u5b58\u50a8\u4f9b\u5e94\u5546\uff08 SP \uff09\u57fa\u4e8e CSI \u6807\u51c6\u5f00\u53d1\u7684\u63d2\u4ef6\u53ef\u4ee5\u5728\u4e0d\u540c\u5bb9\u5668\u7f16\u6392\uff08 CO \uff09\u7cfb\u7edf\u4e2d\u5de5\u4f5c\uff0cCO \u7cfb\u7edf\u5305\u62ec Kubernetes \u3001Mesos \u3001Swarm \u7b49\u3002<\/p>\n<\/li>\n<\/ul>\n<h2>2. \u7ec4\u4ef6\u4ecb\u7ecd<\/h2>\n<ul>\n<li>\n<p><strong>PV Controller<\/strong>\uff1a\u8d1f\u8d23 PV\/PVC \u7ed1\u5b9a\u53ca\u5468\u671f\u7ba1\u7406\uff0c\u6839\u636e\u9700\u6c42\u8fdb\u884c\u6570\u636e\u5377\u7684\u00a0**Provision\/Delete\u00a0**\u64cd\u4f5c\uff1b<\/p>\n<\/li>\n<li>\n<p><strong>AD Controller<\/strong>\uff1a\u8d1f\u8d23\u6570\u636e\u5377\u7684\u00a0**Attach\/Detach\u00a0**\u64cd\u4f5c\uff0c\u5c06\u8bbe\u5907\u6302\u63a5\u5230\u76ee\u6807\u8282\u70b9\uff1b<\/p>\n<\/li>\n<li>\n<p>Kubelet\uff1aKubelet \u662f\u5728\u6bcf\u4e2a Node \u8282\u70b9\u4e0a\u8fd0\u884c\u7684\u4e3b\u8981 \u201c\u8282\u70b9\u4ee3\u7406\u201d\uff0c\u529f\u80fd\u662f Pod \u751f\u547d\u5468\u671f\u7ba1\u7406\u3001\u5bb9\u5668\u5065\u5eb7\u68c0\u67e5\u3001\u5bb9\u5668\u76d1\u63a7\u7b49\uff1b<\/p>\n<\/li>\n<li>\n<p><strong>Volume Manager<\/strong>\uff1aKubelet \u4e2d\u7684\u7ec4\u4ef6\uff0c\u8d1f\u8d23\u7ba1\u7406\u6570\u636e\u5377\u7684\u00a0**Mount\/Umount\u00a0**\u64cd\u4f5c\uff08\u4e5f\u8d1f\u8d23\u6570\u636e\u5377\u7684\u00a0**Attach\/Detach\u00a0**\u64cd\u4f5c\uff0c\u9700\u914d\u7f6e kubelet \u76f8\u5173\u53c2\u6570\u5f00\u542f\u8be5\u7279\u6027\uff09\u3001\u5377\u8bbe\u5907\u7684\u683c\u5f0f\u5316\u7b49\u7b49\uff1b<\/p>\n<\/li>\n<li>\n<p><strong>Volume Plugins<\/strong>\uff1a\u5b58\u50a8\u63d2\u4ef6\uff0c\u7531\u5b58\u50a8\u4f9b\u5e94\u5546\u5f00\u53d1\uff0c\u76ee\u7684\u5728\u4e8e\u6269\u5c55\u5404\u79cd\u5b58\u50a8\u7c7b\u578b\u7684\u5377\u7ba1\u7406\u80fd\u529b\uff0c\u5b9e\u73b0\u7b2c\u4e09\u65b9\u5b58\u50a8\u7684\u5404\u79cd\u64cd\u4f5c\u80fd\u529b\uff0c\u5373\u662f<strong>\u4e0a\u9762\u84dd\u8272\u64cd\u4f5c<\/strong>\u7684\u5b9e\u73b0\u3002Volume Plugins \u6709\u00a0in-tree\u00a0\u548c out-of-tree \u4e24\u79cd\uff1b<\/p>\n<\/li>\n<li>\n<p><strong>External Provioner<\/strong>\uff1aExternal Provioner \u662f\u4e00\u79cd\u00a0sidecar \u5bb9\u5668\uff0c\u4f5c\u7528\u662f\u8c03\u7528 Volume Plugins \u4e2d\u7684\u00a0CreateVolume \u548c\u00a0DeleteVolume \u51fd\u6570\u6765\u6267\u884c\u00a0**Provision\/Delete\u00a0**\u64cd\u4f5c\u3002\u56e0\u4e3a K8s \u7684 PV \u63a7\u5236\u5668\u65e0\u6cd5\u76f4\u63a5\u8c03\u7528 Volume Plugins \u7684\u76f8\u5173\u51fd\u6570\uff0c\u6545\u7531 External Provioner \u901a\u8fc7 gRPC \u6765\u8c03\u7528\uff1b<\/p>\n<\/li>\n<li>\n<p><strong>External Attacher<\/strong>\uff1aExternal Attacher \u662f\u4e00\u79cd\u00a0sidecar \u5bb9\u5668\uff0c\u4f5c\u7528\u662f\u8c03\u7528 Volume Plugins \u4e2d\u7684\u00a0ControllerPublishVolume \u548c\u00a0ControllerUnpublishVolume \u51fd\u6570\u6765\u6267\u884c\u00a0**Attach\/Detach\u00a0**\u64cd\u4f5c\u3002\u56e0\u4e3a K8s \u7684 AD \u63a7\u5236\u5668\u65e0\u6cd5\u76f4\u63a5\u8c03\u7528 Volume Plugins\u00a0\u7684\u76f8\u5173\u51fd\u6570\uff0c\u6545\u7531 External Attacher \u901a\u8fc7 gRPC \u6765\u8c03\u7528\u3002<\/p>\n<\/li>\n<\/ul>\n<h2>3. \u6301\u4e45\u5377\u4f7f\u7528<\/h2>\n<p>Kubernetes \u4e3a\u4e86\u4f7f\u5e94\u7528\u7a0b\u5e8f\u53ca\u5176\u5f00\u53d1\u4eba\u5458\u80fd\u591f\u6b63\u5e38\u8bf7\u6c42\u5b58\u50a8\u8d44\u6e90\uff0c<strong>\u907f\u514d\u5904\u7406\u5b58\u50a8\u8bbe\u65bd\u7ec6\u8282<\/strong>\uff0c\u5f15\u5165\u4e86 PV \u548c PVC \u3002\u521b\u5efa PV \u6709\u4e24\u79cd\u65b9\u5f0f\uff1a<\/p>\n<ul>\n<li>\n<p>\u4e00\u79cd\u662f\u96c6\u7fa4\u7ba1\u7406\u5458\u901a\u8fc7\u624b\u52a8\u65b9\u5f0f<strong>\u9759\u6001\u521b\u5efa<\/strong>\u5e94\u7528\u6240\u9700\u8981\u7684 PV \uff1b<\/p>\n<\/li>\n<li>\n<p>\u53e6\u4e00\u79cd\u662f\u7528\u6237\u624b\u52a8\u521b\u5efa PVC \u5e76\u7531 Provisioner \u7ec4\u4ef6<strong>\u52a8\u6001\u521b\u5efa<\/strong>\u5bf9\u5e94\u7684 PV \u3002<\/p>\n<\/li>\n<\/ul>\n<p>\u4e0b\u9762\u6211\u4eec\u4ee5 NFS \u5171\u4eab\u5b58\u50a8\u4e3a\u4f8b\u6765\u770b\u4e8c\u8005\u533a\u522b\u3002<\/p>\n<h3>\u9759\u6001\u521b\u5efa\u5b58\u50a8\u5377<\/h3>\n<p>\u9759\u6001\u521b\u5efa\u5b58\u50a8\u5377\u6d41\u7a0b\u5982\u4e0b\u56fe\u6240\u793a\uff1a<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/4563.org\/wp-content\/uploads\/2020\/05\/20200519_5ec36fe883fb9.png\" alt=\"\u4e00\u6587\u8bfb\u61c2 K8s \u6301\u4e45\u5316\u5b58\u50a8\u6d41\u7a0b\" \/><\/p>\n<p><strong>\u7b2c\u4e00\u6b65<\/strong>\uff1a\u96c6\u7fa4\u7ba1\u7406\u5458\u521b\u5efa NFS PV\uff0cNFS \u5c5e\u4e8e K8s \u539f\u751f\u652f\u6301\u7684 in-tree \u5b58\u50a8\u7c7b\u578b\u3002yaml \u6587\u4ef6\u5982\u4e0b\uff1a<\/p>\n<pre><code>apiVersion: v1 kind: PersistentVolume metadata:   name: nfs-pv spec:   capacity:     storage: 10Gi   accessModes:     - ReadWriteOnce   persistentVolumeReclaimPolicy: Retain   nfs:     server: 192.168.4.1     path: \/nfs_storage <\/code><\/pre>\n<p><strong>\u7b2c\u4e8c\u6b65<\/strong>\uff1a\u7528\u6237\u521b\u5efa PVC\uff0cyaml \u6587\u4ef6\u5982\u4e0b\uff1a<\/p>\n<pre><code>apiVersion: v1 kind: PersistentVolumeClaim metadata:   name: nfs-pvc spec:   accessModes:   - ReadWriteOnce   resources:     requests:       storage: 10Gi <\/code><\/pre>\n<p>\u901a\u8fc7\u00a0kubectl get pv \u547d\u4ee4\u53ef\u770b\u5230 PV \u548c PVC \u5df2\u7ed1\u5b9a\uff1a<\/p>\n<pre><code>[[email&#160;protected] ~]# kubectl get pvc NAME      STATUS   VOLUME               CAPACITY   ACCESS MODES   STORAGECLASS   AGE nfs-pvc   Bound    nfs-pv-no-affinity   10Gi       RWO                           4s <\/code><\/pre>\n<p><strong>\u7b2c\u4e09\u6b65<\/strong>\uff1a\u7528\u6237\u521b\u5efa\u5e94\u7528\uff0c\u5e76\u4f7f\u7528\u7b2c\u4e8c\u6b65\u521b\u5efa\u7684 PVC \u3002<\/p>\n<pre><code>apiVersion: v1 kind: Pod metadata:   name: test-nfs spec:   containers:   - image: nginx:alpine     imagePullPolicy: IfNotPresent     name: nginx     volumeMounts:     - mountPath: \/data       name: nfs-volume   volumes:   - name: nfs-volume     persistentVolumeClaim:       claimName: nfs-pvc <\/code><\/pre>\n<p>\u6b64\u65f6 NFS \u7684\u8fdc\u7aef\u5b58\u50a8\u5c31\u6302\u8f7d\u4e86\u5230 Pod \u4e2d nginx \u5bb9\u5668\u7684 \/data \u76ee\u5f55\u4e0b\u3002<\/p>\n<h3>\u52a8\u6001\u521b\u5efa\u5b58\u50a8\u5377<\/h3>\n<blockquote>\n<p>\u52a8\u6001\u521b\u5efa\u5b58\u50a8\u5377\uff0c\u8981\u6c42\u96c6\u7fa4\u4e2d\u90e8\u7f72\u6709\u00a0<strong>nfs-client-provisioner<\/strong>\u4ee5\u53ca\u5bf9\u5e94\u7684\u00a0<strong>storageclass<\/strong>\u3002<\/p>\n<\/blockquote>\n<p>\u52a8\u6001\u521b\u5efa\u5b58\u50a8\u5377\u76f8\u6bd4\u9759\u6001\u521b\u5efa\u5b58\u50a8\u5377\uff0c\u5c11\u4e86\u96c6\u7fa4\u7ba1\u7406\u5458\u7684\u5e72\u9884\uff0c\u6d41\u7a0b\u5982\u4e0b\u56fe\u6240\u793a\uff1a<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/4563.org\/wp-content\/uploads\/2020\/05\/20200519_5ec36fee658d3.png\" alt=\"\u4e00\u6587\u8bfb\u61c2 K8s \u6301\u4e45\u5316\u5b58\u50a8\u6d41\u7a0b\" \/><\/p>\n<p>\u96c6\u7fa4\u7ba1\u7406\u5458\u53ea\u9700\u8981\u4fdd\u8bc1\u73af\u5883\u4e2d\u6709 NFS \u76f8\u5173\u7684 storageclass \u5373\u53ef\uff1a<\/p>\n<pre><code>kind: StorageClass apiVersion: storage.k8s.io\/v1 metadata:   name: nfs-sc provisioner: example.com\/nfs mountOptions:   - vers=4.1 <\/code><\/pre>\n<p><strong>\u7b2c\u4e00\u6b65<\/strong>\uff1a\u7528\u6237\u521b\u5efa PVC\uff0c\u6b64\u5904 PVC \u7684 storageClassName \u6307\u5b9a\u4e3a\u4e0a\u9762 NFS \u7684 storageclass \u540d\u79f0\uff1a<\/p>\n<pre><code>kind: PersistentVolumeClaim apiVersion: v1 metadata:   name: nfs   annotations:     volume.beta.kubernetes.io\/storage-class: \"example-nfs\" spec:   accessModes:     - ReadWriteMany   resources:     requests:       storage: 10Mi   storageClassName: nfs-sc <\/code><\/pre>\n<p><strong>\u7b2c\u4e8c\u6b65<\/strong>\uff1a\u96c6\u7fa4\u4e2d\u7684\u00a0nfs-client-provisioner \u4f1a\u52a8\u6001\u521b\u5efa\u76f8\u5e94 PV \u3002\u6b64\u65f6\u53ef\u770b\u5230\u73af\u5883\u4e2d PV \u5df2\u521b\u5efa\uff0c\u5e76\u4e0e PVC \u5df2\u7ed1\u5b9a\u3002<\/p>\n<pre><code>[[email&#160;protected] ~]# kubectl get pv NAME                                       CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM         REASON    AGE pvc-dce84888-7a9d-11e6-b1ee-5254001e0c1b   10Mi        RWX           Delete          Bound       default\/nfs             4s <\/code><\/pre>\n<p><strong>\u7b2c\u4e09\u6b65<\/strong>\uff1a\u7528\u6237\u521b\u5efa\u5e94\u7528\uff0c\u5e76\u4f7f\u7528\u7b2c\u4e8c\u6b65\u521b\u5efa\u7684 PVC\uff0c\u540c\u9759\u6001\u521b\u5efa\u5b58\u50a8\u5377\u7684\u7b2c\u4e09\u6b65\u3002<\/p>\n<h1>K8s \u6301\u4e45\u5316\u5b58\u50a8\u6d41\u7a0b<\/h1>\n<p> <\/p>\n<h2>1. \u6d41\u7a0b\u6982\u89c8<\/h2>\n<blockquote>\n<p>\u6b64\u5904\u501f\u9274 <strong>@\u90e1\u5b9d<\/strong> \u5728\u4e91\u539f\u751f\u5b58\u50a8\u8bfe\u7a0b\u4e2d\u7684\u6d41\u7a0b\u56fe<\/p>\n<\/blockquote>\n<p><img decoding=\"async\" src=\"http:\/\/4563.org\/wp-content\/uploads\/2020\/05\/20200519_5ec36ffab1944.png\" alt=\"\u4e00\u6587\u8bfb\u61c2 K8s \u6301\u4e45\u5316\u5b58\u50a8\u6d41\u7a0b\" \/><\/p>\n<p><strong>\u6d41\u7a0b\u5982\u4e0b\uff1a<\/strong><\/p>\n<ol>\n<li>\n<p>\u7528\u6237\u521b\u5efa\u4e86\u4e00\u4e2a\u5305\u542b PVC \u7684 Pod\uff0c\u8be5 PVC \u8981\u6c42\u4f7f\u7528\u52a8\u6001\u5b58\u50a8\u5377\uff1b<\/p>\n<\/li>\n<li>\n<p><strong>Scheduler<\/strong>\u6839\u636e Pod \u914d\u7f6e\u3001\u8282\u70b9\u72b6\u6001\u3001PV \u914d\u7f6e\u7b49\u4fe1\u606f\uff0c\u628a Pod \u8c03\u5ea6\u5230\u4e00\u4e2a\u5408\u9002\u7684 Worker \u8282\u70b9\u4e0a\uff1b<\/p>\n<\/li>\n<li>\n<p><strong>PV \u63a7\u5236\u5668<\/strong>watch \u5230\u8be5 Pod \u4f7f\u7528\u7684 PVC \u5904\u4e8e Pending \u72b6\u6001\uff0c\u4e8e\u662f\u8c03\u7528\u00a0<strong>Volume Plugin<\/strong>\uff08 in-tree \uff09\u521b\u5efa\u5b58\u50a8\u5377\uff0c\u5e76\u521b\u5efa PV \u5bf9\u8c61\uff08 out-of-tree \u7531 External Provisioner \u6765\u5904\u7406\uff09\uff1b<\/p>\n<\/li>\n<li>\n<p><strong>AD \u63a7\u5236\u5668<\/strong>\u53d1\u73b0 Pod \u548c PVC \u5904\u4e8e\u5f85\u6302\u63a5\u72b6\u6001\uff0c\u4e8e\u662f\u8c03\u7528\u00a0**Volume Plugin\u00a0**\u6302\u63a5\u5b58\u50a8\u8bbe\u5907\u5230\u76ee\u6807 Worker \u8282\u70b9\u4e0a<\/p>\n<\/li>\n<li>\n<p>\u5728 Worker \u8282\u70b9\u4e0a\uff0c<strong>Kubelet \u4e2d\u7684 Volume Manager<\/strong>\u7b49\u5f85\u5b58\u50a8\u8bbe\u5907\u6302\u63a5\u5b8c\u6210\uff0c\u5e76\u901a\u8fc7\u00a0<strong>Volume Plugin<\/strong>\u5c06\u8bbe\u5907\u6302\u8f7d\u5230<strong>\u5168\u5c40\u76ee\u5f55<\/strong>\uff1a<strong>\/var\/lib\/kubelet\/pods\/[pod\u00a0uid]\/volumes\/kubernetes.io~iscsi\/[PV name]<\/strong>\uff08\u4ee5 iscsi \u4e3a\u4f8b\uff09\uff1b<\/p>\n<\/li>\n<li>\n<p>**Kubelet\u00a0**\u901a\u8fc7 Docker \u542f\u52a8\u00a0<strong>Pod\u00a0\u7684 Containers<\/strong>\uff0c\u7528\u00a0<strong>bind mount\u00a0<strong>\u65b9\u5f0f\u5c06\u5df2\u6302\u8f7d\u5230\u672c\u5730\u5168\u5c40\u76ee\u5f55\u7684\u5377\u6620\u5c04\u5230<\/strong>\u5bb9\u5668<\/strong>\u4e2d\u3002<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u66f4\u8be6\u7ec6\u7684\u6d41\u7a0b\u5982\u4e0b\uff1a<\/strong><\/p>\n<p><img decoding=\"async\" src=\"http:\/\/4563.org\/wp-content\/uploads\/2020\/05\/20200519_5ec37002ac07d.png\" alt=\"\u4e00\u6587\u8bfb\u61c2 K8s \u6301\u4e45\u5316\u5b58\u50a8\u6d41\u7a0b\" \/><\/p>\n<h2>2. \u6d41\u7a0b\u8be6\u89e3<\/h2>\n<blockquote>\n<p>\u4e0d\u540c K8s \u7248\u672c\uff0c\u6301\u4e45\u5316\u5b58\u50a8\u6d41\u7a0b\u7565\u6709\u533a\u522b\u3002\u672c\u6587\u57fa\u4e8e Kubernetes 1.14.8\u00a0\u7248\u672c\u3002<\/p>\n<\/blockquote>\n<p>\u4ece\u4e0a\u8ff0\u6d41\u7a0b\u56fe\u4e2d\u53ef\u770b\u5230\uff0c\u5b58\u50a8\u5377\u4ece\u521b\u5efa\u5230\u63d0\u4f9b\u5e94\u7528\u4f7f\u7528\u5171\u5206\u4e3a\u4e09\u4e2a\u9636\u6bb5\uff1a<strong>Provision\/Delete \u3001Attach\/Detach \u3001Mount\/Unmount \u3002<\/strong><\/p>\n<h3>provisioning volumes<\/h3>\n<p><img decoding=\"async\" src=\"http:\/\/4563.org\/wp-content\/uploads\/2020\/05\/20200519_5ec37009a7e4a.png\" alt=\"\u4e00\u6587\u8bfb\u61c2 K8s \u6301\u4e45\u5316\u5b58\u50a8\u6d41\u7a0b\" \/><\/p>\n<p><strong>PV \u63a7\u5236\u5668\u4e2d\u6709\u4e24\u4e2a Worker\uff1a<\/strong><\/p>\n<ul>\n<li><strong>ClaimWorker<\/strong>\uff1a\u5904\u7406 PVC \u7684 add \/ update \/ delete \u76f8\u5173\u4e8b\u4ef6\u4ee5\u53ca PVC \u7684\u72b6\u6001\u8fc1\u79fb\uff1b<\/li>\n<li><strong>VolumeWorker<\/strong>\uff1a\u8d1f\u8d23 PV \u7684\u72b6\u6001\u8fc1\u79fb\u3002<\/li>\n<\/ul>\n<p><strong>PV \u72b6\u6001\u8fc1\u79fb\uff08 UpdatePVStatus \uff09\uff1a<\/strong><\/p>\n<ul>\n<li>PV \u521d\u59cb\u72b6\u6001\u4e3a\u00a0Available\uff0c\u5f53 PV \u4e0e PVC \u7ed1\u5b9a\u540e\uff0c\u72b6\u6001\u53d8\u4e3a\u00a0Bound \uff1b<\/li>\n<li>\u4e0e PV \u7ed1\u5b9a\u7684 PVC \u5220\u9664\u540e\uff0c\u72b6\u6001\u53d8\u4e3a\u00a0Released \uff1b<\/li>\n<li>\u5f53 PV \u56de\u6536\u7b56\u7565\u4e3a Recycled \u6216\u624b\u52a8\u5220\u9664 PV \u7684 .Spec.ClaimRef \u540e\uff0cPV \u72b6\u6001\u53d8\u4e3a\u00a0Available \uff1b<\/li>\n<li>\u5f53 PV \u56de\u6536\u7b56\u7565\u672a\u77e5\u6216 Recycle \u5931\u8d25\u6216\u5b58\u50a8\u5377\u5220\u9664\u5931\u8d25\uff0cPV \u72b6\u6001\u53d8\u4e3a\u00a0Failed \uff1b<\/li>\n<li>\u624b\u52a8\u5220\u9664 PV \u7684 .Spec.ClaimRef\uff0cPV \u72b6\u6001\u53d8\u4e3a\u00a0Available \u3002<\/li>\n<\/ul>\n<p><strong>PVC \u72b6\u6001\u8fc1\u79fb\uff08 UpdatePVCStatus \uff09\uff1a<\/strong><\/p>\n<ul>\n<li>\u5f53\u96c6\u7fa4\u4e2d\u4e0d\u5b58\u5728\u6ee1\u8db3 PVC \u6761\u4ef6\u7684 PV \u65f6\uff0cPVC \u72b6\u6001\u4e3a\u00a0Pending \u3002\u5728 PV \u4e0e PVC \u7ed1\u5b9a\u540e\uff0cPVC \u72b6\u6001\u7531\u00a0Pending\u00a0\u53d8\u4e3a\u00a0Bound \uff1b<\/li>\n<li>\u4e0e PVC \u7ed1\u5b9a\u7684 PV\u00a0\u5728\u73af\u5883\u4e2d\u88ab\u5220\u9664\uff0cPVC \u72b6\u6001\u53d8\u4e3a\u00a0Lost \uff1b<\/li>\n<li>\u518d\u6b21\u4e0e\u4e00\u4e2a**\u540c\u540d PV\u00a0**\u7ed1\u5b9a\u540e\uff0cPVC \u72b6\u6001\u53d8\u4e3a\u00a0Bound \u3002<\/li>\n<\/ul>\n<p><strong>Provisioning \u6d41\u7a0b\u5982\u4e0b\uff08\u6b64\u5904\u6a21\u62df\u7528\u6237\u521b\u5efa\u4e00\u4e2a\u65b0 PVC \uff09\uff1a<\/strong><\/p>\n<p><strong>\u9759\u6001\u5b58\u50a8\u5377\u6d41\u7a0b\uff08 FindBestMatch \uff09<\/strong>\uff1a<strong>PV \u63a7\u5236\u5668<\/strong>\u9996\u5148\u5728\u73af\u5883\u4e2d\u7b5b\u9009\u4e00\u4e2a\u72b6\u6001\u4e3a Available \u7684 PV \u4e0e\u65b0 PVC \u5339\u914d\u3002<\/p>\n<ul>\n<li>\n<p><strong>DelayBinding<\/strong>\uff1aPV \u63a7\u5236\u5668\u5224\u65ad\u8be5 PVC \u662f\u5426\u9700\u8981**\u5ef6\u8fdf\u7ed1\u5b9a\uff1a**1.\u00a0\u67e5\u770b PVC \u7684 annotation \u4e2d\u662f\u5426\u5305\u542b volume.kubernetes.io\/selected-node\uff0c\u82e5\u5b58\u5728\u5219\u8868\u793a\u8be5 PVC \u5df2\u7ecf\u88ab\u8c03\u5ea6\u5668\u6307\u5b9a\u597d\u4e86\u8282\u70b9\uff08\u5c5e\u4e8e\u00a0<strong>ProvisionVolume<\/strong>\uff09\uff0c\u6545\u4e0d\u9700\u8981\u5ef6\u8fdf\u7ed1\u5b9a\uff1b 2.\u00a0\u82e5 PVC \u7684 annotation \u4e2d\u4e0d\u5b58\u5728\u00a0volume.kubernetes.io\/selected-node\uff0c\u540c\u65f6\u6ca1\u6709\u00a0StorageClass\uff0c\u9ed8\u8ba4\u8868\u793a\u4e0d\u9700\u8981\u5ef6\u8fdf\u7ed1\u5b9a\uff1b\u82e5\u6709 StorageClass\uff0c\u67e5\u770b\u5176\u00a0VolumeBindingMode \u5b57\u6bb5\uff0c\u82e5\u4e3a WaitForFirstConsumer \u5219\u9700\u8981\u5ef6\u8fdf\u7ed1\u5b9a\uff0c\u82e5\u4e3a Immediate \u5219\u4e0d\u9700\u8981\u5ef6\u8fdf\u7ed1\u5b9a\uff1b<\/p>\n<\/li>\n<li>\n<p><strong>FindBestMatchPVForClaim<\/strong>\uff1aPV \u63a7\u5236\u5668\u5c1d\u8bd5\u627e\u4e00\u4e2a\u6ee1\u8db3 PVC \u8981\u6c42\u7684\u73af\u5883\u4e2d\u73b0\u6709\u7684 PV \u3002PV \u63a7\u5236\u5668\u4f1a\u5c06**\u6240\u6709\u7684 PV\u00a0**\u8fdb\u884c\u4e00\u6b21\u7b5b\u9009\uff0c\u5e76\u4f1a\u4ece\u6ee1\u8db3\u6761\u4ef6\u7684 PV \u4e2d\u9009\u62e9\u4e00\u4e2a\u6700\u4f73\u5339\u914d\u7684 PV \u3002\u7b5b\u9009\u89c4\u5219\uff1a1.\u00a0VolumeMode \u662f\u5426\u5339\u914d\uff1b 2. PV \u662f\u5426\u5df2\u7ed1\u5b9a\u5230 PVC \u4e0a\uff1b 3. PV \u7684 .Status.Phase \u662f\u5426\u4e3a Available \uff1b 4. LabelSelector \u68c0\u67e5\uff0cPV \u4e0e PVC \u7684 label \u8981\u4fdd\u6301\u4e00\u81f4\uff1b 5. PV \u4e0e\u00a0PVC\u00a0\u7684 StorageClass \u662f\u5426\u4e00\u81f4\uff1b 6.\u00a0\u6bcf\u6b21\u8fed\u4ee3\u66f4\u65b0\u6700\u5c0f\u6ee1\u8db3 PVC requested size \u7684 PV\uff0c\u5e76\u4f5c\u4e3a\u6700\u7ec8\u7ed3\u679c\u8fd4\u56de\uff1b<\/p>\n<\/li>\n<li>\n<p><strong>Bind<\/strong>\uff1aPV \u63a7\u5236\u5668\u5bf9\u9009\u4e2d\u7684 PV \u3001PVC \u8fdb\u884c\u7ed1\u5b9a\uff1a1. \u66f4\u65b0 PV \u7684 .Spec.ClaimRef \u4fe1\u606f\u4e3a\u5f53\u524d PVC \uff1b 2. \u66f4\u65b0 PV \u7684 .Status.Phase \u4e3a Bound \uff1b 3. \u65b0\u589e\u00a0PV \u7684 annotation\u00a0\uff1a\u00a0pv.kubernetes.io\/bound-by-controller: &#8220;yes&#8221;\uff1b 4.\u00a0\u66f4\u65b0 PVC \u7684 .Spec.VolumeName \u4e3a PV \u540d\u79f0\uff1b 5.\u00a0\u66f4\u65b0\u00a0PVC \u7684 .Status.Phase \u4e3a Bound \uff1b 6.\u00a0\u65b0\u589e PVC \u7684 annotation\uff1apv.kubernetes.io\/bound-by-controller: &#8220;yes&#8221; \u548c pv.kubernetes.io\/bind-completed: &#8220;yes&#8221;\uff1b<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u52a8\u6001\u5b58\u50a8\u5377\u6d41\u7a0b\uff08 ProvisionVolume \uff09<\/strong>\uff1a\u82e5\u73af\u5883\u4e2d\u6ca1\u6709\u5408\u9002\u7684 PV\uff0c\u5219\u8fdb\u5165\u52a8\u6001 Provisioning \u573a\u666f\uff1a<\/p>\n<ul>\n<li>\n<p><strong>Before Provisioning<\/strong>\uff1a1.\u00a0PV \u63a7\u5236\u5668\u9996\u5148\u5224\u65ad PVC \u4f7f\u7528\u7684 StorageClass \u662f\u00a0in-tree \u8fd8\u662f out-of-tree\uff1a\u901a\u8fc7\u67e5\u770b\u00a0StorageClass\u00a0\u7684\u00a0Provisioner \u5b57\u6bb5\u662f\u5426\u5305\u542b\u00a0**&#8221;kubernetes.io\/&#8221;**\u524d\u7f00\u6765\u5224\u65ad\uff1b 2.\u00a0PV \u63a7\u5236\u5668\u66f4\u65b0 PVC \u7684 annotation\uff1aclaim.Annotations[&#8220;volume.beta.kubernetes.io\/storage-provisioner&#8221;] = storageClass.Provisioner \uff1b<\/p>\n<\/li>\n<li>\n<p><strong>in-tree Provisioning \uff08 internal provisioning \uff09<\/strong>\uff1a1.\u00a0in-tree \u7684\u00a0Provioner \u4f1a\u5b9e\u73b0 ProvisionableVolumePlugin \u63a5\u53e3\u7684 NewProvisioner \u65b9\u6cd5\uff0c\u7528\u6765\u8fd4\u56de\u4e00\u4e2a\u65b0\u7684 Provisioner \uff1b 2.\u00a0PV \u63a7\u5236\u5668\u8c03\u7528\u00a0Provisioner \u7684 Provision \u51fd\u6570\uff0c\u8be5\u51fd\u6570\u4f1a\u8fd4\u56de\u4e00\u4e2a PV \u5bf9\u8c61\uff1b 3.\u00a0PV \u63a7\u5236\u5668\u521b\u5efa\u4e0a\u4e00\u6b65\u8fd4\u56de\u7684 PV \u5bf9\u8c61\uff0c\u5c06\u5176\u4e0e PVC \u7ed1\u5b9a\uff0cSpec.ClaimRef \u8bbe\u7f6e\u4e3a PVC\uff0c.Status.Phase \u8bbe\u7f6e\u4e3a Bound\uff0c.Spec.StorageClassName\u00a0\u8bbe\u7f6e\u4e3a\u4e0e PVC \u76f8\u540c\u7684 StorageClassName \uff1b\u540c\u65f6\u65b0\u589e annotation\uff1a&#8221;pv.kubernetes.io\/bound-by-controller&#8221;=&#8221;yes&#8221;\u00a0\u548c\u00a0&#8220;pv.kubernetes.io\/provisioned-by&#8221;=plugin.GetPluginName()\uff1b<\/p>\n<\/li>\n<li>\n<p><strong>out-of-tree Provisioning \uff08 external provisioning \uff09<\/strong>\uff1a1.\u00a0External\u00a0Provisioner\u00a0\u68c0\u67e5 PVC \u4e2d\u7684 claim.Spec.VolumeName \u662f\u5426\u4e3a\u7a7a\uff0c\u4e0d\u4e3a\u7a7a\u5219\u76f4\u63a5\u8df3\u8fc7\u8be5 PVC \uff1b 2. External\u00a0Provisioner\u00a0\u68c0\u67e5 PVC \u4e2d\u7684 claim.Annotations[&#8220;volume.beta.kubernetes.io\/storage-provisioner&#8221;] \u662f\u5426\u7b49\u4e8e\u81ea\u5df1\u7684 Provisioner Name \uff08 External\u00a0Provisioner\u00a0\u5728\u542f\u52a8\u65f6\u4f1a\u4f20\u5165&#8211;provisioner \u53c2\u6570\u6765\u786e\u5b9a\u81ea\u5df1\u7684\u00a0Provisioner Name \uff09\uff1b 3.\u00a0\u82e5 PVC \u7684\u00a0VolumeMode=Block\uff0c\u68c0\u67e5\u00a0External\u00a0Provisioner\u00a0\u662f\u5426\u652f\u6301\u5757\u8bbe\u5907\uff1b 4.\u00a0External\u00a0Provisioner \u8c03\u7528\u00a0Provision \u51fd\u6570\uff1a\u901a\u8fc7 gRPC \u8c03\u7528\u00a0CSI \u5b58\u50a8\u63d2\u4ef6\u7684\u00a0CreateVolume\u00a0\u63a5\u53e3\uff1b 5.\u00a0External\u00a0Provisioner \u521b\u5efa\u4e00\u4e2a PV \u6765\u4ee3\u8868\u8be5 volume\uff0c\u540c\u65f6\u5c06\u8be5 PV \u4e0e\u4e4b\u524d\u7684 PVC \u505a\u7ed1\u5b9a\u3002<\/p>\n<\/li>\n<\/ul>\n<h3>deleting volumes<\/h3>\n<p><strong>Deleting \u6d41\u7a0b\u4e3a Provisioning \u7684\u53cd\u64cd\u4f5c<\/strong>\uff1a<\/p>\n<p>\u7528\u6237\u5220\u9664 PVC\uff0c\u5220\u9664 PV \u63a7\u5236\u5668\u6539\u53d8 PV.Status.Phase\u00a0\u4e3a\u00a0Released \u3002<\/p>\n<p>\u5f53 PV.Status.Phase == Released \u65f6\uff0cPV \u63a7\u5236\u5668\u9996\u5148\u68c0\u67e5 Spec.PersistentVolumeReclaimPolicy \u7684\u503c\uff0c\u4e3a\u00a0Retain \u65f6\u76f4\u63a5\u8df3\u8fc7\uff0c\u4e3a Delete \u65f6\uff1a<\/p>\n<ul>\n<li>\n<p>**in-tree Deleting\uff1a**1.\u00a0in-tree \u7684\u00a0Provioner \u4f1a\u5b9e\u73b0\u00a0DeletableVolumePlugin\u00a0\u63a5\u53e3\u7684\u00a0NewDeleter\u00a0\u65b9\u6cd5\uff0c\u7528\u6765\u8fd4\u56de\u4e00\u4e2a\u65b0\u7684 Deleter \uff1b 2.\u00a0\u63a7\u5236\u5668\u8c03\u7528\u00a0Deleter\u00a0\u7684\u00a0Delete\u00a0\u51fd\u6570\uff0c\u5220\u9664\u5bf9\u5e94 volume \uff1b 3. \u5728 volume \u5220\u9664\u540e\uff0cPV \u63a7\u5236\u5668\u4f1a\u5220\u9664 PV \u5bf9\u8c61\uff1b<\/p>\n<\/li>\n<li>\n<p>**out-of-tree Deleting\uff1a**1.\u00a0External\u00a0Provisioner \u8c03\u7528\u00a0Delete \u51fd\u6570\uff0c\u901a\u8fc7 gRPC \u8c03\u7528\u00a0CSI\u00a0\u63d2\u4ef6\u7684\u00a0DeleteVolume\u00a0\u63a5\u53e3\uff1b 2.\u00a0\u5728 volume \u5220\u9664\u540e\uff0cExternal\u00a0Provisioner\u00a0\u4f1a\u5220\u9664 PV \u5bf9\u8c61<\/p>\n<\/li>\n<\/ul>\n<h3>Attaching Volumes<\/h3>\n<blockquote>\n<p>Kubelet \u7ec4\u4ef6\u548c AD \u63a7\u5236\u5668\u90fd\u53ef\u4ee5\u505a attach\/detach \u64cd\u4f5c\uff0c\u82e5\u00a0Kubelet\u00a0\u7684\u542f\u52a8\u53c2\u6570\u4e2d\u6307\u5b9a\u4e86&#8211;enable-controller-attach-detach\uff0c\u5219\u7531\u00a0Kubelet\u00a0\u6765\u505a\uff1b\u5426\u5219\u9ed8\u8ba4\u7531 AD \u63a7\u5236\u8d77\u6765\u505a\u3002\u4e0b\u9762\u4ee5 AD \u63a7\u5236\u5668\u4e3a\u4f8b\u6765\u8bb2\u89e3 attach\/detach \u64cd\u4f5c\u3002<\/p>\n<\/blockquote>\n<p><img decoding=\"async\" src=\"http:\/\/4563.org\/wp-content\/uploads\/2020\/05\/20200519_5ec37010cf950.png\" alt=\"\u4e00\u6587\u8bfb\u61c2 K8s \u6301\u4e45\u5316\u5b58\u50a8\u6d41\u7a0b\" \/><\/p>\n<p><strong>AD \u63a7\u5236\u5668\u4e2d\u6709\u4e24\u4e2a\u6838\u5fc3\u53d8\u91cf<\/strong>\uff1a<\/p>\n<ul>\n<li><strong>DesiredStateOfWorld \uff08 DSW \uff09<\/strong>\uff1a\u96c6\u7fa4\u4e2d\u9884\u671f\u7684\u6570\u636e\u5377\u6302\u63a5\u72b6\u6001\uff0c\u5305\u542b\u4e86 nodes-&gt;volumes-&gt;pods \u7684\u4fe1\u606f\uff1b<\/li>\n<li><strong>ActualStateOfWorld \uff08 ASW \uff09<\/strong>\uff1a\u96c6\u7fa4\u4e2d\u5b9e\u9645\u7684\u6570\u636e\u5377\u6302\u63a5\u72b6\u6001\uff0c\u5305\u542b\u4e86 volumes-&gt;nodes \u7684\u4fe1\u606f\u3002<\/li>\n<\/ul>\n<p><strong>Attaching \u6d41\u7a0b\u5982\u4e0b<\/strong>\uff1a<\/p>\n<p>AD \u63a7\u5236\u5668\u6839\u636e\u96c6\u7fa4\u4e2d\u7684\u8d44\u6e90\u4fe1\u606f\uff0c\u521d\u59cb\u5316\u00a0DSW \u548c\u00a0ASW \u3002<\/p>\n<p>AD \u63a7\u5236\u5668\u5185\u90e8\u6709\u4e09\u4e2a\u7ec4\u4ef6\u5468\u671f\u6027\u66f4\u65b0\u00a0DSW \u548c\u00a0ASW\uff1a<\/p>\n<ul>\n<li>**Reconciler \u3002**\u901a\u8fc7\u4e00\u4e2a GoRoutine \u5468\u671f\u6027\u8fd0\u884c\uff0c<strong>\u786e\u4fdd volume \u6302\u63a5 \/\u6458\u9664\u5b8c\u6bd5<\/strong>\u3002\u6b64\u671f\u95f4\u4e0d\u65ad\u66f4\u65b0 ASW\uff1a<\/li>\n<\/ul>\n<p><strong>in-tree attaching<\/strong>\uff1a1.\u00a0in-tree \u7684 Attacher \u4f1a\u5b9e\u73b0\u00a0AttachableVolumePlugin\u00a0\u63a5\u53e3\u7684 NewAttacher \u65b9\u6cd5\uff0c\u7528\u6765\u8fd4\u56de\u4e00\u4e2a\u65b0\u7684\u00a0Attacher \uff1b 2. AD \u63a7\u5236\u5668\u8c03\u7528\u00a0Attacher\u00a0\u7684\u00a0Attach\u00a0\u51fd\u6570\u8fdb\u884c\u8bbe\u5907\u6302\u63a5\uff1b 3.\u00a0\u66f4\u65b0 ASW \u3002<\/p>\n<p><strong>out-of-tree\u00a0attaching<\/strong>\uff1a1.\u00a0\u8c03\u7528 in-tree \u7684 CSIAttacher \u521b\u5efa\u4e00\u4e2a\u00a0**VolumeAttachement \uff08 VA \uff09**\u5bf9\u8c61\uff0c\u8be5\u5bf9\u8c61\u5305\u542b\u4e86 Attacher \u4fe1\u606f\u3001\u8282\u70b9\u540d\u79f0\u3001\u5f85\u6302\u63a5 PV \u4fe1\u606f\uff1b 2.\u00a0External\u00a0Attacher \u4f1a watch \u96c6\u7fa4\u4e2d\u7684\u00a0VolumeAttachement \u8d44\u6e90\uff0c\u53d1\u73b0\u6709\u9700\u8981\u6302\u63a5\u7684\u6570\u636e\u5377\u65f6\uff0c\u8c03\u7528\u00a0Attach \u51fd\u6570\uff0c\u901a\u8fc7 gRPC \u8c03\u7528\u00a0CSI \u63d2\u4ef6\u7684\u00a0ControllerPublishVolume\u00a0\u63a5\u53e3\u3002<\/p>\n<ul>\n<li><strong>DesiredStateOfWorldPopulator \u3002<strong>\u901a\u8fc7\u4e00\u4e2a\u00a0GoRoutine\u00a0\u5468\u671f\u6027\u8fd0\u884c\uff0c\u4e3b\u8981\u529f\u80fd\u662f<\/strong>\u66f4\u65b0 DSW\uff1a<\/strong><\/li>\n<\/ul>\n<p>findAndRemoveDeletedPods &#8211; \u904d\u5386\u6240\u6709 DSW \u4e2d\u7684 Pods\uff0c\u82e5\u5176\u5df2\u4ece\u96c6\u7fa4\u4e2d\u5220\u9664\u5219\u4ece DSW \u4e2d\u79fb\u9664\uff1b findAndAddActivePods &#8211; \u904d\u5386\u6240\u6709 PodLister \u4e2d\u7684 Pods\uff0c\u82e5 DSW \u4e2d\u4e0d\u5b58\u5728\u8be5 Pod \u5219\u6dfb\u52a0\u81f3 DSW \u3002<\/p>\n<ul>\n<li>**PVC Worker \u3002**watch PVC \u7684 add\/update \u4e8b\u4ef6\uff0c\u5904\u7406 PVC \u76f8\u5173\u7684 Pod\uff0c\u5e76\u5b9e\u65f6\u66f4\u65b0 DSW \u3002<\/li>\n<\/ul>\n<h3>Detaching Volumes<\/h3>\n<p><strong>Detaching \u6d41\u7a0b\u5982\u4e0b<\/strong>\uff1a<\/p>\n<ul>\n<li>\n<p>\u5f53 Pod \u88ab\u5220\u9664\uff0cAD \u63a7\u5236\u5668\u4f1a watch \u5230\u8be5\u4e8b\u4ef6\u3002\u9996\u5148 AD \u63a7\u5236\u5668\u68c0\u67e5 Pod \u6240\u5728\u7684 Node \u8d44\u6e90\u662f\u5426\u5305\u542b&#8221;volumes.kubernetes.io\/keep-terminated-pod-volumes&#8221;\u6807\u7b7e\uff0c\u82e5\u5305\u542b\u5219\u4e0d\u505a\u64cd\u4f5c\uff1b\u4e0d\u5305\u542b\u5219\u4ece DSW \u4e2d\u53bb\u6389\u8be5 volume \uff1b<\/p>\n<\/li>\n<li>\n<p>AD \u63a7\u5236\u5668\u901a\u8fc7\u00a0**Reconciler\u00a0**\u4f7f ActualStateOfWorld \u72b6\u6001\u5411 DesiredStateOfWorld \u72b6\u6001\u9760\u8fd1\uff0c\u5f53\u53d1\u73b0 ASW \u4e2d\u6709 DSW \u4e2d\u4e0d\u5b58\u5728\u7684 volume \u65f6\uff0c\u4f1a\u505a Detach \u64cd\u4f5c\uff1a<\/p>\n<\/li>\n<\/ul>\n<p><strong>in-tree detaching<\/strong>\uff1a1.\u00a0AD \u63a7\u5236\u5668\u4f1a\u5b9e\u73b0 AttachableVolumePlugin \u63a5\u53e3\u7684 NewDetacher \u65b9\u6cd5\uff0c\u7528\u6765\u8fd4\u56de\u4e00\u4e2a\u65b0\u7684 Detacher \uff1b 2. \u63a7\u5236\u5668\u8c03\u7528\u00a0Detacher\u00a0\u7684\u00a0Detach\u00a0\u51fd\u6570\uff0cdetach \u5bf9\u5e94 volume \uff1b 3. AD \u63a7\u5236\u5668\u66f4\u65b0 ASW \u3002<\/p>\n<p><strong>out-of-tree\u00a0detaching<\/strong>\uff1a1.\u00a0AD \u63a7\u5236\u5668\u8c03\u7528 in-tree \u7684 CSIAttacher \u5220\u9664\u76f8\u5173 VolumeAttachement \u5bf9\u8c61\uff1b 2. External\u00a0Attacher \u4f1a watch \u96c6\u7fa4\u4e2d\u7684\u00a0VolumeAttachement \uff08 VA \uff09\u8d44\u6e90\uff0c\u53d1\u73b0\u6709\u9700\u8981\u6458\u9664\u7684\u6570\u636e\u5377\u65f6\uff0c\u8c03\u7528\u00a0Detach \u51fd\u6570\uff0c\u901a\u8fc7 gRPC \u8c03\u7528\u00a0CSI \u63d2\u4ef6\u7684 ControllerUnpublishVolume \u63a5\u53e3\uff1b 3.\u00a0AD \u63a7\u5236\u5668\u66f4\u65b0 ASW \u3002<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/4563.org\/wp-content\/uploads\/2020\/05\/20200519_5ec370173f5f4.png\" alt=\"\u4e00\u6587\u8bfb\u61c2 K8s \u6301\u4e45\u5316\u5b58\u50a8\u6d41\u7a0b\" \/><\/p>\n<p>**Volume Manager\u00a0**\u4e2d\u540c\u6837\u4e5f\u6709\u4e24\u4e2a\u6838\u5fc3\u53d8\u91cf\uff1a<\/p>\n<ul>\n<li><strong>DesiredStateOfWorld \uff08 DSW \uff09<\/strong>\uff1a\u96c6\u7fa4\u4e2d\u9884\u671f\u7684\u6570\u636e\u5377\u6302\u8f7d\u72b6\u6001\uff0c\u5305\u542b\u4e86 volumes-&gt;pods \u7684\u4fe1\u606f\uff1b<\/li>\n<li><strong>ActualStateOfWorld \uff08 ASW \uff09<\/strong>\uff1a\u96c6\u7fa4\u4e2d\u5b9e\u9645\u7684\u6570\u636e\u5377\u6302\u8f7d\u72b6\u6001\uff0c\u5305\u542b\u4e86 volumes-&gt;pods \u7684\u4fe1\u606f\u3002<\/li>\n<\/ul>\n<p><strong>Mounting\/UnMounting \u6d41\u7a0b\u5982\u4e0b<\/strong>\uff1a<\/p>\n<blockquote>\n<p>\u5168\u5c40\u76ee\u5f55\uff08 global mount path \uff09\u5b58\u5728\u7684\u76ee\u7684\uff1a\u5757\u8bbe\u5907\u5728 Linux \u4e0a\u53ea\u80fd\u6302\u8f7d\u4e00\u6b21\uff0c\u800c\u5728 K8s \u573a\u666f\u4e2d\uff0c\u4e00\u4e2a PV \u53ef\u80fd\u88ab\u6302\u8f7d\u5230\u540c\u4e00\u4e2a Node \u4e0a\u7684\u591a\u4e2a Pod \u5b9e\u4f8b\u4e2d\u3002\u82e5\u5757\u8bbe\u5907\u683c\u5f0f\u5316\u540e\u5148\u6302\u8f7d\u81f3 Node \u4e0a\u7684\u4e00\u4e2a\u4e34\u65f6\u5168\u5c40\u76ee\u5f55\uff0c\u7136\u540e\u518d\u4f7f\u7528 Linux \u4e2d\u7684 bind mount \u6280\u672f\u628a\u8fd9\u4e2a\u5168\u5c40\u76ee\u5f55\u6302\u8f7d\u8fdb Pod \u4e2d\u5bf9\u5e94\u7684\u76ee\u5f55\u4e0a\uff0c\u5c31\u53ef\u4ee5\u6ee1\u8db3\u8981\u6c42\u3002\u4e0a\u8ff0\u6d41\u7a0b\u56fe\u4e2d\uff0c\u5168\u5c40\u76ee\u5f55\u5373\u00a0\/var\/lib\/kubelet\/pods\/[pod uid]\/volumes\/kubernetes.io~iscsi\/[PV name]<\/p>\n<\/blockquote>\n<p>VolumeManager\u00a0\u6839\u636e\u96c6\u7fa4\u4e2d\u7684\u8d44\u6e90\u4fe1\u606f\uff0c\u521d\u59cb\u5316\u00a0DSW \u548c\u00a0ASW \u3002<\/p>\n<p>VolumeManager\u00a0\u5185\u90e8\u6709\u4e24\u4e2a\u7ec4\u4ef6\u5468\u671f\u6027\u66f4\u65b0\u00a0DSW \u548c\u00a0ASW\uff1a<\/p>\n<ul>\n<li><strong>DesiredStateOfWorldPopulator<\/strong>\uff1a\u901a\u8fc7\u4e00\u4e2a\u00a0GoRoutine\u00a0\u5468\u671f\u6027\u8fd0\u884c\uff0c\u4e3b\u8981\u529f\u80fd\u662f<strong>\u66f4\u65b0 DSW \uff1b<\/strong><\/li>\n<li><strong>Reconciler<\/strong>\uff1a\u901a\u8fc7\u4e00\u4e2a GoRoutine \u5468\u671f\u6027\u8fd0\u884c\uff0c<strong>\u786e\u4fdd volume \u6302\u8f7d \/\u5378\u8f7d\u5b8c\u6bd5<\/strong>\u3002\u6b64\u671f\u95f4\u4e0d\u65ad\u66f4\u65b0 ASW\uff1a<\/li>\n<\/ul>\n<p><strong>unmountVolumes<\/strong>\uff1a\u786e\u4fdd Pod \u5220\u9664\u540e volumes \u88ab unmount \u3002\u904d\u5386\u4e00\u904d\u6240\u6709 ASW \u4e2d\u7684 Pod\uff0c\u82e5\u5176\u4e0d\u5728 DSW \u4e2d\uff08\u8868\u793a Pod \u88ab\u5220\u9664\uff09\uff0c\u6b64\u5904\u4ee5 VolumeMode=FileSystem \u4e3e\u4f8b\uff0c\u5219\u6267\u884c\u5982\u4e0b\u64cd\u4f5c\uff1a<\/p>\n<ol>\n<li>Remove all bind-mounts\uff1a\u8c03\u7528 Unmounter \u7684 TearDown \u63a5\u53e3\uff08\u82e5\u4e3a out-of-tree \u5219\u8c03\u7528\u00a0CSI \u63d2\u4ef6\u7684\u00a0NodeUnpublishVolume\u00a0\u63a5\u53e3\uff09\uff1b<\/li>\n<li>Unmount volume\uff1a\u8c03\u7528 DeviceUnmounter \u7684 UnmountDevice \u51fd\u6570\uff08\u82e5\u4e3a out-of-tree \u5219\u8c03\u7528\u00a0CSI \u63d2\u4ef6\u7684\u00a0NodeUnstageVolume\u00a0\u63a5\u53e3\uff09\uff1b<\/li>\n<li>\u66f4\u65b0 ASW \u3002<\/li>\n<\/ol>\n<p><strong>mountAttachVolumes<\/strong>\uff1a\u786e\u4fdd Pod \u8981\u4f7f\u7528\u7684 volumes \u6302\u8f7d\u6210\u529f\u3002\u904d\u5386\u4e00\u904d\u6240\u6709 DSW \u4e2d\u7684 Pod\uff0c\u82e5\u5176\u4e0d\u5728 ASW \u4e2d\uff08\u8868\u793a\u76ee\u5f55\u5f85\u6302\u8f7d\u6620\u5c04\u5230 Pod \u4e0a\uff09\uff0c\u6b64\u5904\u4ee5 VolumeMode=FileSystem \u4e3e\u4f8b\uff0c\u6267\u884c\u5982\u4e0b\u64cd\u4f5c\uff1a<\/p>\n<ol>\n<li>\u7b49\u5f85 volume \u6302\u63a5\u5230\u8282\u70b9\u4e0a\uff08\u7531 External Attacher or Kubelet \u672c\u8eab\u6302\u63a5\uff09\uff1b<\/li>\n<li>\u6302\u8f7d volume \u5230\u5168\u5c40\u76ee\u5f55\uff1a\u8c03\u7528 DeviceMounter \u7684 MountDevice \u51fd\u6570\uff08\u82e5\u4e3a out-of-tree \u5219\u8c03\u7528\u00a0CSI \u63d2\u4ef6\u7684\u00a0NodeStageVolume\u00a0\u63a5\u53e3\uff09\uff1b<\/li>\n<li>\u66f4\u65b0 ASW\uff1a\u8be5 volume \u5df2\u6302\u8f7d\u5230\u5168\u5c40\u76ee\u5f55\uff1b<\/li>\n<li>bind-mount volume \u5230 Pod \u4e0a\uff1a\u8c03\u7528 Mounter \u7684\u00a0SetUp\u00a0\u63a5\u53e3\uff08\u82e5\u4e3a out-of-tree \u5219\u8c03\u7528\u00a0CSI \u63d2\u4ef6\u7684\u00a0NodePublishVolume\u00a0\u63a5\u53e3\uff09\uff1b<\/li>\n<li>\u66f4\u65b0 ASW \u3002<\/li>\n<\/ol>\n<p><strong>unmountDetachDevices<\/strong>\uff1a\u786e\u4fdd\u9700\u8981 unmount\u00a0\u7684 volumes \u88ab unmount \u3002\u904d\u5386\u4e00\u904d\u6240\u6709 ASW\u00a0\u4e2d\u7684\u00a0UnmountedVolumes\uff0c\u82e5\u5176\u4e0d\u5728 DSW \u4e2d\uff08\u8868\u793a volume \u5df2\u65e0\u9700\u4f7f\u7528\uff09\uff0c\u6267\u884c\u5982\u4e0b\u64cd\u4f5c\uff1a<\/p>\n<ol>\n<li>Unmount volume\uff1a\u8c03\u7528 DeviceUnmounter \u7684 UnmountDevice \u51fd\u6570\uff08\u82e5\u4e3a out-of-tree \u5219\u8c03\u7528\u00a0CSI \u63d2\u4ef6\u7684 NodeUnstageVolume \u63a5\u53e3\uff09\uff1b<\/li>\n<li>\u66f4\u65b0 ASW \u3002<\/li>\n<\/ol>\n<h1>\u603b\u7ed3<\/h1>\n<p> <\/p>\n<p>\u672c\u6587\u5148\u5bf9\u00a0K8s\u00a0\u6301\u4e45\u5316\u5b58\u50a8\u57fa\u7840\u6982\u5ff5\u53ca\u4f7f\u7528\u65b9\u6cd5\u8fdb\u884c\u4e86\u4ecb\u7ecd\uff0c\u5e76\u5bf9\u00a0K8s \u5185\u90e8\u5b58\u50a8\u6d41\u7a0b\u8fdb\u884c\u4e86\u6df1\u5ea6\u89e3\u6790\u3002\u5728 K8s \u4e0a\uff0c\u4f7f\u7528\u4efb\u4f55\u4e00\u79cd\u5b58\u50a8\u90fd\u79bb\u4e0d\u5f00\u4e0a\u9762\u7684\u6d41\u7a0b\uff08\u6709\u4e9b\u573a\u666f\u4e0d\u4f1a\u7528\u5230 attach\/detach \uff09\uff0c\u73af\u5883\u4e0a\u7684\u5b58\u50a8\u95ee\u9898\u4e5f\u4e00\u5b9a\u662f\u5176\u4e2d\u67d0\u4e2a\u73af\u8282\u51fa\u73b0\u4e86\u6545\u969c\u3002<\/p>\n<p>\u5bb9\u5668\u5b58\u50a8\u7684\u5751\u6bd4\u8f83\u591a\uff0c\u4e13\u6709\u4e91\u73af\u5883\u4e0b\u5c24\u5176\u5982\u6b64\u3002\u4e0d\u8fc7\u6311\u6218\u8d8a\u591a\uff0c\u673a\u9047\u4e5f\u8d8a\u591a\uff01\u76ee\u524d\u56fd\u5185\u4e13\u6709\u4e91\u5e02\u573a\u5728\u5b58\u50a8\u9886\u57df\u4e5f\u662f\u7fa4\u96c4\u9010\u9e7f\uff0c\u6211\u4eec\u654f\u6377 PaaS \u5bb9\u5668\u56e2\u961f\u6b22\u8fce\u5927\u4fa0\u7684\u52a0\u5165\uff0c\u4e00\u8d77\u5171\u521b\u672a\u6765\uff01<\/p>\n<h1>\u53c2\u8003\u94fe\u63a5<\/h1>\n<p> <\/p>\n<ol>\n<li>Kubernetes \u793e\u533a\u6e90\u7801<\/li>\n<li> [\u4e91\u539f\u751f\u516c\u5f00\u8bfe] Kubernetes \u5b58\u50a8\u67b6\u6784\u53ca\u63d2\u4ef6\u4f7f\u7528\uff08\u90e1\u5b9d\uff09<\/li>\n<li> [\u4e91\u539f\u751f\u516c\u5f00\u8bfe] \u5e94\u7528\u5b58\u50a8\u548c\u6301\u4e45\u5316\u6570\u636e\u5377 &#8211; \u6838\u5fc3\u77e5\u8bc6\uff08\u81f3\u5929\uff09<\/li>\n<li> [ kubernetes-design-proposals ] volume-provisioning<\/li>\n<li> [ kubernetes-design-proposals ] CSI Volume Plugins in Kubernetes Design Doc<\/li>\n<\/ol>\n<h1>\u4e91\u539f\u751f\u5e94\u7528\u56e2\u961f\u62db\u4eba\u5566\uff01<\/h1>\n<p> <\/p>\n<p>\u963f\u91cc\u4e91\u539f\u751f\u5e94\u7528\u5e73\u53f0\u56e2\u961f\u76ee\u524d\u6c42\u8d24\u82e5\u6e34\uff0c\u5982\u679c\u4f60\u6ee1\u8db3\uff1a<\/p>\n<ul>\n<li>\n<p>\u5bf9\u5bb9\u5668\u548c\u57fa\u7840\u8bbe\u65bd\u76f8\u5173\u9886\u57df\u7684\u4e91\u539f\u751f\u6280\u672f\u5145\u6ee1\u70ed\u60c5\uff0c\u5728\u76f8\u5173\u9886\u57df\u5982 Kubernetes \u3001Serverless \u5e73\u53f0\u3001\u5bb9\u5668\u7f51\u7edc\u4e0e\u5b58\u50a8\u3001\u8fd0\u7ef4\u5e73\u53f0\u7b49\u4e91\u539f\u751f\u57fa\u7840\u8bbe\u65bd\u5176\u4e2d\u67d0\u4e00\u65b9\u5411\u6709\u4e30\u5bcc\u7684\u79ef\u7d2f\u548c\u7a81\u51fa\u6210\u679c\uff08\u5982\u4ea7\u54c1\u843d\u5730\uff0c\u521b\u65b0\u6280\u672f\u5b9e\u73b0\uff0c\u5f00\u6e90\u8d21\u732e\uff0c\u9886\u5148\u7684\u5b66\u672f\u6210\u679c\uff09\uff1b<\/p>\n<\/li>\n<li>\n<p>\u4f18\u79c0\u7684\u8868\u8fbe\u80fd\u529b\uff0c\u6c9f\u901a\u80fd\u529b\u548c\u56e2\u961f\u534f\u4f5c\u80fd\u529b\uff1b\u5bf9\u6280\u672f\u548c\u4e1a\u52a1\u6709\u524d\u77bb\u6027\u601d\u8003\uff1b\u5177\u5907\u8f83\u5f3a\u7684 ownership\uff0c\u4ee5\u7ed3\u679c\u4e3a\u5bfc\u5411\uff0c\u5584\u4e8e\u51b3\u7b56\uff1b<\/p>\n<\/li>\n<li>\n<p>\u81f3\u5c11\u719f\u6089 Java \u3001Golang \u4e2d\u7684\u4e00\u9879\u7f16\u7a0b\u8bed\u8a00\uff1b<\/p>\n<\/li>\n<li>\n<p>\u672c\u79d1\u53ca\u4ee5\u4e0a\u5b66\u5386\u30013 \u5e74\u4ee5\u4e0a\u5de5\u4f5c\u7ecf\u9a8c\u3002<\/p>\n<\/li>\n<\/ul>\n<p>\u7b80\u5386\u53ef\u6295\u9012\u81f3\u90ae\u7bb1\uff1a [email&#160;protected]-inc.com \uff0c\u5982\u6709\u7591\u95ee\u6b22\u8fce\u52a0\u5fae\u4fe1\u54a8\u8be2\uff1aTheBeatles1994 \u3002<\/p>\n<blockquote>\n<p>\u201c\u963f\u91cc\u5df4\u5df4\u4e91\u539f\u751f\u5173\u6ce8\u5fae\u670d\u52a1\u3001Serverless \u3001\u5bb9\u5668\u3001Service Mesh \u7b49\u6280\u672f\u9886\u57df\u3001\u805a\u7126\u4e91\u539f\u751f\u6d41\u884c\u6280\u672f\u8d8b\u52bf\u3001\u4e91\u539f\u751f\u5927\u89c4\u6a21\u7684\u843d\u5730\u5b9e\u8df5\uff0c\u505a\u6700\u61c2\u4e91\u539f\u751f\u5f00\u53d1\u8005\u7684\u516c\u4f17\u53f7\u3002\u201d<\/p>\n<\/blockquote><\/div>\n<div> <b>\u5927\u4f6c\u6709\u8a71\u8aaa<\/b> (<span>1<\/span>)        <\/div>\n<div> <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<ul>\n<li data-pid=\"1295384\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : hardysimpson1984 <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             \u5927\u5bb6\u597d\uff0c\u6211\u5c31\u662f\u60e0\u5fd7\u6240\u5728\u56e2\u961f\u7684 Leader\uff0c\u6211\u4eec\u6b63\u5728\u5f00\u653e\u62db\u8058\u54e6\uff0c\u8be6\u89c1\u62db\u8058\u8d34\uff1a https:\/\/v2ex.com\/t\/659081#reply4<\/p>\n<p>\u4e5f\u53ef\u4ee5\u76f4\u63a5\u52a0\u6211\u7684\u5fae\u4fe1\u804a<\/p>\n<p>[\u5730\u5740]( https:\/\/i.loli.net\/2020\/04\/03\/zWacUtgkdmHXNu5.jpg)                                                            <\/p><\/div>\n<\/p><\/div>\n<\/li>\n<li>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u6587\u8bfb\u61c2 K8s \u6301\u4e45\u5316\u5b58\u50a8\u6d41\u7a0b &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/90512"}],"collection":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=90512"}],"version-history":[{"count":0,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/90512\/revisions"}],"wp:attachment":[{"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=90512"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=90512"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=90512"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}