View a markdown version of this page

永久存储选项 - Amazon EKS

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

永久存储选项

什么是树内和树外卷插件?

在引入容器存储接口 (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 的音量插件

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

为了在 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

与 CSI 插件相关的代码以树外脚本和二进制文件形式提供,这些脚本和二进制文件通常以容器镜像的形式分发,并使用标准 Kubernetes 结构(如和)进行部署。 DaemonSets StatefulSetsCSI 插件处理 Kubernetes 中的各种卷管理操作。CSI 插件通常由节点插件(以a的形式在每个节点上运行 DaemonSet)和控制器插件组成。

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

亚马逊 EKS 优化的 Windows AMI 包括从 2022 年 4 月 CSI-proxy 起的内容。客户可以在 Windows 节点上使用 SMB CSI 驱动程序访问适用于 Windows 文件服务器的 Amazon FSx 、适用于 NetApp ONTAP SMB 共享的 A mazon FSx 、 and/or AWS 存储网关 — 文件网关。

以下博客详细介绍了如何设置 SMB CSI 驱动程序以使用适用于 Windows 文件服务器的 Amazon FSx 作为 Windows Pod 的永久存储。

适用于 Windows File Server 的 Amazon FSx

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

在下面的示例中,路径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

以下博客详细介绍了如何将适用于 Windows 文件服务器的 Amazon FSx 设置为 Windows Pod 的永久存储。