日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

Arena在多用戶場(chǎng)景下最佳實(shí)踐

本文通過(guò)實(shí)現(xiàn)五個(gè)目標(biāo)任務(wù)舉例說(shuō)明如何在多用戶場(chǎng)景下使用Arena。

操作視頻

前提條件

請(qǐng)確保您已完成以下操作:

  • 創(chuàng)建一個(gè)ACK集群。詳情請(qǐng)參見(jiàn)創(chuàng)建ACK托管集群

  • 在ACK集群同VPC下,創(chuàng)建一個(gè)操作系統(tǒng)為L(zhǎng)inux的ECS實(shí)例。具體操作步驟請(qǐng)參見(jiàn)自定義購(gòu)買實(shí)例

    本示例中,ECS實(shí)例被稱為Client機(jī)器。Client機(jī)器作為Arena的工作站,提交作業(yè)至ACK集群。

  • 安裝最新版本Arena。具體操作步驟請(qǐng)參見(jiàn)配置Arena客戶端

背景信息

當(dāng)多個(gè)開(kāi)發(fā)人員在一個(gè)公司或大團(tuán)體下使用Arena進(jìn)行工作時(shí),為了有效管理,您可能需要對(duì)這些人員進(jìn)行小組劃分,且每個(gè)小組需要彼此隔離。這樣在同一個(gè)集群內(nèi),小組就是您分配、隔離資源和權(quán)限的基本單元。

通常您需要將整個(gè)集群的資源(GPU、CPU、MEM)根據(jù)具體需求劃分給每個(gè)組,并且給組內(nèi)成員分配不同權(quán)限,以及提供各自獨(dú)立的Arena使用環(huán)境。其中權(quán)限包括:用戶對(duì)于作業(yè)的可見(jiàn)、可操作權(quán)限,用戶的作業(yè)對(duì)特定數(shù)據(jù)的讀寫權(quán)限。

圖 1. 配置多用戶使用Arena的工作環(huán)境圖

image

本文示例中的ACK集群和Client機(jī)器的節(jié)點(diǎn)信息如下表所示。

主機(jī)名

角色

IP地址

GPU卡數(shù)

CPU核數(shù)

MEM

client01

Client

10.0.0.97(私有)39.98.xxx.xxx(公)

0

2

8 GiB

master01

Master

10.0.0.91(私有)

0

4

8 GiB

master02

Master

10.0.0.92(私有)

0

4

8 GiB

master03

Master

10.0.0.93(私有)

0

4

8 GiB

worker01

Worker

10.0.0.94(私有)

1

4

30 GiB

worker02

Worker

10.0.0.95(私有)

1

4

30 GiB

worker03

Worker

10.0.0.96(私有)

1

4

30 GiB

說(shuō)明

如無(wú)特殊說(shuō)明,本文操作均為集群管理員(admin)操作,操作節(jié)點(diǎn)為Client機(jī)器。

目標(biāo)任務(wù)

本文最佳實(shí)踐的示例中將達(dá)成以下五個(gè)目標(biāo)任務(wù):

  • 目標(biāo)一:您需要為當(dāng)前ACK集群創(chuàng)建兩個(gè)分組dev1和dev2,并且為這兩個(gè)分組各添加一個(gè)用戶bob和tom。

  • 目標(biāo)二:每個(gè)用戶只能通過(guò)自己的賬號(hào)和密碼登錄到Client機(jī)器,使用自己環(huán)境下的Arena。

  • 目標(biāo)三:bob和tom只對(duì)自己提交的作業(yè)可見(jiàn),以及進(jìn)行管理。

  • 目標(biāo)四:按組劃分Worker節(jié)點(diǎn)GPU、CPU、MEM資源(注:僅Worker節(jié)點(diǎn)的計(jì)算資源才能被Arena作業(yè)使用)。

  • 目標(biāo)五:創(chuàng)建組內(nèi)共享的數(shù)據(jù)卷,和組與組之間全局共享的數(shù)據(jù)卷。

表 1. 數(shù)據(jù)配置表

組名

用戶

GPU

CPU

MEM

共享數(shù)據(jù)卷

dev1

bob

1

不限制

不限制

dev1-publicdepartment1-public-dev1

dev2

tom

2

8

60 GiB

dev2-publicdepartment1-public-dev2

說(shuō)明

department1-public-dev1department1-public-dev2數(shù)據(jù)卷指向的是同一份數(shù)據(jù);組dev1和dev2為所有用戶共享;dev1-publicdev2-public分別對(duì)應(yīng)分組dev1、dev2用戶獨(dú)享的數(shù)據(jù)。

步驟一:創(chuàng)建和管理ACK集群的用戶和組

為了安全起見(jiàn),不建議您直接登錄ACK集群的Master節(jié)點(diǎn)安裝使用Arena以及對(duì)集群進(jìn)行操作,因此建議您在與ACK集群同一個(gè)VPC下創(chuàng)建ECS實(shí)例(Client機(jī)器)。通過(guò)配置KubeConfig文件,使用ECS實(shí)例節(jié)點(diǎn)對(duì)ACK集群進(jìn)行訪問(wèn)。

  1. 創(chuàng)建Client機(jī)器上的用戶和組。

    1. 通過(guò)kubectl連接ACK集群。

      使用kubectl命令連接ACK集群時(shí),您需要安裝kubectl客戶端工具和配置供集群管理員admin操作ACK集群的KubeConfig文件。有關(guān)具體的操作步驟,請(qǐng)參見(jiàn)獲取集群KubeConfig并通過(guò)kubectl工具連接集群

      說(shuō)明

      要求kubectl的版本大于或等于1.10。

    2. 執(zhí)行以下代碼在Client機(jī)器上創(chuàng)建對(duì)應(yīng)的Linux UID和GID。

      集群管理員需要為bob、tom以及分組dev1、dev2,在Client機(jī)器上創(chuàng)建對(duì)應(yīng)的Linux UID和GID。通過(guò)Linux自身的賬號(hào)系統(tǒng)機(jī)制,實(shí)現(xiàn)目標(biāo)二,即每個(gè)用戶只能通過(guò)自己的賬號(hào)和密碼登錄到Client機(jī)器,使用自己環(huán)境下的Arena。

      # 創(chuàng)建Linux用戶組dev1和dev2
      groupadd -g 10001 dev1
      groupadd -g 10002 dev2
      
      # 創(chuàng)建Linux用戶bob和tom
      adduser -u 20001 -s /bin/bash -G dev1 -m bob
      adduser -u 20002 -s /bin/bash -G dev2 -m tom
      
      # 設(shè)置用戶bob登錄操作AI平臺(tái)的Linux節(jié)點(diǎn)的密碼。
      passwd bob 
      
      # 設(shè)置tom登錄操作AI平臺(tái)的Linux節(jié)點(diǎn)的密碼。
      passwd tom
  2. 創(chuàng)建ACK集群中的用戶(服務(wù)賬號(hào))和組(命名空間)。

    提交給AI平臺(tái)的作業(yè)都將在ACK集群中運(yùn)行。在ACK中,作業(yè)的擁有者以服務(wù)賬號(hào)(ServiceAccount)區(qū)分,作業(yè)運(yùn)行的環(huán)境以命名空間(Namespace)區(qū)分。運(yùn)維管理員admin將創(chuàng)建ServiceAccount和Namespace,并保證與在Client機(jī)器上創(chuàng)建的用戶和組對(duì)應(yīng)。可以將Namespace對(duì)應(yīng)組,ServiceAccount對(duì)應(yīng)用戶。

    admin以root身份登錄Client機(jī)器,并確保擁有操作集群的權(quán)限(通過(guò)kubectl連接ACK集群步驟中完成)。執(zhí)行以下操作:

    # 創(chuàng)建用戶組dev1對(duì)應(yīng)的命名空間
    kubectl create namespace dev1
    
    # 創(chuàng)建用戶組dev2對(duì)應(yīng)的命名空間
    kubectl create namespace dev2
    
    # 創(chuàng)建用戶bob對(duì)應(yīng)的服務(wù)賬號(hào)
    kubectl create serviceaccount bob -n dev1 
    
    # 創(chuàng)建用戶tom對(duì)應(yīng)的服務(wù)賬號(hào)
    kubectl create serviceaccount tom -n dev2

    預(yù)期輸出:

    $ kubectl create namespace dev1
    namespace/dev1 created
    
    $ kubectl create namespace dev2
    namespace/dev2 created
    
    $ kubectl create serviceaccount bob -n dev1
    serviceaccount/bob created
    
    $ kubectl create serviceaccount tom -n dev2
    serviceaccount/tom created

步驟二:為用戶配置Arena的使用環(huán)境

  1. 安裝Arena。

    集群管理員在Client機(jī)器上安裝Arena。首先集群管理員以root身份登錄到Client機(jī)器,下載社區(qū)最新Arena發(fā)布的release安裝包,然后解壓并執(zhí)行安裝包中install.sh腳本。有關(guān)具體的操作步驟,請(qǐng)參見(jiàn)配置Arena客戶端

    說(shuō)明

    在同一臺(tái)Linux操作系統(tǒng)上,您只需安裝一份Arena工具。管理員通過(guò)為每位用戶配置各自的配置文件,從而實(shí)現(xiàn)隔離,便于用戶以不同的權(quán)限使用Arena工具。

  2. 為用戶創(chuàng)建Arena配置文件。

    為了使不同用戶以各自的身份和權(quán)限正確操作AI平臺(tái)集群(ACK集群),首先您需要?jiǎng)?chuàng)建不同用戶用于Arena連接ACK集群的環(huán)境配置文件(即創(chuàng)建在各自ServiceAccount下使用的KubeConfig文件)。

    集群管理員以root身份登錄到Client機(jī)器上,創(chuàng)建如下腳本并保存為generate-kubeconfig.sh

    #!/usr/bin/env bash
    
    set -e
    
    NAMESPACE=
    SERVICE_ACCOUNT=
    DURATION=
    OUTPUT=
    
    help() {
        echo "Usage: $0 -n <namespace> -s <service-account> -d <duration> -o <output-file>"
        echo ""
        echo "Options:"
        echo "-n, --namespace <namespace>      Namespace of the service account."
        echo "-s, --service-account <name>     Name of the service account."
        echo "-d, --duration <duration>        Duration of the token e.g. 30d."
        echo "-o, --output <file>              Output file name. If not set, a temporary file will be created."
    }
    
    parse() {
        while [ $# -gt 0 ]; do
            case $1 in
            -n | --namespace)
                NAMESPACE="$2"
                shift 2
                ;;
            -s | --service-account)
                SERVICE_ACCOUNT="$2"
                shift 2
                ;;
            -d | --duration)
                DURATION="$2"
                shift 2
                ;;
            -o | --output)
                OUTPUT="$2"
                shift 2
                ;;
            *)
                help
                exit 0
                ;;
            esac
        done
    
        if [ -z "${NAMESPACE}" ] || [ -z "${SERVICE_ACCOUNT}" ] || [ -z "${DURATION}" ]; then
            help
            exit 0
        fi
    
        if [ -z "${OUTPUT}" ]; then
            OUTPUT=$(mktemp -d)/config
        elif [ -f "${OUTPUT}" ]; then
            echo "Output file \"${OUTPUT}\" already exists."
            exit 1
        fi
    }
    
    # Generate kubeconfig
    generate_kubeconfig() {
        CONTEXT=$(kubectl config current-context)
        CLUSTER=$(kubectl config view -o jsonpath="{.contexts[?(@.name==\"${CONTEXT}\")].context.cluster}")
        SERVER=$(kubectl config view -o jsonpath="{.clusters[?(@.name==\"${CLUSTER}\")].cluster.server}")
        TOKEN=$(kubectl create token "${SERVICE_ACCOUNT}" --namespace "${NAMESPACE}" --duration="${DURATION}")
        CERT=$(mktemp)
    
        mkdir -p "$(dirname "${OUTPUT}")"
        kubectl config view --raw=true -o jsonpath="{.clusters[?(@.name==\"${CLUSTER}\")].cluster.certificate-authority-data}" | base64 -d >"${CERT}"
        kubectl config set-cluster "${CLUSTER}" --kubeconfig="${OUTPUT}" --server="${SERVER}" --embed-certs=true --certificate-authority="${CERT}" >/dev/null
        kubectl config set-credentials "${SERVICE_ACCOUNT}" --kubeconfig="${OUTPUT}" --token="${TOKEN}" >/dev/null
        kubectl config set-context "${CLUSTER}-${NAMESPACE}-${SERVICE_ACCOUNT}-context" --kubeconfig="${OUTPUT}" --cluster="${CLUSTER}" --user="${SERVICE_ACCOUNT}" --namespace="${NAMESPACE}" >/dev/null
        kubectl config use-context "${CLUSTER}-${NAMESPACE}-${SERVICE_ACCOUNT}-context" --kubeconfig="${OUTPUT}" >/dev/null
        rm "${CERT}"
        echo "Saved kubeconfig to \"${OUTPUT}\"."
    }
    
    main() {
        parse "$@"
        generate_kubeconfig
    }
    
    main "$@"

    執(zhí)行如下命令,為用戶創(chuàng)建KubeConfig文件并保存至各自的家目錄下,您可以自定義過(guò)期時(shí)間,例如下面示例將過(guò)期時(shí)間設(shè)置為720小時(shí):

    bash generate-kubeconfig.sh -n dev1 -s bob -d 720h  -o /home/bob/.kube/config
    bash generate-kubeconfig.sh -n dev2 -s tom -d 720h  -o /home/tom/.kube/config

    預(yù)期輸出如下:

    $ bash generate-kubeconfig.sh -n dev1 -s bob -d 720h  -o /home/bob/.kube/config
    Saved kubeconfig to "/home/bob/.kube/config".
    
    $ bash generate-kubeconfig.sh -n dev2 -s tom -d 720h  -o /home/tom/.kube/config
    Saved kubeconfig to "/home/tom/.kube/config".

    完成上述操作后,用戶使用自己的賬號(hào)登錄Client機(jī)器后,就可以使用Arena自動(dòng)連接正確的集群環(huán)境。至此,本文示例已完成目標(biāo)一目標(biāo)二

步驟三:為用戶配置Arena的權(quán)限

  1. 在ACK集群中為每個(gè)組(Namespace),按需創(chuàng)建組內(nèi)的角色(Role)。

    集群管理員可以為每個(gè)組(Namespace)在ACK集群的具體操作權(quán)限配置不同的角色(Role)。一個(gè)角色(Role)代表組(Namespace)內(nèi)一系列具體權(quán)限規(guī)則的集合。有關(guān)ACK集群中角色(Role)的定義方法,請(qǐng)參見(jiàn)Using RBAC Authorization

    1. 創(chuàng)建權(quán)限定義文件。

      因?yàn)樾枰WC組dev1下用戶bob和組dev2下用戶tom的作業(yè)彼此不可見(jiàn),并且獨(dú)立管理各自的作業(yè),所以需要給組dev1和dev2創(chuàng)建最小權(quán)限,并綁定到對(duì)應(yīng)的用戶上(即用戶bob和tom對(duì)應(yīng)的ServiceAccount)。

      為用戶組dev1創(chuàng)建如下權(quán)限定義文件并保存為dev1_roles.yaml

      kind: ClusterRole
      apiVersion: rbac.authorization.k8s.io/v1
      metadata:
        name: arena-topnode
      rules:
      - apiGroups:
        - ""
        resources:
        - pods
        - services
        - deployments
        - nodes
        - nodes/*
        - services/proxy
        - persistentvolumes
        verbs:
        - get
        - list
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:
        name: arena
        namespace: dev1
      rules:
        - apiGroups:
            - ""
          resources:
            - configmaps
          verbs:
            - '*'
        - apiGroups:
            - ""
          resources:
            - services/proxy
            - persistentvolumeclaims
            - events
          verbs:
            - get
            - list
        - apiGroups:
            - ""
          resources:
            - pods
            - pods/log
            - services
          verbs:
            - '*'
        - apiGroups:
            - ""
            - apps
            - extensions
          resources:
            - deployments
            - replicasets
          verbs:
            - '*'
        - apiGroups:
            - kubeflow.org
          resources:
            - '*'
          verbs:
            - '*'
        - apiGroups:
            - batch
          resources:
            - jobs
          verbs:
            - '*'

      為用戶組dev2創(chuàng)建如下權(quán)限定義文件并保存為dev2_roles.yaml

      kind: ClusterRole
      apiVersion: rbac.authorization.k8s.io/v1
      metadata:
        name: arena-topnode
      rules:
      - apiGroups:
        - ""
        resources:
        - pods
        - services
        - deployments
        - nodes
        - nodes/*
        - services/proxy
        - persistentvolumes
        verbs:
        - get
        - list
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:
        name: arena
        namespace: dev2
      rules:
      - apiGroups:
        - ""
        resources:
        - configmaps
        verbs:
        - '*'
      - apiGroups:
        - ""
        resources:
        - services/proxy
        - persistentvolumeclaims
        - events
        verbs:
        - get
        - list
      - apiGroups:
        - ""
        resources:
        - pods
        - pods/log
        - services
        verbs:
        - '*'
      - apiGroups:
        - ""
        - apps
        - extensions
        resources:
        - deployments
        - replicasets
        verbs:
        - '*'
      - apiGroups:
        - kubeflow.org
        resources:
        - '*'
        verbs:
        - '*'
      - apiGroups:
        - batch
        resources:
        - jobs
        verbs:
        - '*'
    2. 集群管理員執(zhí)行以下命令,使之在ACK集群中生效。

      kubectl apply -f dev1_roles.yaml
      
      kubectl apply -f dev2_roles.yaml

      預(yù)期輸出如下:

      $ kubectl apply -f dev1_roles.yaml
      clusterrole.rbac.authorization.k8s.io/arena-topnode created
      role.rbac.authorization.k8s.io/arena created
      
      $ kubectl apply -f dev2_roles.yaml
      clusterrole.rbac.authorization.k8s.io/arena-topnode unchanged
      role.rbac.authorization.k8s.io/arena created
    3. 集群管理員可以通過(guò)以下命令查看集群中不同Namespace下的角色。

      kubectl get role -n dev1
      
      kubectl get role -n dev2

      預(yù)期輸出如下:

      $ kubectl get role -n dev1
      NAME    CREATED AT
      arena   2024-09-14T08:25:34Z
      
      $ kubectl get role -n dev2
      NAME    CREATED AT
      arena   2024-09-14T08:25:39Z
  2. 為用戶配置在集群內(nèi)的權(quán)限(賦權(quán))。

    組的角色創(chuàng)建完成后,我們需要給用戶綁定這個(gè)角色,使之作用在組里的成員上,即賦權(quán)給用戶。集群管理員通過(guò)將組(Namespace)內(nèi)的某些角色(Role)與用戶(ServiceAccount)進(jìn)行綁定,來(lái)為每位用戶在組內(nèi)賦權(quán)。

    通過(guò)角色綁定,集群管理員可以為用戶賦予多個(gè)組內(nèi)的角色權(quán)限。這既包括用戶所屬的用戶組的組內(nèi)權(quán)限,也包括其他組內(nèi)的權(quán)限。這樣集群管理員就可以動(dòng)態(tài)地管理任何用戶在任何組內(nèi)的權(quán)限,只需要更新用戶與角色的對(duì)應(yīng)關(guān)系即可。

    ACK中通過(guò)定義RoleBinding和ClusterRoleBinding對(duì)象來(lái)聲明用戶(ServiceAccount)在不同組(Namespaces)或者整個(gè)集群所有組中可以扮演的角色而獲取權(quán)限。ACK中角色綁定(RoleBinding和ClusterRoleBinding)的定義方法可以參見(jiàn)官方的文檔Using RBAC Authorization

    本文以目標(biāo)三為例,僅需要將用戶bob和tom分別綁定各自組的權(quán)限即可(步驟三中創(chuàng)建的角色)。操作步驟如下:

    1. 集群管理員以root身份登錄Client機(jī)器后,為用戶bob創(chuàng)建如下授權(quán)文件并保存為bob_rolebindings.yaml

      kind: ClusterRoleBinding
      apiVersion: rbac.authorization.k8s.io/v1
      metadata:
        name: bob-arena-topnode
        namespace: dev1
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: arena-topnode
      subjects:
      - kind: ServiceAccount
        name: bob
        namespace: dev1
      ---
      kind: RoleBinding
      apiVersion: rbac.authorization.k8s.io/v1
      metadata:
        name: bob-arena
        namespace: dev1
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: Role
        name: arena
      subjects:
      - kind: ServiceAccount
        name: bob
        namespace: dev1

      為用戶tom創(chuàng)建用戶授權(quán)文件并保存為tom_rolebindings.yaml

      kind: ClusterRoleBinding
      apiVersion: rbac.authorization.k8s.io/v1
      metadata:
        name: tom-arena-topnode
        namespace: dev2
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: arena-topnode
      subjects:
      - kind: ServiceAccount
        name: tom
        namespace: dev2
      ---
      kind: RoleBinding
      apiVersion: rbac.authorization.k8s.io/v1
      metadata:
        name: tom-arena
        namespace: dev2
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: Role
        name: arena
      subjects:
      - kind: ServiceAccount
        name: tom
        namespace: dev2
    2. 執(zhí)行如下命令完成用戶和角色的綁定,即用戶賦權(quán)。

      kubectl apply -f bob_rolebindings.yaml
      
      kubectl apply -f tom_rolebindings.yaml

      預(yù)期輸出:

      $ kubectl apply -f bob_rolebindings.yaml
      clusterrolebinding.rbac.authorization.k8s.io/bob-arena-topnode created
      rolebinding.rbac.authorization.k8s.io/bob-arena created
      
      $ kubectl apply -f tom_rolebindings.yaml
      clusterrolebinding.rbac.authorization.k8s.io/tom-arena-topnode created
      rolebinding.rbac.authorization.k8s.io/tom-arena created
    3. 集群管理員通過(guò)以下命令查看集群中不同Namespace下對(duì)不同用戶的角色賦權(quán)情況。

      kubectl get rolebinding -n dev1
      
      kubectl get rolebinding -n dev2

      預(yù)期輸出如下:

      $ kubectl get rolebinding -n dev1
      NAME        ROLE         AGE
      bob-arena   Role/arena   34s
      
      $ kubectl get rolebinding -n dev2
      NAME        ROLE         AGE
      tom-arena   Role/arena   33s

      至此,本文示例已完成了上述的前三個(gè)目標(biāo)任務(wù)。

步驟四:配置用戶組資源配額

AI平臺(tái)通過(guò)ACK統(tǒng)一管理所有集群資源。為了保證不同組和用戶安全、有效地使用集群資源,需要為小組分配資源配額。AI平臺(tái)會(huì)在用戶提交作業(yè)時(shí),自動(dòng)檢查用戶有權(quán)限運(yùn)行作業(yè)的組配額使用情況。如果作業(yè)需求量超過(guò)配額上限,則提交會(huì)被拒絕。

在ACK中資源配額(ResourceQuota)的作用域是命名空間(Namespace),即對(duì)應(yīng)本文中的用戶組。ResourceQuota支持的資源類型很多,既包括CPU、Memory,也包括Nvidia GPU這類擴(kuò)展資源。ResourceQuota也能夠限制一個(gè)Namespace中容器及其它Kubernetes對(duì)象的使用量。有關(guān)更詳細(xì)的說(shuō)明,請(qǐng)參見(jiàn)Resource Quotas

根據(jù)目標(biāo)四中的描述,本文示例按照組劃分當(dāng)前集群的GPU、CPU、MEM等資源。示例假設(shè)劃分的配置如數(shù)據(jù)配置表所示。本文示例將分配組dev1一張GPU卡,不劃分CPU和MEM,即可以使用整個(gè)集群的CPU和MEM。分配組dev2兩張GPU卡,八核CPU和60 GiB MEM。具體的操作步驟如下:

  1. 集群管理員登錄Client機(jī)器后,為用戶組dev1創(chuàng)建如下資源配額文件并保存為dev1_quota.yaml

    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: dev1-compute-resources
      namespace: dev1
    spec:
      hard:
        requests.cpu: "10"
        requests.memory: 10Gi
        limits.cpu: "15"
        limits.memory: 20Gi
        requests.nvidia.com/gpu: 2

    為用戶組dev2創(chuàng)建如下資源配置文件并保存為dev2_quota.yaml

    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: dev2-compute-resources
      namespace: dev2
    spec:
      hard:
        requests.nvidia.com/gpu: 2
  2. 執(zhí)行以下命令使之在集群中生效。

    kubectl apply -f dev1_quota.yaml
    
    kubectl apply -f dev2_quota.yaml
  3. 創(chuàng)建后,集群管理員可以通過(guò)以下命令查看ResourceQuota是否生效,并可以看到定義的配額以及組內(nèi)已經(jīng)分配掉的資源。

    # 查看組dev1下的資源配額。
    kubectl get resourcequotas -n dev1
    
    # 查看組dev2下的資源配額。
    kubectl get resourcequotas -n dev2
    
    # 查看組dev1資源配額的使用情況。
    kubectl describe resourcequotas dev1-compute-resources -n dev1
    
    # 查看組dev2資源配額的使用情況。
    kubectl describe resourcequotas dev2-compute-resources -n dev2

    預(yù)期輸出:

    $ kubectl get resourcequotas -n dev1
    NAME                     AGE   REQUEST                                                                     LIMIT
    dev1-compute-resources   9s    requests.cpu: 0/10, requests.memory: 0/10Gi, requests.nvidia.com/gpu: 0/2   limits.cpu: 0/15, limits.memory: 0/20Gi
    
    $ kubectl get resourcequotas -n dev2
    NAME                     AGE   REQUEST                        LIMIT
    dev2-compute-resources   10s   requests.nvidia.com/gpu: 0/2
    
    $ kubectl describe resourcequotas dev1-compute-resources -n dev1
    Name:                    dev1-compute-resources
    Namespace:               dev1
    Resource                 Used  Hard
    --------                 ----  ----
    limits.cpu               0     15
    limits.memory            0     20Gi
    requests.cpu             0     10
    requests.memory          0     10Gi
    requests.nvidia.com/gpu  0     2
    
    $ kubectl describe resourcequotas dev2-compute-resources -n dev2
    Name:                    dev2-compute-resources
    Namespace:               dev2
    Resource                 Used  Hard
    --------                 ----  ----
    requests.nvidia.com/gpu  0     2

    至此,本文完成了上述的目標(biāo)四的按照組劃分ACK集群計(jì)算資源。

步驟五:配置多級(jí)別共享存儲(chǔ)NAS

根據(jù)用戶組織內(nèi)對(duì)數(shù)據(jù)共享的控制規(guī)則,可以為AI平臺(tái)內(nèi)的組和用戶分別配置帶有相應(yīng)權(quán)限控制的數(shù)據(jù)卷掛載,方便用戶間安全地共享數(shù)據(jù)。

本文示例目標(biāo)五需要?jiǎng)?chuàng)建兩類共享數(shù)據(jù)卷。一類用于存放全局的共享數(shù)據(jù),所有組內(nèi)成員都可以訪問(wèn)和使用,另一類僅僅用于各個(gè)小組內(nèi)共享。本文假設(shè)共享數(shù)據(jù)卷的需求如數(shù)據(jù)配置表所示。四個(gè)數(shù)據(jù)卷dev1-publicdev2-publicdepartment1-public-dev1department1-public-dev2中的department1-public-dev1department1-public-dev2指向NAS盤的同一個(gè)目錄,組dev1和dev2共享這一份數(shù)據(jù)。dev1-publicdev2-public分別指向組dev1和組dev2所屬NAS盤的不同目錄,組dev1 、dev2獨(dú)享這份數(shù)據(jù)。具體操作如下:

  1. 創(chuàng)建NAS實(shí)例。

    阿里云NAS控制臺(tái)開(kāi)通、購(gòu)買NAS實(shí)例,并創(chuàng)建掛載點(diǎn)。有關(guān)詳細(xì)步驟,請(qǐng)參見(jiàn)配置NAS共享存儲(chǔ)

  2. 配置ACK集群的存儲(chǔ)卷(PV)和存儲(chǔ)聲明(PVC)。

    1. 創(chuàng)建PV。

      分別創(chuàng)建4個(gè)PV。有關(guān)創(chuàng)建PV的具體操作步驟,請(qǐng)參見(jiàn)創(chuàng)建PVdepartment1-public-dev1department1-public-dev2是用于dev1和dev2兩組分別共享部門department1的數(shù)據(jù)。dev1-publicdev2-public是用于dev1和dev2各自組內(nèi)共享數(shù)據(jù)。創(chuàng)建PV的參數(shù)配置如下圖所示。PV

      說(shuō)明

      設(shè)置掛載點(diǎn)時(shí),選擇上一步驟創(chuàng)建NAS實(shí)例時(shí)創(chuàng)建的掛載點(diǎn)。

    2. 創(chuàng)建PVC。

      使用上一步創(chuàng)建的PV,分別創(chuàng)建PVC。有關(guān)創(chuàng)建PVC的具體操作步驟,請(qǐng)參見(jiàn)創(chuàng)建PVC

      完成創(chuàng)建PVC后,可以看到在命名空間dev1下給dev1組分配部門和小組兩級(jí)共享的NAS數(shù)據(jù)卷:department1-public-dev1dev1-public。在命名空間dev2下給dev2組分配部門和小組兩級(jí)共享的NAS數(shù)據(jù)卷:department1-public-dev2dev2-public

  3. 檢查數(shù)據(jù)卷的配置。

    集群管理員以root身份登錄Client機(jī)器,執(zhí)行以下命令查看為不同組分配的NAS數(shù)據(jù)情況。

    # 查看組dev1可以使用的數(shù)據(jù)卷。
    arena data list -n dev1
    
    # 查看組dev2可以使用的數(shù)據(jù)卷。
    arena data list -n dev2

    預(yù)期輸出:

    check

    至此,本文已經(jīng)完成了所有目標(biāo)。接下來(lái)本文將會(huì)以bob和tom賬戶進(jìn)行登錄使用Arena。

步驟六:模擬多用戶操作

用戶bob

  1. 登錄Client機(jī)器,執(zhí)行以下命令查看當(dāng)前可用的共享數(shù)據(jù)卷。

    # 使用bob賬號(hào)登錄Client機(jī)器
    ssh bob@39.98.xxx.xx
    
    # 通過(guò)arena data list查看當(dāng)前用戶可用共享數(shù)據(jù)卷。
    arena data list

    預(yù)期輸出:

    result

  2. 執(zhí)行以下命令提交一個(gè)需要1張GPU卡的訓(xùn)練作業(yè)。

    arena submit tf \
        --name=tf-git-bob-01 \
        --gpus=1 \
        --image=tensorflow/tensorflow:1.5.0-devel-gpu \
        --sync-mode=git \
        --sync-source=https://code.aliyun.com/xiaozhou/tensorflow-sample-code.git \
        "python code/tensorflow-sample-code/tfjob/docker/mnist/main.py --max_steps 10000 --data_dir=code/tensorflow-sample-code/data"
  3. 執(zhí)行以下命令列出當(dāng)前用戶提交的作業(yè)。

    arena list

    預(yù)期輸出:

    bob

  4. 執(zhí)行以下命令再提交一個(gè)使用一張GPU卡的訓(xùn)練作業(yè)。

    arena submit tf \
        --name=tf-git-bob-02 \
        --gpus=1 \
        --image=tensorflow/tensorflow:1.5.0-devel-gpu \
        --sync-mode=git \
        --sync-source=https://code.aliyun.com/xiaozhou/tensorflow-sample-code.git \
        "python code/tensorflow-sample-code/tfjob/docker/mnist/main.py --max_steps 10000 --data_dir=code/tensorflow-sample-code/data"

    由于本文示例只給dev1組分配了一張GPU卡,所以預(yù)期這個(gè)作業(yè)不會(huì)被調(diào)度啟動(dòng)。

    resultreason

    可以看到,雖然整個(gè)集群還有剩余資源,但是由于bob所在的組只被分配了一張GPU卡資源,并且當(dāng)前已經(jīng)有了一個(gè)作業(yè)占用了資源,所以bob后續(xù)的提交的作業(yè)就會(huì)被暫停。

用戶tom

  1. 執(zhí)行以下命令登錄Client機(jī)器,查看當(dāng)前可用的共享數(shù)據(jù)卷。

    # 使用tom賬號(hào)登錄Client機(jī)器。
    ssh tom@39.98.xx.xx
    
    # 通過(guò)arena data list查看當(dāng)前用戶可用共享數(shù)據(jù)卷。
    arena data list

    預(yù)期輸出:

    tom job

  2. 執(zhí)行以下命令列出當(dāng)前用戶提交的作業(yè)。

    arena list

    此時(shí)看不到bob提交的作業(yè)。list

  3. 執(zhí)行以下命令提交一個(gè)需要1張GPU卡的訓(xùn)練作業(yè)。

     arena submit tf \
         --name=tf-git-tom-01 \
         --gpus=1 \
         --chief-cpu=2 \
         --chief-memory=10Gi \
         --image=tensorflow/tensorflow:1.5.0-devel-gpu \
         --sync-mode=git \
         --sync-source=https://code.aliyun.com/xiaozhou/tensorflow-sample-code.git \
         "python code/tensorflow-sample-code/tfjob/docker/mnist/main.py --max_steps 10000 --data_dir=code/tensorflow-sample-code/data"
    說(shuō)明

    由于示例分配了組dev2的GPU、CPU、MEM資源,因此在dev2組里的用戶提交作業(yè)的時(shí)候需要明確指定GPU、CPU、MEM的使用資源。

  4. 執(zhí)行以下命令再次提交一個(gè)需要1張GPU卡的訓(xùn)練作業(yè)。

     arena submit tf \
         --name=tf-git-tom-02 \
         --gpus=1 \
         --chief-cpu=2 \
         --chief-memory=10Gi \
         --image=tensorflow/tensorflow:1.5.0-devel-gpu \
         --sync-mode=git \
         --sync-source=https://code.aliyun.com/xiaozhou/tensorflow-sample-code.git \
         "python code/tensorflow-sample-code/tfjob/docker/mnist/main.py --max_steps 10000 --data_dir=code/tensorflow-sample-code/data"
  5. 執(zhí)行以下命令列出當(dāng)前用戶提交的作業(yè)。

    arena list

    預(yù)期輸出:

    result

執(zhí)行結(jié)果

從上述操作可以看到,目前分別位于兩個(gè)組的用戶bob、tom可以通過(guò)自己的賬號(hào)登錄Client機(jī)器獨(dú)立地使用Arena ,并通過(guò)Arena查看和使用用戶當(dāng)前所在組可訪問(wèn)的存儲(chǔ)資源和計(jì)算資源,以及管理各自的作業(yè)。