

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

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

## 什么是树内和树外卷插件？
<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 集群上。这使供应商能够带外更新驱动程序，即与 Kubernetes 发布周期分开更新。这在很大程度上是可能的，因为Kubernetes创建了一个存储接口或CSI，为供应商提供了与k8s接口的标准方式。

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

## In-tree 适用于 Windows 的音量插件
<a name="_in_tree_volume_plugin_for_windows"></a>

Kubernetes 卷使具有数据持久性要求的应用程序能够部署在 Kubernetes 上。永久卷的管理包括卷、一个卷、 attaching/detaching 一个 Kubernetes 节点和 to/from mounting/dismounting 一个卷（容器中的 to/from 单个容器）。 provisioning/de provisioning/resizing 为特定存储后端或协议实现这些卷管理操作的代码以 Kubernetes 卷插件**（卷插件）In-tree 的形式提供。**在亚马逊 Elastic Kubernetes Services (EKS) 上，Windows 支持以下类别的 Kubernetes 卷插件：

 *In-tree 音量插件：a * [ ws ElasticBlockStore ](https://kubernetes.io/docs/concepts/storage/volumes/#awselasticblockstore) 

为了在 Windows 节点上使用 In-tree 音量插件，必须创建一个附加插件 StorageClass 来使用 NTFS 作为 FSype。在 EKS 上，默认 StorageClass 使用 ext4 作为默认 FSype。

A StorageClass 为管理员提供了一种描述他们提供的存储 “类别” 的方法。不同的类别可能会映射到服务质量级别、备份策略或集群管理员确定的任意策略。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)。

A PersistentVolume (PV) 是集群中由管理员配置或使用 PVC 动态配置的一块存储。它是群集中的资源，就像节点是群集资源一样。此 API 对象捕获存储实施的详细信息，无论是 NFS、iSCSI 还是特定于云提供商的存储系统。

A 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，将其设置 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 Pod 中，运行：`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 插件相关的代码以树外脚本和二进制文件形式提供，这些脚本和二进制文件通常以容器镜像的形式分发，并使用标准 Kubernetes 结构（如和）进行部署。 DaemonSets StatefulSetsCSI 插件处理 Kubernetes 中的各种卷管理操作。CSI 插件通常由节点插件（以a的形式在每个节点上运行 DaemonSet）和控制器插件组成。

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

 [亚马逊 EKS 优化的 Windows AMI ](https://docs.aws.amazon.com/eks/latest/userguide/eks-optimized-windows-ami.html) 包括从 2022 年 4 月 CSI-proxy 起的内容。客户可以[在 Windows 节点上使用 ](https://github.com/kubernetes-csi/csi-driver-smb) SMB CSI 驱动程序访问适用于 Windows 文件服务器的 [ Amazon FSx ](https://aws.amazon.com/fsx/windows/)、适用于 NetApp ONTAP SMB 共享的 A [ mazon FSx ](https://aws.amazon.com/fsx/netapp-ontap/)、 and/or [ AWS 存储网关 — 文件网关。](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 驱动程序以使用适用于 Windows 文件服务器的 Amazon FSx 作为 Windows Pod 的永久存储。

## 适用于 Windows File Server 的 Amazon FSx
<a name="_amazon_fsx_for_windows_file_server"></a>

一种选择是通过一项名为 SMB 全球映射的 SMB 功能使用适用于 Windows 文件服务器的 Amazon F [ Sx，](https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/persistent-storage)该功能可以将中小型企业共享挂载到主机上，然后将该共享上的目录传递到容器中。容器不需要使用特定的服务器、共享、用户名或密码进行配置——所有这些都是在主机上处理的。该容器的工作原理与具有本地存储空间一样。

中小型企业全球映射对协调器是透明的，它是通过它安装的， 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/)详细介绍了如何将适用于 Windows 文件服务器的 Amazon FSx 设置为 Windows Pod 的永久存储。