

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 永久存储选项
<a name="windows-storage"></a>

## 什么是树内插件与 out-of-tree音量插件？
<a name="_what_is_an_in_tree_vs_out_of_tree_volume_plugin"></a>

在引入容器存储接口 (CSI) 之前，所有卷插件都是树内的，这意味着它们是与核心 Kubernetes 二进制文件一起构建、链接、编译和发布的，并扩展了核心 Kubernetes API。这意味着向 Kubernetes（卷插件）添加新的存储系统需要将代码签入核心 Kubernetes 代码存储库。

Out-of-tree 卷插件是独立于 Kubernetes 代码库开发的，并作为扩展部署（安装）在 Kubernetes 集群上。这使供应商能够更新驱动程序 out-of-band，即与 Kubernetes 发布周期分开更新。这在很大程度上是可能的，因为 Kubernetes 创建了一个存储接口或 CSI，为供应商提供了一种与 k8s 接口的标准方式。

你可以在.html 上查看有关 Amazon Elastic Kubernetes 服务 (EKS) 存储类和 CSI 驱动程序的更多信息 https://docs.aws.amazon.com/eks/ latest/userguide/storage

## 适用于 Windows 的树内音量插件
<a name="_in_tree_volume_plugin_for_windows"></a>

Kubernetes 卷允许在 Kubernetes 上部署具有数据持久性要求的应用程序。永久卷的管理由 Pod 中的provisioning/de-provisioning/resizing of volumes, attaching/detaching a volume to/from a Kubernetes node, and mounting/dismounting a volume to/from各个容器组成。用于为特定存储后端或协议实现这些卷管理操作的代码以 Kubernetes 卷插件**（树内卷插件）**的形式提供。在亚马逊 Elastic Kubernetes 服务 (EKS) 上，Windows 支持以下类别的 Kubernetes 卷插件：

 *[树内音量插件：存储 awsElasticBlock](https://kubernetes.io/docs/concepts/storage/volumes/#awselasticblockstore)* 

为了在 Windows 节点上使用树内卷插件，需要创建一个额外的插件 StorageClass 来使用 NTFS 作为 fStype。在 EKS 上，默认值 StorageClass 使用 ext4 作为默认 fStype。

A StorageClass 为管理员提供了一种描述他们提供的存储 “类别” 的方法。不同的类别可能会映射到集群管理员确定的 quality-of-service级别、备份策略或任意策略。Kubernetes 对类代表什么并不固执己见。在其他存储系统中，此概念有时被称为 “配置文件”。

你可以通过运行以下命令来检查它：

```
kubectl describe storageclass gp2
```

输出：

```
Name:            gp2
IsDefaultClass:  Yes
Annotations:     kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClas
","metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"},"name":"gp2"},"parameters":{"fsType"
"ext4","type":"gp2"},"provisioner":"kubernetes.io/aws-ebs","volumeBindingMode":"WaitForFirstConsumer"}
,storageclass.kubernetes.io/is-default-class=true
Provisioner:           kubernetes.io/aws-ebs
Parameters:            fsType=ext4,type=gp2
AllowVolumeExpansion:  <unset>
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     WaitForFirstConsumer
Events:                <none>
```

要创建支持 **NTFS 的新 StorageClass 版本**，请使用以下清单：

```
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: gp2-windows
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  fsType: ntfs
volumeBindingMode: WaitForFirstConsumer
```

 StorageClass 通过运行以下命令创建：

```
kubectl apply -f NTFSStorageClass.yaml
```

下一步是创建永久卷声明 (PVC)。

 PersistentVolume (PV) 是集群中由管理员配置或使用 PVC 动态配置的一块存储。它是群集中的资源，就像节点是群集资源一样。此 API 对象捕获存储的实施细节，无论是 NFS、iSCSI 还是 cloud-provider-specific存储系统。

 PersistentVolumeClaim (PVC) 是用户对存储的请求。索赔可以请求特定的大小和访问模式（例如，它们可以挂载 ReadWriteOnce， ReadOnlyMany 或 ReadWriteMany）。

对于不同的 PersistentVolumes 用例，用户需要不同的属性，例如性能。集群管理员需要能够提供各种不同的功能 PersistentVolumes ，而不仅仅是大小和访问模式，而不必让用户了解这些卷的实施细节。对于这些需求，有足够的 StorageClass 资源。

在下面的示例中，PVC 是在命名空间窗口中创建的。

```
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ebs-windows-pv-claim
  namespace: windows
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: gp2-windows
  resources:
    requests:
      storage: 1Gi
```

通过运行以下命令创建 PVC：

```
kubectl apply -f persistent-volume-claim.yaml
```

以下清单创建了一个 Windows Pod，将 as 设置 VolumeMount 为`C:\Data`并使用 PVC 作为附加存储`C:\Data`。

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: windows-server-ltsc2019
  namespace: windows
spec:
  selector:
    matchLabels:
      app: windows-server-ltsc2019
      tier: backend
      track: stable
  replicas: 1
  template:
    metadata:
      labels:
        app: windows-server-ltsc2019
        tier: backend
        track: stable
    spec:
      containers:
      - name: windows-server-ltsc2019
        image: mcr.microsoft.com/windows/servercore:ltsc2019
        ports:
        - name: http
          containerPort: 80
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - mountPath: "C:\\data"
          name: test-volume
      volumes:
        - name: test-volume
          persistentVolumeClaim:
            claimName: ebs-windows-pv-claim
      nodeSelector:
        kubernetes.io/os: windows
        node.kubernetes.io/windows-build: '10.0.17763'
```

通过以下方式访问 Windows 窗格来测试结果 PowerShell：

```
kubectl exec -it podname powershell -n windows
```

在 Windows 窗格中，运行：`ls`

输出：

```
PS C:\> ls


    Directory: C:\


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----          3/8/2021   1:54 PM                data
d-----          3/8/2021   3:37 PM                inetpub
d-r---          1/9/2021   7:26 AM                Program Files
d-----          1/9/2021   7:18 AM                Program Files (x86)
d-r---          1/9/2021   7:28 AM                Users
d-----          3/8/2021   3:36 PM                var
d-----          3/8/2021   3:36 PM                Windows
-a----         12/7/2019   4:20 AM           5510 License.txt
```

**数据目录**由 EBS 卷提供。

## Out-of-tree 适用于 Windows
<a name="_out_of_tree_for_windows"></a>

与 CSI 插件关联的代码以脚本和二进制文件形式发布，这些 out-of-tree脚本和二进制文件通常作为容器镜像分发，并使用标准 Kubernetes 构造（如和）进行部署。 DaemonSets StatefulSetsCSI 插件可以处理 Kubernetes 中的各种卷管理操作。CSI 插件通常由节点插件（作为一个节点在每个节点上运行 DaemonSet）和控制器插件组成。

CSI 节点插件（尤其是那些与作为块设备或通过共享文件系统公开的永久卷相关的插件）需要执行各种特权操作，例如扫描磁盘设备、挂载文件系统等。这些操作因每个主机操作系统而异。对于 Linux 工作节点，容器化 CSI 节点插件通常部署为特权容器。对于 Windows 工作节点，使用 [csi-proxy 支持容器化 CSI 节点插件的特权操作，csi-proxy](https://github.com/kubernetes-csi/csi-proxy) 是一个由社区管理的独立二进制文件，需要预先安装在每个 Windows 节点上。

 从 [2022 年 4 月起，亚马逊 EKS 优化的 Windows AMI](https://docs.aws.amazon.com/eks/latest/userguide/eks-optimized-windows-ami.html) 包括 CSI-Proxy。客户可以使用 Windows 节点上的 [SMB CSI 驱动程序](https://github.com/kubernetes-csi/csi-driver-smb)访问适用于 Windows [文件服务器的亚马逊、 FSx 适用于 NetApp ](https://aws.amazon.com/fsx/windows/) [ONTAP 中小型企业共享 FSx 的亚马逊](https://aws.amazon.com/fsx/netapp-ontap/)、 and/or [AWS Storage Gateway — 文件网关](https://aws.amazon.com/storagegateway/file/)。

以下[博客](https://aws.amazon.com/blogs/modernizing-with-aws/using-smb-csi-driver-on-amazon-eks-windows-nodes/)详细介绍了如何设置 SMB CSI Driver 以使用 FSx 适用于 Windows 的 Amazon 文件服务器作为 Windows Pod 的永久存储空间。

## FSx 适用于 Windows 文件服务器的亚马逊
<a name="_amazon_fsx_for_windows_file_server"></a>

一种选择是通过名为 SMB Gl [obal Map](https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/persistent-storage) ping 的 SMB 功能使用 Amazon FSx for Windows 文件服务器，该功能允许在主机上挂载 SMB 共享，然后将该共享上的目录传递到容器中。容器不需要配置特定的服务器、共享、用户名或密码，而这些都是在主机上处理的。该容器的工作原理与本地存储相同。

SMB Global Mapping 对协调器是透明的，通过它进行安装， HostPath 这可能**意味着存在安全问题**。

在下面的示例中，路径`G:\Directory\app-state`是 Windows 节点上的 SMB 共享。

```
apiVersion: v1
kind: Pod
metadata:
  name: test-fsx
spec:
  containers:
  - name: test-fsx
    image: mcr.microsoft.com/windows/servercore:ltsc2019
    command:
      - powershell.exe
      - -command
      - "Add-WindowsFeature Web-Server; Invoke-WebRequest -UseBasicParsing -Uri 'https://dotnetbinaries.blob.core.windows.net/servicemonitor/2.0.1.6/ServiceMonitor.exe' -OutFile 'C:\\ServiceMonitor.exe'; echo '<html><body><br/><br/><marquee><H1>Hello EKS!!!<H1><marquee></body><html>' > C:\\inetpub\\wwwroot\\default.html; C:\\ServiceMonitor.exe 'w3svc'; "
    volumeMounts:
      - mountPath: C:\dotnetapp\app-state
        name: test-mount
  volumes:
    - name: test-mount
      hostPath:
        path: G:\Directory\app-state
        type: Directory
  nodeSelector:
      beta.kubernetes.io/os: windows
      beta.kubernetes.io/arch: amd64
```

以下[博客](https://aws.amazon.com/blogs/containers/using-amazon-fsx-for-windows-file-server-on-eks-windows-containers/)详细介绍了如何将 Amazon FSx for Windows 文件服务器设置为 Windows Pod 的永久存储空间。