在 Openshift/Kubernetes 集群中通过 CLI 与 Trident 容器(NetApp)进行交互

94次阅读
没有评论

问题描述

在使用 Openshift/Kubernetes 环境中,使用 NetApp 的 Trident PV(持久卷)编排器动态创建卷时,希望能够通过 CLI 与运行在集群中的 Trident 容器进行交互。用户已经尝试了一些方法,但并不满意。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方法1:使用服务器字符串

可以使用 tridentctl CLI 的 -s--server 参数来指定要远程连接的服务器。在这种情况下,您可以通过远程 shell 进入 Trident 容器,然后将其指向与本地 Trident Orchestrator 守护程序进行交互。

例如:

$ oc -n trident rsh trident-6bdbdbc5dd-l8qtr
Defaulting container name to trident-main.
Use 'oc describe pod/trident-6bdbdbc5dd-l8qtr -n trident' to see all of the containers in this pod.
/ #

现在可以进行交互:

/ # tridentctl -s 127.0.0.1:8000 get backend
+--------------------------+----------------+--------+---------+
|           NAME           | STORAGE DRIVER | ONLINE | VOLUMES |
+--------------------------+----------------+--------+---------+
| ontapnas_192.168.101.101 | ontap-nas      | true   |     389 |
+--------------------------+----------------+--------+---------+
/ #

方法2:创建 Bash 函数

为了扩展上述方法,可以在 Bash 中构建一个 shell 函数或别名,以简化这种交互的过程。

在 Openshift 中:

tridentctl () {
    oc rsh -t -n trident -c trident-main \
        $(oc get pods -n trident -l app=trident.netapp.io -o jsonpath="{.items[].metadata.name}") \
        tridentctl -s 127.0.0.1:8000 $*
}

在 Kubernetes 中:

tridentctl () {
    kubectl exec -t -n trident \
        $(kubectl get pods -n trident -l app=trident.netapp.io -o jsonpath="{.items[].metadata.name}") \
        -c trident-main -- tridentctl -s 127.0.0.1:8000 $*
}

设置了其中一个函数后,您可以从 macOS 系统运行以下命令:

$ tridentctl get storageclass -o json
{
  "items": [
    {
      "Config": {
        "version": "1",
        "name": "basic",
        "attributes": {
          "backendType": "ontap-nas"
        },
        "storagePools": null,
        "additionalStoragePools": null
      },
      "storage": {
        "ontapnas_192.168.101.101": [
          "NA_01_aggr1",
          "NA_01_aggr2"
        ]
      }
    }
  ]
}

这些函数的工作原理是确定 trident 命名空间中 Pod 的名称,然后远程执行相同的方法(来自方法1)连接到 Pod 内运行的 Trident Orchestrator 守护程序,使用 --server 字符串。

使用这些方法的优点是可以使用函数/别名来编码它,使其更加简洁。

注意,使用上述 shell 函数/别名的方法无法与以下命令一起使用:

$ tridentctl create backend -f <backend-file>

因为您将在引用的文件 <backend-file> 中引用本地系统的文件系统,但实际上 tridentctl 命令将在另一个系统上的 Pod 中执行。该 Pod 无法访问您本地系统的文件系统。

在这种情况下,您的选择是将文件复制到 Pod 的 /tmp 文件系统中并从那里执行,或者通过管道(|)将文件的内容重定向,例如:

$ cat <backend-file> | tridentctl create backend -f -

参考链接:
NetApp Trident Read the Docs
Trident for Kubernetes (overview)
NetApp Trident (Github)

正文完