Alluxio EnterpriseAI on K8s 部署教程

news2024/9/20 19:58:37

Alluxio Enterprise AI on K8s 部署视频教程

视频为Alluxio Enterprise AI on K8s 部署视频教程。下面内容将主要介绍如何通过 Operator(Kubernetes 管理应用程序的扩展)在 Kubernetes 上安装 Alluxio。

1. 系统要求

  • Kubernetes
    • 至少1.19版本的 Kubernetes 集群,支持特性门控
    • 确保集群的 Kubernetes 网络策略允许应用程序(Alluxio 客户端)与定义端口上的 Alluxio Pods 之间建立连接
    • Kubernetes 集群已安装至少3.6.0版本的 Helm 3
    • 用于存储和管理容器镜像的镜像仓库
  • 硬件
    • 每个节点至少 8个 CPU 和 32GB 内存
    • 每个节点至少100GB 的存储空间
  • 权限。参考:使用 RBAC 授权
    • 创建 CRD(自定义资源定义)的权限
    • 为 Operator Pod 创建 ServiceAccount、ClusterRole 和 ClusterRoleBinding 的权限
    • 创建 operator 所在命名空间的权限

2. 准备

2.1 下载 Alluxio operator 和 Alluxio 集群的安装包

请进入 Alluxio下载页面,选择 Alluxio Enterprise AI 进行下载,下载完成后解压文件。

$ tar zxf alluxio-enterprise-k8s-ai-trial.tar.gz

解压后可以得到以下文件:

  • alluxio-operator-2.0.0-helmchart.tgz 是部署 Alluxio operator 的 helm chart
  • alluxio-operator-2.0.0-docker.tar 是 Alluxio operator 的 docker 镜像
  • alluxio-enterprise-AI-3.3-7.0.0-docker.tar 是 Alluxio 的 docker 镜像

2.2 将镜像上传到镜像仓库

镜像仓库是存储和共享容器镜像的中心化位置。镜像仓库可以是公共的,也可以是私有的。云服务提供商会提供容器镜像仓库服务作为其云服务的一部分,
包括 Amazon Elastic Container Registry(ECR)、
Azure Container Registry(ACR)
和 Google Container Registry(GCR)。
您甚至可以在本地系统或组织内部运行私有镜像仓库。

以下示例展示了如何上传 Alluxio operator 镜像。

# 加载镜像到本地
$ docker load -i alluxio-operator-2.0.0-docker.tar
$ docker load -i alluxio-enterprise-AI-3.3-7.0.0-docker.tar

# 将镜像更改为私有镜像仓库
$ docker tag alluxio/operator:2.0.0 <YOUR.PRIVATE.REGISTRY.HERE>/alluxio-operator:2.0.0
$ docker tag alluxio/alluxio-enterprise:AI-3.3-7.0.0 <YOUR.PRIVATE.REGISTRY.HERE>/alluxio-enterprise:AI-3.3-7.0.0

# 上传镜像到私有镜像仓库
$ docker push <YOUR.PRIVATE.REGISTRY.HERE>/alluxio-operator:2.0.0
$ docker push <YOUR.PRIVATE.REGISTRY.HERE>/alluxio-enterprise:AI-3.3-7.0.0

2.3 为 operator 解压 helm chart

# 将文件解压到目录 alluxio-operator
$ tar zxf alluxio-operator-2.0.0-helmchart.tgz

解压后生成的 alluxio-operator 就是负责部署 operator 的 helm chart 文件

3. 部署

3.1 部署 Alluxio operator

创建 alluxio-operator/alliuxio-operator.yaml 文件指定镜像和版本,用于部署 operator。
以下示例展示了如何指定 operatorcsi 镜像和版本:

global:
  image: <YOUR.PRIVATE.REGISTRY.HERE>/alluxio-operator
  imageTag: 2.0.0

进入到 alluxio-operator 目录,执行以下命令部署 operator:

$ cd alluxio-operator
# 最后一个参数表示是 helm chart 文件的路径,"." 表示当前目录
$ helm install operator -f alluxio-operator.yaml .
NAME: operator
LAST DEPLOYED: Wed May 15 17:32:34 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

# 确认 operator 是否正常运行
$ kubectl get pod -n alluxio-operator
NAME                                              READY   STATUS    RESTARTS   AGE
alluxio-cluster-controller-5647cc664d-lrx84       1/1     Running   0          14s
alluxio-collectinfo-controller-667b746fd6-hfzqk   1/1     Running   0          14s
alluxio-csi-controller-7bd66df6cf-7kh6k           2/2     Running   0          14s
alluxio-csi-nodeplugin-9cc9v                      2/2     Running   0          14s
alluxio-csi-nodeplugin-fgs5z                      2/2     Running   0          14s
alluxio-csi-nodeplugin-v22q6                      2/2     Running   0          14s
alluxio-ufs-controller-5f6d7c4d66-drjgm           1/1     Running   0          14s

部署 alluxio operator 需要从公共镜像仓库拉取依赖镜像,
如果您因为网络环境无法访问公共镜像仓库导致部署 alluxio-operator 失败,
请参考本文【 7.3.1 alluxio-operator 镜像 】章节。

3.2 部署 Alluxio

创建 alluxio-operator/alluxio-cluster.yaml , 用于部署 Alluxio 集群。下面的文件展示了最简配置。
.spec.properties 字段中的属性将通过一个 alluxio-site.properties 配置文件传递给 Alluxio 进程。
以下是翻译后的内容:

指定在 .spec.properties 字段下的配置项将会被附加到 alluxio-site.properties 配置文件中,
Alluxio 进程会读取该文件。你可以在 Alluxio 的 coordinator 和 worker pod 中,
通过查看 /opt/alluxio/conf/alluxio-site.properties 找到你的配置。

operator 已经默认设置了推荐的配置,这些配置足以启动一个 Alluxio 集群。如果你需要修改配置,
可以编辑 alluxio-cluster.yaml 文件中的 .spec.properties 字段。

apiVersion: k8s-operator.alluxio.com/v1
kind: AlluxioCluster
metadata:
  name: alluxio
spec:
  image: <YOUR.PRIVATE.REGISTRY.HERE>/alluxio-enterprise
  imageTag: AI-3.3-7.0.0
  properties:

  worker:
    count: 2

  pagestore:
    size: 100Gi
  • 如果您的训练数据存储在 S3,OSS 等存储中,训练程序可以通过 s3:// 或者 oss:// 的方式访问到训练数据,
    您可以在启动 Alluxio 集群之后通过创建 UFS 资源,实现将底层存储挂载到 Alluxio 中,从而对训练加速。
  • 如果您的训练程序是通过 PVC 或者 NAS 的方式访问训练数据,
    那么您需要在创建 Alluxio 集群时将训练数据的 PVC 或者 NAS 挂载到 Alluxio pod 中,
    请参考本文【 3.3 将底层存储挂载到Alluxio 】章节中的 PVC 或者 NAS/hostPath,
    修改 alluxio-operator/alluxio-cluster.yaml

执行以下命令创建 Alluxio 集群:

$ cd alluxio-operator
$ kubectl create -f alluxio-cluster.yaml
alluxiocluster.k8s-operator.alluxio.com/alluxio created

# 集群正在创建,查看集群中组件的状态
$ kubectl get pod
NAME                                          READY   STATUS              RESTARTS   AGE
alluxio-coordinator-0                         0/1     Init:0/1            0          7s
alluxio-etcd-0                                0/1     ContainerCreating   0          7s
alluxio-etcd-1                                0/1     ContainerCreating   0          7s
alluxio-etcd-2                                0/1     ContainerCreating   0          7s
alluxio-monitor-grafana-847fd46f4b-84wgg      0/1     Running             0          7s
alluxio-monitor-prometheus-778547fd75-rh6r6   1/1     Running             0          7s
alluxio-worker-76c846bfb6-2jkmr               0/1     Init:0/2            0          7s
alluxio-worker-76c846bfb6-nqldm               0/1     Init:0/2            0          7s

# 检查集群的状态
$ kubectl get alluxiocluster
NAME      CLUSTERPHASE   AGE
alluxio   Ready          2m18s

# 集群准备就绪后,可以查看集群中的 pod
$ kubectl get pod
NAME                                          READY   STATUS    RESTARTS   AGE
alluxio-coordinator-0                         1/1     Running   0          2m3s
alluxio-etcd-0                                1/1     Running   0          2m3s
alluxio-etcd-1                                1/1     Running   0          2m3s
alluxio-etcd-2                                1/1     Running   0          2m3s
alluxio-monitor-grafana-7b9477d66-mmcc5       1/1     Running   0          2m3s
alluxio-monitor-prometheus-78dbb89994-xxr4c   1/1     Running   0          2m3s
alluxio-worker-85fd45db46-c7n9p               1/1     Running   0          2m3s
alluxio-worker-85fd45db46-sqv2c               1/1     Running   0          2m3s

在 Alluxio 3.x 中,coordinator 是一个无状态的控制组件,用于托管如分布式加载这样的任务,以及作为 operator 调用 API 的 gateway。

如果集群中的有些组件状态无法达到 Running 状态,可以通过kubectl describe pod查看详细信息,找到问题所在。
部署过程中遇到的具体问题,可以参考本文【 7.常见问题 】章节。

注意:etcd需要配置storageClass字段。不同云厂商的容器服务提供不同的storage class类型。如何配置,详见【 7.常见问题 】章节,如果不清楚当前云厂商容器服务的storage class类型。请执行kubectl get sc查看

启动 Alluxio 集群还包括 etcd 和监控组件,如果无法从公共镜像仓库拉取镜像导致 etcd 和监控启动失败,请参考本文【 7.3.2 配置Alluxio集群镜像 】章节

3.3 将底层存储挂载到 Alluxio

Alluxio 支持对接多种底层存储,包括 S3、HDFS、OSS、COS 和 TOS 等。
请参考存储集成概述

通过 operator 我们可以通过创建 UnderFileSystem 资源来挂载底层存储。一个 UnderFileSystem 资源对应 Alluxio 中的一个挂载点。
关于 Alluxio 以及底层存储命名空间,
请参考Alluxio 命名空间和底层文件系统命名空间

下面我们提供了几种常用的底层存储挂载示例。

3.3.1 S3挂载示例

创建 alluxio-operator/ufs.yaml,示例将挂载现有的 S3 路径到 Alluxio。

apiVersion: k8s-operator.alluxio.com/v1
kind: UnderFileSystem
metadata:
  name: alluxio-s3
spec:
  alluxioCluster: alluxio
  path: s3://my-bucket/path/to/mount
  mountPath: /s3
  mountOptions:
    s3a.accessKeyId: xxx
    s3a.secretKey: xxx
    alluxio.underfs.s3.region: us-east-1

将 S3 挂载到 Alluxio 的详细信息请参考Amazon AWS S3

3.3.2 OSS挂载示例

创建 alluxio-operator/ufs.yaml,示例将挂载现有的 OSS 路径到 Alluxio。

apiVersion: k8s-operator.alluxio.com/v1
kind: UnderFileSystem
metadata:
  name: alluxio-oss
spec:
  alluxioCluster: alluxio
  path: oss://<OSS_BUCKET>/<OSS_DIRECTORY>
  mountPath: /oss
  mountOptions:
    fs.oss.accessKeyId: <OSS_ACCESS_KEY>
    fs.oss.accessKeySecret: <OSS_ACCESS_KEY_SECRET>
    fs.oss.endpoint: <OSS_ENDPOINT>

将阿里云 OSS 挂载到 Alluxio 的详细信息请参考阿里云 OSS

3.3.3 NAS挂载示例

为了让 Alluxio pod 可以访问到 NAS 存储,您需要先将 NAS 挂载到节点的路径上。
Alluxio operator 支持将节点本地路径挂载到 Alluxio pod 中。
首先需要在创建 Alluxio 集群之前,在 alluxio-operator/alluxio-cluster.yaml 中增加挂载路径,
启动 Alluxio 集群时,会将这些路径挂载到 Alluxio 组件中。

apiVersion: k8s-operator.alluxio.com/v1
kind: AlluxioCluster
metadata:
  name: alluxio
spec:
  image: <YOUR.PRIVATE.REGISTRY.HERE>/alluxio-enterprise
  imageTag: AI-3.3-7.0.0
  
  hostPaths:
    coordinator:
      /mnt/nas: /ufs/data
    worker:
      /mnt/nas: /ufs/data
    fuse:
      /mnt/nas: /ufs/data
    
  properties:

  worker:
    count: 2

  pagestore:
    size: 100Gi
  • 键是节点上的宿主机路径,值是容器中的挂载路径。
  • 如果使用 NAS 作为 UFS,则 coordinator, worker 和 FUSE 进程都需要挂载相同的路径,以便在发生任何错误时 FUSE 可以回退

创建 alluxio-operator/ufs.yaml,示例将挂载现有的 NAS 路径到 Alluxio。

apiVersion: k8s-operator.alluxio.com/v1
kind: UnderFileSystem
metadata:
  name: alluxio-nfs
spec:
  alluxioCluster: alluxio
  path: file:///ufs/data
  mountPath: /nfs
3.3.4 PVC挂载示例

原先,用户的训练任务通过挂载 PVC 到容器内的特定路径,从而可以读取任务数据。
具体而言,训练任务容器内的路径与 PVC 绑定,任务可以通过这个挂载路径访问数据。

现在,我们使用 Alluxio 来优化这一过程。部署 Alluxio 集群时,需要将之前用于存储训练数据的 PVC 挂载到 Alluxio 组件的容器内路径。
然后,再将 Alluxio 组件的容器内路径挂载到 Alluxio 集群中。通过这种方式,训练数据的 PVC 就被成功挂载到 Alluxio 集群中,
使得数据可以通过 Alluxio 的接口进行访问和处理。

首先在创建 Alluxio 集群之前,在 alluxio-cluster.yaml 中增加挂载路径,将原来训练数据的 PVC 挂载到 Alluxio 组件中的路径:

apiVersion: k8s-operator.alluxio.com/v1
kind: AlluxioCluster
metadata:
  name: alluxio
spec:
  image: <YOUR.PRIVATE.REGISTRY.HERE>/alluxio-enterprise
  imageTag: AI-3.3-7.0.0
  
  pvcMounts:
    coordinator:
      training-data-ufs-pvc: /ufs/data
    worker:
      training-data-ufs-pvc: /ufs/data
    fuse:
      training-data-ufs-pvc: /ufs/data

  properties:

  worker:
    count: 2

  pagestore:
    size: 100Gi
  • 键是 PVC,值是容器中的挂载路径。
  • 如果使用 PVC 作为 UFS,则 coordinator, worker 和 FUSE 进程都需要挂载相同的路径,以便在发生任何错误时 FUSE 可以回退

创建 alluxio-operator/ufs.yaml,示例将挂载现有的 PVC 到 Alluxio。

apiVersion: k8s-operator.alluxio.com/v1
kind: UnderFileSystem
metadata:
  name: alluxio-pvc
spec:
  alluxioCluster: alluxio
  path: file:///ufs/data
  mountPath: /pvc
3.3.5 挂载操作

首先需要确认 Alluxio 集群已经启动,状态为 Ready。(或者状态为 WaitingForReady 也可以挂载 UFS)

# 检查集群的状态
$ kubectl get alluxiocluster
NAME      CLUSTERPHASE   AGE
alluxio   Ready          2m18s

在创建 UnderFileSystem 资源后,执行以下命令将底层存储挂载到 Alluxio 命名空间:

$ cd alluxio-operator
$ kubectl create -f ufs.yaml
underfilesystem.k8s-operator.alluxio.com/alluxio-s3 created

# verify the status of the storage
$ kubectl get ufs
NAME         PHASE   AGE
alluxio-s3   Ready   46s

# also check the mount table via Alluxio command line
$ kubectl exec -it alluxio-coordinator-0 -- alluxio mount list 2>/dev/null
Listing all mount points
s3://my-bucket/path/to/mount  on  /s3/ properties={s3a.secretKey=xxx, alluxio.underfs.s3.region=us-east-1, s3a.accessKeyId=xxx}

4. 监控

部署 Alluxio 集群默认开启监控,通过 Grafana 可以直观地查看 Alluxio 各种指标,
请参考监控和指标中的 Kubernetes Operator 章节

5. 数据访问加速

上述步骤中,您部署了 Alluxio 集群,并将底层存储挂载到 Alluxio 中。训练任务通过 Alluxio 读取数据,可以提升训练速度和 GPU 利用率。
Alluxio 提供了3种数据访问方式:

  • FUSE based POSIX API: 请参考 FUSE based POSIX API
  • S3 API: 请参考 S3 API
  • FSSpec Python API: 请参考 FSSPEC Python API

6. 常见用例

6.1 更改资源限制

对于每个组件,如 worker、coordinator 和 FUSE,我们都可以通过以下配置更改资源的使用量:

apiVersion: k8s-operator.alluxio.com/v1
kind: AlluxioCluster
spec:
  worker:
    resources:
      limits:
        cpu: "12"
        memory: "36Gi"
      requests:
        cpu: "1"
        memory: "32Gi"
    jvmOptions:
      - "-Xmx22g"
      - "-Xms22g"
      - "-XX:MaxDirectMemorySize=10g"
  • 容器将永远无法访问超过限制的资源,这个请求限制会在调度过程中生效。如需了解更多信息,请参阅 为 Pod 和容器管理资源。
  • 内存限制应略大于堆内存(-Xmx)和直接内存(-XX:MaxDirectMemorySize=10g)的大小之和,以避免内存不足。

6.2 将 PVC 用于 page store

apiVersion: k8s-operator.alluxio.com/v1
kind: AlluxioCluster
spec:
  pagestore:
    type: persistentVolumeClaim
    storageClass: ""
    size: 100Gi
  • PVC 由 operator 创建
  • storageClass 默认为 standard,但可以指定为空字符串进行静态绑定

6.3 挂载自定义映射配置

apiVersion: k8s-operator.alluxio.com/v1
kind: AlluxioCluster
spec:
  configMaps:
    custom-config-map: /etc/custom
  • 键是 ConfigMap 的名称,值是容器中的挂载路径
  • 默认情况下,/opt/alluxio/conf 已被挂载。自定义配置映射需要挂载到其他路径

6.4 使用 root 用户

FUSE pod 将始终使用 root 用户。其他进程默认使用 uid 为1000的用户。在容器中,用户名为 alluxio
要将其更改为 root 用户,请使用此配置:

apiVersion: k8s-operator.alluxio.com/v1
kind: AlluxioCluster
spec:
  user: 0
  group: 0
  fsGroup: 0
  • 如果文件可由 root 用户组访问,指定 .spec.fsGroup = 0 即可。
  • 如果将挂载主机路径(如页面存储路径和日志路径)的所有权更改为 root 用户,则其所有权将转移到 root。

6.5 支持的挂载选项

UnderFileSystem 配置中的 mountOptions 支持与 Alluxio 集群属性相同的设置。确切来说,使用不同存储时可使用以下属性

UFSConfigurationDescription
S3s3a.accessKeyThe access key of S3 bucket
s3a.secretKeyThe secret key of S3 bucket
alluxio.underfs.s3.regionOptionally, set the S3 bucket region. If not provided, will enable the global bucket access with extra requests

7. 常见问题

7.1 etcd pod 一直处于 Pending 状态

比如三个 etcd pod 一直处于 Pending 状态,可以通过 kubectl describe pod 查看详细信息:

# 查看集群中的 pod 状态
kubectl get pod

NAME                                          READY   STATUS     RESTARTS   AGE
alluxio-coordinator-0                         0/1     Init:1/2   0          73s
alluxio-etcd-0                                0/1     Pending    0          73s
alluxio-etcd-1                                0/1     Pending    0          73s
alluxio-etcd-2                                0/1     Pending    0          73s
alluxio-monitor-grafana-79db8c7dd9-lsq2l      1/1     Running    0          73s
alluxio-monitor-prometheus-7c6cbc4b4c-9nk25   1/1     Running    0          73s
alluxio-worker-8c79d5fd4-2c994                0/1     Init:1/2   0          73s
alluxio-worker-8c79d5fd4-jrchj                0/1     Init:1/2   0          73s

# 查看 etcd pod 的详细信息
kubectl describe pod alluxio-etcd-0

Events:
  Type     Reason            Age    From               Message
  ----     ------            ----   ----               -------
  Warning  FailedScheduling  3m57s  default-scheduler  0/3 nodes are available: pod has unbound immediate PersistentVolumeClaims. preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling., .

# 查看集群中的 pvc 状态,发现 etcd 的 pvc 一直处于 Pending 状态(alluxio-alluxio-csi-fuse-pvc 处于 Pending 状态是正常现象)
kubectl get pvc

NAME                           STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS                AGE
alluxio-alluxio-csi-fuse-pvc   Pending                                      alluxio-csi-storage-class   5m31s
data-alluxio-etcd-0            Pending                                                                  3h41m
data-alluxio-etcd-1            Pending                                                                  3h41m
data-alluxio-etcd-2            Pending                                                                  3h41m

可以看到 etcd pod 和 pvc 一直处于 Pending 状态,需要查看 etcd pvc 的详细信息。

下面展示了 etcd pvc 的详细信息,可以看到 pvc 绑定失败的原因是没有设置 storage class。

# 查看 etcd pvc 的详细信息
kubectl describe pvc data-alluxio-etcd-0

Events:
  Type    Reason         Age                      From                         Message
  ----    ------         ----                     ----                         -------
  Normal  FailedBinding  4m16s (x889 over 3h44m)  persistentvolume-controller  no persistent volumes available for this claim and no storage class is set

可以通过在 alluxio-operator/alluxio-cluster.yaml 文件中指定 etcd 的 storageClass 来解决:

  etcd:
    persistence:
      storageClass: <STORAGE.CLASS.HERE>
      size: 

我们需要先删除 Alluxio 集群, 并且删除 etcd 的 pvc,然后重新创建 Alluxio 集群:

# 删除 Alluxio 集群
$ kubectl delete -f alluxio-operator/alluxio-cluster.yaml

# 删除 etcd 的 pvc
$ kubectl delete pvc data-alluxio-etcd-0
$ kubectl delete pvc data-alluxio-etcd-1
$ kubectl delete pvc data-alluxio-etcd-2

# 重新创建 Alluxio 集群
$ kubectl create -f alluxio-operator/alluxio-cluster.yaml

另外一种情况是 etcd pvc 指定了 storage class,但是 etcd pod 和 pvc 依然是 pending 状态。例如下面的 pvc 详细信息中所展示,
etcd pvc 指定的 storage class 不支持动态制备,存储卷需要由集群管理员手动创建。

# 查看 etcd pvc 的详细信息
kubectl describe pvc data-alluxio-etcd-0

Events:
  Type    Reason                Age               From                         Message
  ----    ------                ----              ----                         -------
  Normal  WaitForFirstConsumer  25s               persistentvolume-controller  waiting for first consumer to be created before binding
  Normal  ExternalProvisioning  8s (x3 over 25s)  persistentvolume-controller  Waiting for a volume to be created either by the external provisioner 'none' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.

类似的 etcd pod 一直处于 Pending 状态的问题,可以通过上述方法进行排查。如果您只是进行部署验证,同时当前没有方便的 storage class 供集群使用,您可以关闭 etcd 的 persistence 配置,如下。注意该配置无法适用于生产,仅供验证测试使用

etcd:
  persistence:
    enabled: false

7.2 alluxio-alluxio-csi-fuse-pvc 一直处于 Pending 状态

当我们创建集群之后,发现 alluxio-alluxio-csi-fuse-pvc 一直处于 Pending 状态,
这是正常现象,当 alluxio-csi-fuse-pvc 被业务 pod 使用时,pvc 会自动绑定 pv,pvc 的状态会变为 Bound。

7.3 无法访问公共镜像仓库

7.3.1 配置 alluxio-operator 镜像

部署 alluxio operator 需要从公共镜像仓库拉取依赖镜像,如果您的网络环境无法访问公共镜像仓库,将会出现拉取镜像出现超时错误:

# 确认 operator 是否正常运行
$ kubectl get pod -n alluxio-operator
NAME                                              READY   STATUS              RESTARTS   AGE
alluxio-cluster-controller-65b59f65b4-5d667       1/1     Running             0          22s
alluxio-collectinfo-controller-667b746fd6-hfzqk   1/1     Running             0          22s
alluxio-csi-controller-c85f8f759-sqc56            0/2     ContainerCreating   0          22s
alluxio-csi-nodeplugin-5pgmg                      0/2     ContainerCreating   0          22s
alluxio-csi-nodeplugin-fpkcq                      0/2     ContainerCreating   0          22s
alluxio-csi-nodeplugin-j9wll                      0/2     ContainerCreating   0          22s
alluxio-ufs-controller-5f69bbb878-7km58           1/1     Running             0          22s

可以发现 cluster controllerufs controllercollectinfo controller 启动成功,
但是 csi controllercsi nodeplugin 一直在 ContainerCreating 状态,
这是因为拉取依赖镜像超时导致的。通过 kubectl describe pod 查看详细信息,可以看到类似如下的错误信息:

$ kubectl -n alluxio-operator describe pod -l app.kubernetes.io/component=csi-controller

Events:
  Type     Reason          Age                    From               Message
  ----     ------          ----                   ----               -------
  Normal   Scheduled       10m                    default-scheduler  Successfully assigned alluxio-operator/alluxio-csi-controller-c85f8f759-sqc56 to cn-beijing.10.0.0.252
  Normal   AllocIPSucceed  10m                    terway-daemon      Alloc IP 10.0.0.27/24 took 28.443992ms
  Normal   Pulling         10m                    kubelet            Pulling image "registry.xxx.com/alluxio/operator:2.0.0"
  Normal   Pulled          10m                    kubelet            Successfully pulled image "registry.xxx.com/alluxio/operator:2.0.0" in 5.55s (5.55s including waiting)
  Normal   Created         10m                    kubelet            Created container csi-controller
  Normal   Started         10m                    kubelet            Started container csi-controller
  Warning  Failed          8m20s (x2 over 10m)    kubelet            Failed to pull image "registry.k8s.io/sig-storage/csi-provisioner:v2.0.5": failed to pull and unpack image "registry.k8s.io/sig-storage/csi-provisioner:v2.0.5": failed to resolve reference "registry.k8s.io/sig-storage/csi-provisioner:v2.0.5": failed to do request: Head "https://us-west2-docker.pkg.dev/v2/k8s-artifacts-prod/images/sig-storage/csi-provisioner/manifests/v2.0.5": dial tcp 142.251.8.82:443: i/o timeout
  Warning  Failed          8m20s (x3 over 10m)    kubelet            Error: ErrImagePull
  Warning  Failed          7m40s (x5 over 10m)    kubelet            Error: ImagePullBackOff
  Warning  Failed          6m56s (x2 over 9m19s)  kubelet            Failed to pull image "registry.k8s.io/sig-storage/csi-provisioner:v2.0.5": rpc error: code = DeadlineExceeded desc = failed to pull and unpack image "registry.k8s.io/sig-storage/csi-provisioner:v2.0.5": failed to resolve reference "registry.k8s.io/sig-storage/csi-provisioner:v2.0.5": failed to do request: Head "https://us-west2-docker.pkg.dev/v2/k8s-artifacts-prod/images/sig-storage/csi-provisioner/manifests/v2.0.5": dial tcp 64.233.187.82:443: i/o timeout
  Normal   Pulling         5m29s (x5 over 10m)    kubelet            Pulling image "registry.k8s.io/sig-storage/csi-provisioner:v2.0.5"
  Normal   BackOff         30s (x28 over 10m)     kubelet            Back-off pulling image "registry.k8s.io/sig-storage/csi-provisioner:v2.0.5"

您可以将依赖镜像下载到本地,上传到您的私有镜像仓库,然后修改 alluxio-operator.yaml 文件中的镜像地址,再重新部署 operator。

组件镜像名版本用途
operator 的 csiregistry.k8s.io/sig-storage/csi-node-driver-registrarv2.0.0csi driver registrar 依赖
operator 的 csiregistry.k8s.io/sig-storage/csi-provisionerv2.0.5csi provisioner 依赖
集群的 etcddocker.io/bitnami/etcd3.5.9-debian-11-r24etcd 依赖
集群的 etcddocker.io/bitnami/os-shell11-debian-11-r2os-shell 依赖
集群的监控grafana/grafana10.4.5监控展示
集群的监控prom/prometheusv2.52.0指标采集

拉取 docker 镜像并且上传到私有镜像仓库的命令如下:

# 拉取镜像到本地
$ docker pull registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.0.0
$ docker pull registry.k8s.io/sig-storage/csi-provisioner:v2.0.5
$ docker pull docker.io/bitnami/etcd:3.5.9-debian-11-r24
$ docker pull docker.io/bitnami/os-shell:11-debian-11-r2
$ docker pull grafana/grafana:10.4.5
$ docker pull prom/prometheus:v2.52.0

# 将镜像更改为私有镜像仓库
$ docker tag registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.0.0 <YOUR.PRIVATE.REGISTRY.HERE>/csi-node-driver-registrar:v2.0.0
$ docker tag registry.k8s.io/sig-storage/csi-provisioner:v2.0.5 <YOUR.PRIVATE.REGISTRY.HERE>/csi-provisioner:v2.0.5
$ docker tag docker.io/bitnami/etcd:3.5.9-debian-11-r24 <YOUR.PRIVATE.REGISTRY.HERE>/etcd:3.5.9-debian-11-r24
$ docker tag docker.io/bitnami/os-shell:11-debian-11-r2 <YOUR.PRIVATE.REGISTRY.HERE>/os-shell:11-debian-11-r2
$ docker tag grafana/grafana:10.4.5 <YOUR.PRIVATE.REGISTRY.HERE>/grafana:10.4.5
$ docker tag prom/prometheus:v2.52.0 <YOUR.PRIVATE.REGISTRY.HERE>/prometheus:v2.52.0

# 上传镜像到私有镜像仓库
$ docker push <YOUR.PRIVATE.REGISTRY.HERE>/csi-node-driver-registrar:v2.0.0
$ docker push <YOUR.PRIVATE.REGISTRY.HERE>/csi-provisioner:v2.0.5
$ docker push <YOUR.PRIVATE.REGISTRY.HERE>/etcd:3.5.9-debian-11-r24
$ docker push <YOUR.PRIVATE.REGISTRY.HERE>/os-shell:11-debian-11-r2
$ docker push <YOUR.PRIVATE.REGISTRY.HERE>/grafana:10.4.5
$ docker push <YOUR.PRIVATE.REGISTRY.HERE>/prometheus:v2.52.0

更改 alluxio-operator/alliuxio-operator.yaml 文件中的镜像地址,增加 provisionerdriverRegistrar 的镜像地址:

global:
  image: <YOUR.PRIVATE.REGISTRY.HERE>/alluxio-operator
  imageTag: 2.0.0

alluxio-csi:
  controllerPlugin: 
    provisioner: 
      image: <YOUR.PRIVATE.REGISTRY.HERE>/csi-provisioner:v2.0.5
  nodePlugin: 
    driverRegistrar: 
        image: <YOUR.PRIVATE.REGISTRY.HERE>/csi-node-driver-registrar:v2.0.0

进入到 alluxio-operator 目录,执行以下命令部署 operator:

$ cd alluxio-operator
# 最后一个参数表示是 helm chart 文件的路径,"." 表示当前目录
$ helm install operator -f alluxio-operator.yaml .
NAME: operator
LAST DEPLOYED: Wed May 15 17:32:34 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

# 确认 operator 是否正常运行
$ kubectl get pod -n alluxio-operator
NAME                                              READY   STATUS    RESTARTS   AGE
alluxio-cluster-controller-5647cc664d-lrx84       1/1     Running   0          14s
alluxio-collectinfo-controller-667b746fd6-hfzqk   1/1     Running   0          14s
alluxio-csi-controller-7bd66df6cf-7kh6k           2/2     Running   0          14s
alluxio-csi-nodeplugin-9cc9v                      2/2     Running   0          14s
alluxio-csi-nodeplugin-fgs5z                      2/2     Running   0          14s
alluxio-csi-nodeplugin-v22q6                      2/2     Running   0          14s
alluxio-ufs-controller-5f6d7c4d66-drjgm           1/1     Running   0          14s
7.3.2 配置 Alluxio 集群镜像

启动 Alluxio 集群还包括 etcd 和监控组件,如果无法访问公共镜像仓库,需要将 etcd 和监控组件的镜像地址替换成私有镜像仓库,修改alluxio-operator/alluxio-cluster.yaml文件中的镜像地址。

apiVersion: k8s-operator.alluxio.com/v1
kind: AlluxioCluster
metadata:
  name: alluxio
spec:
  image: <YOUR.PRIVATE.REGISTRY.HERE>/alluxio-enterprise
  imageTag: AI-3.3-7.0.0
  properties:

  worker:
    count: 2

  pagestore:
    size: 100Gi
  
  etcd:
    image:
      registry: <YOUR.PRIVATE.REGISTRY.HERE>
      repository: <YOUR.PRIVATE.REPOSITORY.HERE>/etcd
      tag: 3.5.9-debian-11-r24
    volumePermissions:
      image:
        registry: <YOUR.PRIVATE.REGISTRY.HERE>
        repository: <YOUR.PRIVATE.REPOSITORY.HERE>/os-shell
        tag: 11-debian-11-r2
    persistence:
      storageClass: <STORAGE.CLASS.HERE>
      size: 
    
  alluxio-monitor:
    prometheus:
      image: <YOUR.PRIVATE.REGISTRY.HERE>/prometheus
      imageTag: v2.52.0
    grafana:
      image: <YOUR.PRIVATE.REGISTRY.HERE>/grafana
      imageTag: 10.4.5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2149911.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优思学院|如何通过六西格玛方法优化流程,减少90%的浪费?

随着竞争压力的增加和对更快结果的需求&#xff0c;越来越多的企业开始依赖精益六西格玛来优化流程&#xff0c;减少浪费。精益六西格玛不仅改变了制造业&#xff0c;也影响了几乎所有行业的业务运营&#xff0c;提升了效率&#xff0c;消除了低效环节。这里优思学院和大家探讨…

sheng的学习笔记-AI-强化学习(Reinforcement Learning, RL)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 基础知识 什么是强化学习 强化学习&#xff08;Reinforcement Learning, RL&#xff09;&#xff0c;又称再励学习、评价学习或增强学习&#xff0c;是机器学习的范式和方法论之一&#xff0c;用于描述和解决智能体&#…

电机设计及电机仿真APP系列之—高速永磁同步电机仿真APP

电机的各种工作状态和参数变化。用户可通过调整仿真参数&#xff0c;快速得到电机的响应和性能参数&#xff0c;从而进行针对性的优化和改进。借助仿真APP&#xff0c;可大大减少电机设计迭代次数和成本&#xff0c;提高测试效率和准确性。 小编整理了10款不同类型的电机仿真A…

掌握顶会流量密码!“Mamba+CNN”双热点组合!轻松找到创新点!

传统视觉模型在处理大规模或高分辨率图像时存在一定限制。然而Mamba与CNN相结合&#xff0c;在处理序列数据和图像数据时有着显著的优势&#xff0c;并且能够有效提升模型计算效率和准确率。 这种结合可以让Mamba在处理长序列数据时既能够捕捉到序列中的时间依赖关系&#xff…

springboot整合springbatch和xxljob实现定时数据同步(完整代码)

springboot整合springbatch和xxljob实现定时数据同步&#xff08;完整代码&#xff09; 前言&#xff1a;公司一些老项目的定时任务使用spring自带的调度器来完成数据同步的&#xff0c;久而久之带来很多的不方便。首先没办法快速定位监控定时任务的执行情况&#xff0c;其次就…

c++11右值引用和移动语义

一.左值引用和右值引用 什么是左值引用&#xff0c;什么是右值引用 左值是一个表示数据的表达式&#xff08;变量名解引用的指针&#xff09;&#xff0c;我们可以获取到它的地址&#xff0c;可以对它赋值&#xff0c;左值可以出现在符号的左边。使用const修饰后&#xff0c;…

python检测keycloak证书连接报错问题

最近一直被keycloak的证书问题困扰了很久&#xff0c;老是提示ssl安全连接&#xff0c;由于不会java,只好硬着头皮用python测试。 我这里的证书是自己签注的证书&#xff0c;导入系统的是CA根证书。 from keycloak import KeycloakOpenID# 1. 配置 Keycloak 客户端 keycloak_o…

电子画册3D翻页电子版是如何制作

​随着科技的发展&#xff0c;传统的纸质画册逐渐被电子画册所取代。电子画册3D翻页电子版以其独特的交互方式和丰富的视觉体验&#xff0c;受到了越来越多人的喜爱。让我来教你怎么制作吧。 1.要制作电子杂志,首先需要选择一款适合自己的软件。比如FLBOOK在线制作电子杂志平台…

信息收集常用指令

目的 本文主要是记录一些在信息搜集时&#xff0c;常用的提高搜索效率的命令。 后续会继续记录一些用到的更多指令和方法&#xff0c;慢慢更新。 1、inurl “inurl:xxx”是指查找url中包含xxx的网页。 URL&#xff1a;统一资源定位符。统一资源定位系统。可以说包含域名&am…

ThreaLocal

1.概述 ThreadLoca称线程局部变量&#xff0c;用于在线程中保存数据&#xff0c;保存的数据仅属于当前线程(即对其他线程而言&#xff0c;该变量是当前线程独有的变量) threadLocal利用Thread中的ThreadLocalMap来进行数据存储 2.常用方法 存储数据至当前线程ThreadLocalMap中…

无监督神经组合优化的扩散模型框架

文章目录 Abstract1. Introduction2. Problem Description2.1 无监督神经组合优化3. Neural Probabilistic Optimization Objective for Approximate Likelihood Models3.1 具有联合变分上界的训练扩散模型Abstract 从离散集合的不可处理分布中进行采样,而不依赖相应的训练数据…

OpenAI o1解决了Quiet-STaR的挑战吗?(下)

随着OpenAI o1近期的发布&#xff0c;业界讨论o1关联论文最多之一可能是早前这篇斯坦福大学和Notbad AI Inc的研究人员开发的Quiet-STaR&#xff0c;即让AI学会先安静的“思考”再“说话” &#xff0c;回想自己一年前对于这一领域的思考和探索&#xff0c;当初也将这篇论文进行…

初学者蒙语学习,使用什么翻译软件学习更快?

为了加快蒙古语的学习&#xff0c;初学者应该从基础语法和词汇入手&#xff0c;利用语言学习应用进行系统学习&#xff0c;并通过音频和视频材料提高听力。语言交换和参加课程可以提供实践机会&#xff0c;而使用闪卡和文化沉浸有助于记忆词汇和理解语言背景。定期复习和设定学…

聊天组件 Vue3-beautiful-chat 插槽

前言 Vue3-beautiful-chat 组件有四个插槽可以定制 一、user-avatar(头像) 首先是头像插槽,我们可以直接在 <beautiful-chat></beautiful-chat> 中间使用; 作用: 我们可以在用户头像上添加自定义样式,比如添加节日边框、可以使用首字母作为头像。。。 …

小阿轩yx-通过state模块定义主机状态

小阿轩yx-通过state模块定义主机状态 前言 前面学习了远程执行模块&#xff0c;这些模块的执行类似语段 shell 脚本&#xff0c;每次执行都会触发一次相同的功能&#xff0c;在大量的 minion 上运行远程命令当然是重要的&#xff0c;但是对于 minion 的环境控制&#xff0c;使…

Python 二级考试

易错点 定义学生关系模式如下&#xff1a;Student &#xff08;S#&#xff0c; Sn&#xff0c; Ssex&#xff0c;class&#xff0c;monitorS#&#xff09;&#xff08;其属性分别为学号、学生名、性别、班级和班长学号&#xff09; 在关系模式中&#xff0c;如果Y -> X&…

超详细!百分百安装成功pytorch,建议收藏

文章目录 一、Anaconda安装1.1下载anaconda1.2配置Anaconda环境1.3验证anaconda是否安装成功 二、查看电脑显卡三、更新显卡驱动3.1下载驱动3.2、查看显卡驱动版本 四、cuda安装4.1CUDA下载4.2CUDA环境配置4.3验证CUDA是否安装成功 五、安装pytorch4.1下载pytorch5.2验证pytorc…

计算机专业的就业方向

计算机专业的就业方向 亲爱的新生们&#xff0c;欢迎你们踏上计算机科学的旅程&#xff01;作为一名计算机专业的学生&#xff0c;你们即将进入一个充满无限可能的领域。今天&#xff0c;我将为大家介绍计算机专业的一些主要就业方向&#xff0c;帮助你们了解未来的职业选择。…

备忘录应用哪些值得推荐?优秀的桌面备忘录下载

在我们的日常生活和工作中&#xff0c;备忘录是一款常用的记录软件&#xff0c;它为我们提供了极大的便利&#xff0c;让我们可以随时记录下重要的信息、灵感和待办事项。然而&#xff0c;如今网上的备忘录软件琳琅满目&#xff0c;究竟哪一款才是真正优秀的呢&#xff1f; 在…

分步指南:如何使用 ChatGPT 撰写文献综述

撰写文献综述对于研究人员和学生来说,往往是一项既耗时又复杂的任务。这一过程不仅要求对所选主题的现有研究进行全面的了解和掌握,还需要学术严谨性。然而,随着像 ChatGPT 这样的高级语言模型的广泛应用,撰写文献综述的过程变得更加高效和简化。通过合理利用 ChatGPT,研究…