亚马逊AWS官方博客

使用 FSx for NetApp ONTAP 实现 Amazon EKS 和 Windows 访问同一份数据

概述

在企业环境中,常会存在 Linux 和 Windows 工作负载需要访问相同的数据的情况。例如,在证券行业以及媒体和娱乐工作负载通常涉及 Windows 用户访问 Linux 计算实例生成的数据,并且这些数据的并发访问需要多协议访问:Linux 工作负载使用 NFS 协议,Windows 工作负载使用 SMB 协议。常见解决方案基本是多协议共享存储,这种存储允许通过 Linux 和 Windows 呈现相同的数据集,以便每个操作系统都可以使用其本机文件协议访问数据。Amazon FSx for NetApp ONTAP,为 Linux、Windows 和 macOS 工作负载提供了对完全托管的共享存储的并发、多协议访问功能。使用它可将 Linux 和 Windows 工作负载整合到单个服务或文件系统中,有助于减少企业环境中的开销和复杂性(操作参考这里)。

但随着企业应用现代化架构的演进,此类应用开始了容器化。容器技术是建立在 Linux 内核特性之上的应用程序打包和隔离技术,它利用 Linux 的 namespace 和 cgroups 等机制实现了轻量级的虚拟化,与传统 Linux 工作负载的运行方式有较大差异,故需要探寻支持容器工作负载与 Windows 工作负载访问相同数据的方案。

在本博客中,我们将演示如何使用 FSx for NetApp ONTAP、NetApp ONTAP CLI、Trident 为 ONTAP 卷设置支持 EKS 与 Windows 对同一 FSx 的多协议访问。

解决方案

方案整体架构如下图所示:

EC2 上的 Linux 工作负载与 Windows 工作负载使用 ONTAP 来访问同一份数据的实现逻辑是把 Linux 工作负载加入到 AD 中,然后在 OS 层级用 AD 账号来运行程序访问 ONTAP 卷。但容器工作负载无法以 AD 账号来运行程序,所以本方案的核心实现逻辑是 EKS 借助于 Trident 插件以 ONTAP 的管理员账号来访问卷,达到了多协议访问的目的。由于 EKS 避开了 AD 的管控,在生产环境上则需充分认识到这个特点,可考虑在 EKS 侧加强 Pod 使用 ONTAP 卷的许可管控。

各组件及方案设计思路可参考如下:

FSx for NetApp ONTAP

Amazon FSx for NetApp ONTAP 是一项完全托管的共享存储服务,它将 NetApp 的 ONTAP 文件系统与 AWS 云的优势相结合。它提供了更丰富的企业级功能和多协议支持,特别适合需要 NetApp 功能的工作负载或从 NetApp 环境迁移到 AWS 的客户。更详细产品信息请参考官网手册。本方案主要使用它的多协议存储协议支持、管理功能、托管服务优势。

NetApp ONTAP CLI(命令行界面)是管理 NetApp ONTAP 存储系统的主要工具之一,提供了全面的命令集用于配置、监控和管理 ONTAP 存储环境。具体使用可参考 AWS 官网手册

AWS Managed Microsoft AD

Microsoft Active Directory (AD) 是微软开发的目录服务,主要用于在 Windows 环境中进行身份验证和授权,是企业网络环境中最常用的身份管理解决方案之一。

AWS Directory Service for Microsoft Active Directory(也称为 AWS Managed Microsoft AD)是 AWS 提供的一项完全托管的 Microsoft Active Directory 服务。

它基于实际的 Microsoft Active Directory 构建,并由 AWS 负责管理底层基础设施。FSx for NetApp ONTAP 常使用 AD 来管理 ONTAP 和 Windows 工作负载的用户,本方案使用 AWS Managed Microsoft AD 来担当此任。

Amazon  EKS

Amazon Elastic Kubernetes Service (EKS)是一个托管服务,让客户能够在 AWS 上轻松运行 Kubernetes,而无需成为 Kubernetes 运维专家。EKS 作为完全兼容 Kubernetes 的云服务,与大型金融机构的 IDC 容器技术栈十分 Match,越来越受金融行业青睐,成为其云上容器平台的首选。

CSI 与 Trident

CSI (Container Storage Interface) 是 Kubernetes 的一个存储接口标准(标准规范参考这里),它为 Kubernetes 与外部存储系统之间提供了一个统一的通信接口。CSI 的出现解决了 Kubernetes 存储扩展性的问题,使存储供应商能够开发独立于 Kubernetes 代码库的插件。

Trident 是 NetApp 维护的一个完全支持的开源项目,一个符合 CSI (Container Storage Interface) 的动态存储编排器,与 Kubernetes 原生集成,支持在所有流行的 Netapp 存储平台上消费和管理存储资源,无论是在公共云中还是在本地。其架构参考如下:

在 EKS 中使用 Trident 来作为 CSI 插件才能更好地使用、管理 ONTAP 存储。更多信息可参考其官网信息

tridentctl 是包含在 Trident 安装包里的命令行工具,可提供对 Trident 的简单访问,如创建、删除、倒入资源等功能。本方案将会主要使用它的导入管理功能。详细信息可参考其官网说明

部署操作

条件准备

1)VPC 及子网。准备 1 个 VPC,划分公有子网与私有子网,并配置好 IGW 及 NAT。

2)1 台操作机 EC2。准备 VPC 内的操作机 1 台,并在上面安装 aws cli(安装参考官网手册)及操作 EKS 集群的工具 eksctl 与 kubectl(安装参考官网手册)。

3)1 台 Windows EC2。用来管理 AD 及充当 Windows 工作负载用。

部署步骤

1)AWS Managed Microsoft AD 部署

本方案使用 AWS Managed Microsoft AD 来为 ONTAP 和 Windows 工作负载管理用户(当然实际生产您可以使用自己的 AD 方案),具体部署步骤可参考 AWS 官方手册

部署后的 AD 参考下图:

【Windows 工作负载加入 AD】

Windows 工作负载加入 AD,需要先把所在 VPC 加入 AD。

具体操作:

1)创建新的 DHCP 选项集,域名设为 AD 域名,域名服务使用 AD 的 DNS 地址

2)编辑 VPC 设置,选择刚创建的 DHCP 选项集

具体可参考下图:

登陆 Windows 工作负载,参考下图操作可把其加入到 AD 中:

如果同时希望在该 Windows 上管理 AD,可参考 AWS 官网手册进行操作。

2)FSx for NetApp ONTAP 部署

参考 AWS 官网手册,部署 FSx for NetApp ONTAP,其中关键环节参考截图如下:

当所创建 ONTAP 文件系统的状态为“可用”时,则表明创建成功。

整个创建过程,需要特别注意的部分如下:

1)选择加入之前创建的 AD,要准确填写 AD 的各种参数信息

2)创建时要选择安全组,建议提前创建好(具体安全组规则内容,参考官网手册

3)关联路由表,建议设置使用或者管理 ONTAP 的子网所关联的路由表。如果需要追加新的路由表关联,可在创建后的 ONTAP 的【网络与安全性】面板中进行修改。

3)ONTAP 配置多协议共享

使用创建 ONTAP 时配置的文件系统管理员 fsxadmin 及口令以 SSH 方式登陆 ONTAP 管理地址(在 AWS 控制台的【网络和安全性】面板中可以找到),进入 NetApp ONTAP CLI 界面。

登陆命令参考如下:

ssh fsxadmin@10.10.255.234

使用 NetApp ONTAP CLI 来进行如下配置(注意使用上面创建的 AD 及 ONTAP 的 SVM 信息):

a. 创建客户端配置(client-config),需指定创建的配置名称

vserver services name-service ldap client create -vserver mutisvm2 -client-config <ad2> -ad-domain cblad2.com -base-dn "OU=mutitest2,DC=cblad2,DC=com" -schema AD-IDMU

b. 创建 ldap(使用客户端配置),使用刚创建的客户端配置

vserver services name-service ldap create -vserver mutisvm2 -client-config <ad2>

c. 修改命名服务的 ns-switch 配置

vserver services name-service ns-switch modify -vserver mutisvm2 -database passwd,group -sources files,ldap

d. 创建 name-mapping

vserver name-mapping create -vserver mutisvm2 -direction UNIX-win -position 1 -pattern (.+) -replacement mutitest2\\\

4)EKS 集群部署

使用之前规划好的 VPC 与 EKS 子网来创建集群。可使用 eksctl 创建:

eksctl create cluster -f {cluster_define_yaml_filepath}

说明:金融场景的 EKS 集群多为私有网络集群,此处建议使用私有子网,并有专用路由表(此路由表请参考步骤 2 的介绍与 ontap 关联)。

5)配置 EKS Node 与 ONTAP 互访

修改 EKS Node 的 IAM Role,增加操作 FSx 的权限:

修改 EKS Node 关联的安全组,增加与 ONTAP 通信使用的端口(111、2049、635、17546、4045、4046、4049)许可,具体端口用途参考 AWS 官网手册

6)Trident 插件安装

参考 Trident 官网手册,选择自己熟悉的方式安装 Trident CSI 插件进行插件安装。

下面介绍其中一种以离线 helm 方式结合私有仓库形式安装的方法。

a. 安装 helm

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

成功后查看版本信息确认

b. 添加 Astra trident 的 helm repo 文件

helm repo add netapp-trident https://netapp.github.io/trident-helm-chart

命令成功做使用 search repo 确认

c. 把 Trident 所需的 image 放到私有仓库

Trident 官网页面查看具体需要的 Docker Image 信息

下载所有 docker images,并导入到私有仓库

结果如下图所示:

d. 使用私有仓库以 helm 方式安装 trident

helm install <name> netapp-trident/trident-operator --version 100.2410.0 --set imageRegistry=<your-registry> --set operatorImage=<your-registry>/trident-operator:24.10.0 --set tridentAutosupportImage=<your-registry>/trident-autosupport:24.10.0 --set tridentImage=<your-registry>/trident:24.10.0 --create-namespace --namespace <trident-namespace> 

命令执行成功后,使用 kubectl get pods 命令查看 trident-XXX 的 pod 处于 Running 状态则说明安装成功

7)为 EKS 集群创建 ONTAP 的 Backend

配置 ONTAP 作为 EKS 的存储 Backend,需要解决 EKS 到 ONTAP 的认证问题,这部分可参考 Trident 官网的如下说明:

具体步骤如下:

a. 先创建 secret

Yaml 文件定义参考如下:

apiVersion: v1
kind: Secret
metadata:
  name: backend-ontap-nas-secret
type: Opaque
stringData:
  username: vsadmin
  password: <your password> 

执行命令参考如下:

kubectl apply -f <secret file path>

b. 再创建 backend

Yaml 文件定义如下:

apiVersion: trident.netapp.io/v1
kind: TridentBackendConfig
metadata:
  name: backend-ontap-nas
spec:
  version: 1
  backendName: ontap-nas-backend
  storageDriverName: ontap-nas
  managementLIF: <10.10.255.195,your ontap manage ip>
  svm: mutisvm2
  aws:
    fsxFilesystemID: <fs-0e726226b5d568529,your ontap fs id>
    apiRegion: ap-east-1
  credentials:
    name: backend-ontap-nas-secret
  autoExportCIDRs:
    - <10.10.0.0/16, cidr can using >
  autoExportPolicy: true
  debugTraceFlags: {“api”:true, “method”:true}

执行命令参考如下:

kubectl apply -f <secret file path>

可通过 tridentctl 命令查看执行结果,state 为 online 则说明成功

8)为 EKS 集群创建 ONTAP 的 StorageClass

Yaml 文件定义参考如下:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ontap-nas
provisioner: csi.trident.netapp.io
parameters:
  backendType: "ontap-nas"

执行命令参考如下:

kubectl apply -f <secret file path>

注意:此处 backendType 的值和 backend 配置文件里的 storageDriverName 要保持一致。

9)ONTAP 上创建卷

在 ONTAP 的【卷】面板,创建用于 EKS 和 Windows 共享的卷

10)用 tridentctl 把 ONTAP 卷导入 EKS 集群中

tridentctl 可以把 ONTAP 卷导入到 EKS 中,并创建 PVC。

用于和导入卷的 Mapping 的 PVC 定义文件参考如下:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: import-ontap-pvc08-mutivol8
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 30Mi
  storageClassName: ontap-nas

注意:storageClassName 使用之前创建的值

执行命令参考如下:

./tridentctl import volume <ontap-nas-backend,your backend name> <mutivol8,existing volume> -f <../cbl-ontapconfig/import-pvc-04-mutivol8.yaml,pvc file path> -n trident --debug

执行效果参考下图:

11)ONTAP 卷设置为共享

此时进入 NetApp ONTAP CLI 界面,执行如下命令,把刚才的卷设为共享以便 Windows 访问

vserver cifs share create -share-name <mutivol-sharepod8,your setting sharename for windows> -path /mutivol8 -vserver mutisvm2

结果验证

1)使用 AD 账号登陆 Windows 工作负载,以 SMB 协议访问 ONTAP 共享卷,并可写入测试内容

访问共享路径{svm名.ad域名/共享路径名},可创建文件写入测试内容

参考如图:

2)EKS 集群创建 Pod 使用该共享卷,并查看 Windows 负载写入的内容

创建 pod 并使用之前导入 ONTAP 卷时创建的 pvc

Pod 的 yaml 定义参考如下:

apiVersion: v1
kind: Pod
metadata:
  name: ontap-app-exist-importpvc11
spec:
  containers:
    - name: ontap-app-exist-importpvc11
      image: 459952949714.dkr.ecr.ap-east-1.amazonaws.com/cblecr/awspublic/aws-cli:2.13.13
      command: ["/bin/sh","-c"]
       #args: ["-c", "echo 111111111;sleep 10"]
      args: [ date; sleep 10; echo 'Hello from the Kubernetes cluster'; sleep 1; while true; do sleep 20; done;]
      volumeMounts:
        - name: persistent-storage
          mountPath: /data
  volumes:
    - name: persistent-storage
      persistentVolumeClaim:
        claimName: <import-ontap-pvc08-mutivol8,the pvc name of imported volume>

pod 创建成功后,执行如下命令后进入 pod,确认卷中的由 Windows 创建的文件可以访问

kubectl exec -it {pod}  -- bash

3)在 pod 上可使用 echo 命令在卷上创建文件并写入内容

4)在 Windows 工作负载中能看到 pod 创建的文件及内容

通过上述验证说明:在 ONTAP 的多协议共享访问功能支持下,针对同一个存储卷,EKS 上的容器工作负载可以 NAS 方式(原生 NFS 协议)、Windows 工作负载可以用原生 SMB 协议对同一份数据可以进行访问。

总结

在本博客中,我们演示介绍了一种如何使用 FSx for NetApp ONTAP、NetApp ONTAP CLI、Trident 为 ONTAP 卷设置支持 EKS 与 Windows 对同一个卷的多协议访问的方法,为金融及其它行业云上容器化应用与 Windows 应用同时并发访问同一份数据的场景提供了解决方案。

本篇作者

崔保亮

亚马逊云科技金融行业解决方案架构师

郑金霞

亚马逊云科技金融行业解决方案架构师

胡仲海

华泰证券架构委员会架构师

Ricky Chu

华泰金控(香港)资讯科技部基础设施项目经理