Multi-user 隔離¶
Kubeflow Pipelines 的多用戶隔離是 Kubeflow 整體多租戶功能的一部分。
資源如何隔離?¶
Kubeflow Pipelines 使用 Kubernetes 命名空間隔離資源,這些命名空間由 Kubeflow 的 Profile 來進行設定與管理。未經許可,其他用戶無法查看您的配置文件/命名空間中的資源,因為 Kubeflow Pipelines API 服務器拒絕對當前用戶無權訪問的命名空間的請求。
“Experiments” 直接屬於命名空間,運行和重複運行屬於其父實驗的命名空間。
“Pipeline Runs” 在用戶命名空間中執行,因此用戶可以利用 Kubernetes 命名空間隔離。例如,他們可以為不同命名空間中的其他服務配置不同的 secrets。
何時使用 UI¶
當您從 Kubeflow 儀表板訪問 Kubeflow Pipelines UI 時,它只會在您選擇的命名空間中顯示 “experiments”、“runs” 和 “recurring runs”。同樣,當您從 UI 創建資源時,它們也屬於您選擇的命名空間。
使用 SDK 時機¶
如何將 Pipelines SDK 連接到 Kubeflow Pipelines 將取決於您擁有的 Kubeflow 部署類型以及您從何處運行代碼。
- Full Kubeflow (from inside cluster)
- Full Kubeflow (from outside cluster)
- Standalone Kubeflow Pipelines (from inside cluster)
- Standalone Kubeflow Pipelines (from outside cluster)
以下 Python 代碼將從完整 Kubeflow 集群內的 Pod 創建實驗(和相關運行)。
import kfp
# the namespace in which you deployed Kubeflow Pipelines
kubeflow_namespace = "kubeflow"
# the namespace of your pipelines user (where the pipeline will be executed)
user_namespace = "jane-doe"
# the KF_PIPELINES_SA_TOKEN_PATH environment variable is used when no `path` is set
# the default KF_PIPELINES_SA_TOKEN_PATH is /var/run/secrets/kubeflow/pipelines/token
credentials = kfp.auth.ServiceAccountTokenVolumeCredentials(path=None)
# create a client
client = kfp.Client(host=f"http://ml-pipeline-ui.{kubeflow_namespace}", credentials=credentials)
# create an experiment
client.create_experiment(name="<YOUR_EXPERIMENT_ID>", namespace=user_namespace)
print(client.list_experiments(namespace=user_namespace))
# create a pipeline run
client.run_pipeline(
experiment_id="<YOUR_EXPERIMENT_ID>", # the experiment determines the namespace
job_name="<YOUR_RUN_NAME>",
pipeline_id="<YOUR_PIPELINE_ID>" # the pipeline definition to run
)
print(client.list_runs(experiment_id="<YOUR_EXPERIMENT_ID>"))
print(client.list_runs(namespace=user_namespace))
Tip
要為 Pipelines SDK 命令設置默認命名空間,請使用 kfp.Client().set_user_namespace()
方法,此方法將您的用戶命名空間存儲在 $HOME/.config/kfp/context.json
的配置文件中。
可以在 Kubeflow Pipelines SDK Reference 中找到 kfp.Client()
的詳細文檔。
使用 REST API 時機¶
調用 Kubeflow Pipelines REST API 時,實驗 API 需要命名空間參數。
命名空間由“資源引用”指定,其類型為 NAMESPACE 且 key.id 等於命名空間名稱。
以下代碼使用生成的 python API 客戶端創建實驗和管道運行。
import kfp
from kfp_server_api import *
# the namespace in which you deployed Kubeflow Pipelines
kubeflow_namespace = "kubeflow"
# the namespace of your pipelines user (where the pipeline will be executed)
user_namespace = "jane-doe"
# the KF_PIPELINES_SA_TOKEN_PATH environment variable is used when no `path` is set
# the default KF_PIPELINES_SA_TOKEN_PATH is /var/run/secrets/kubeflow/pipelines/token
credentials = kfp.auth.ServiceAccountTokenVolumeCredentials(path=None)
# create a client
client = kfp.Client(host=f"http://ml-pipeline-ui.{kubeflow_namespace}", credentials=credentials)
# create an experiment
experiment: ApiExperiment = client._experiment_api.create_experiment(
body=ApiExperiment(
name="<YOUR_EXPERIMENT_ID>",
resource_references=[
ApiResourceReference(
key=ApiResourceKey(
id=user_namespace,
type=ApiResourceType.NAMESPACE,
),
relationship=ApiRelationship.OWNER,
)
],
)
)
print("-------- BEGIN: EXPERIMENT --------")
print(experiment)
print("-------- END: EXPERIMENT ----------")
# get the experiment by name (only necessary if you comment out the `create_experiment()` call)
# experiment: ApiExperiment = client.get_experiment(
# experiment_name="<YOUR_EXPERIMENT_ID>",
# namespace=user_namespace
# )
# create a pipeline run
run: ApiRunDetail = client._run_api.create_run(
body=ApiRun(
name="<YOUR_RUN_NAME>",
pipeline_spec=ApiPipelineSpec(
# replace <YOUR_PIPELINE_ID> with the UID of a pipeline definition you have previously uploaded
pipeline_id="<YOUR_PIPELINE_ID>",
),
resource_references=[ApiResourceReference(
key=ApiResourceKey(
id=experiment.id,
type=ApiResourceType.EXPERIMENT,
),
relationship=ApiRelationship.OWNER,
)
],
)
)
print("-------- BEGIN: RUN --------")
print(run)
print("-------- END: RUN ----------")
# view the pipeline run
runs: ApiListRunsResponse = client._run_api.list_runs(
resource_reference_key_type=ApiResourceType.EXPERIMENT,
resource_reference_key_id=experiment.id,
)
print("-------- BEGIN: RUNS --------")
print(runs)
print("-------- END: RUNS ----------")
當前限制¶
以下資源目前不支持隔離,在沒有訪問控制的情況下共享:
- 管道(Pipeline definitions)。
- 機器學習元數據 (MLMD) 中的工件、執行和其他元數據實體。
- 包含管道運行的輸入/輸出工件的 Minio 工件存儲。