使用 Python 管理 Snowpark Container Services¶
您可以使用 Python 管理 Snowpark 容器服务,这是一种完全托管的容器服务,您可以通过它来部署、管理和扩展容器化应用程序。有关 Snowpark 容器服务的概述,请参阅 关于 Snowpark Container Services。
使用 Snowflake Python API,您可以管理计算池、图像存储库和服务。
先决条件¶
在本主题中的示例中,假设您已添加了用来连接 Snowflake 和创建 Root
对象以使用 Snowflake Python API 的代码。
例如,以下代码使用配置文件中定义的连接参数来创建与 Snowflake 的连接:
from snowflake.core import Root
from snowflake.snowpark import Session
session = Session.builder.config("connection_name", "myconnection").create()
root = Root(session)
代码可通过生成的 Session
对象创建 Root
对象,从而使用 API 的类型和方法。有关更多信息,请参阅 使用 Snowflake Python API 连接到 Snowflake。
管理计算池¶
您可以管理计算池,它是虚拟机 (VM) 节点的集合,在这些节点上 Snowflake 运行 Snowpark 容器服务作业和服务。
Snowflake Python API 表示具有两种不同类型的计算池:
ComputePool
:显示计算池的属性,例如其仓库、最大节点和最小节点,以及自动恢复和自动暂停设置。ComputePoolResource
:显示对计算池执行操作的方法,例如如何提取相应的ComputePool
对象以及如何暂停、恢复和停止池。
有关计算池的详细信息,请参阅 Snowpark Container Services:使用计算池。
创建计算池¶
您可以调用 ComputePoolCollection.create
方法,并传递表示要创建的计算池的 ComputePool
对象,从而创建计算池。
要创建计算池,请先创建指定池属性的 ComputePool
对象,如下所示:
计算池名称
池将包含的最大节点数和最小节点数
实例系列的名称,标识要为池中的节点配置的计算机类型
当向池提交服务或作业时,池是否应该自动恢复
以下示例中的代码会创建 ComputePool
对象,表示一个名为 my_compute_pool
的池:
from snowflake.core import Root
from snowflake.core.compute_pool import ComputePool
compute_pool = ComputePool(name="my_compute_pool", min_nodes=1, max_nodes=2, instance_family="CPU_X64_XS", auto_resume=False)
root.compute_pools.create(compute_pool)
然后,代码通过将 ComputePool
对象传递给 ComputePoolCollection.create
方法创建计算池。
获取计算池详细信息¶
您可以通过调用 ComputePoolResource.fetch
方法来获取关于计算池的信息,该方法会返回一个 ComputePool
对象。
以下示例中的代码会获取有关名为 my_compute_pool
的池的信息:
from snowflake.core import Root
from snowflake.core.compute_pool import ComputePool
compute_pool = root.compute_pools["my_compute_pool"].fetch()
列出计算池¶
您可以使用 iter
方法列出计算池,该方法会返回一个 PagedIter
迭代器。
以下示例中的代码会列出名称以 abc 开头的计算池:
from snowflake.core import Root
compute_pools = root.compute_pools.iter(like="abc%")
for compute_pool in compute_pools:
print(compute_pool.name)
执行计算池操作¶
您可以使用 ComputePoolResource
对象执行常见的计算池操作(如暂停、恢复和停止池),而该对象可使用 ComputePool.fetch
方法进行获取。
以下示例中的代码暂停、恢复和停止 my_compute_pool
计算池:
from snowflake.core import Root
from snowflake.core.compute_pool import ComputePoolResource
compute_pool_res = root.compute_pools["my_compute_pool"]
compute_pool_res.suspend()
compute_pool_res.resume()
compute_pool_res.stop_all_services()
该代码使用 Root.compute_pools
方法来创建表示计算池的 ComputePool
对象。从 ComputePool
对象中,可以提取一个 ComputePoolResource
对象用于执行计算池操作。
管理图像存储库¶
您可以管理图像存储库,这些存储库可存储您在容器服务上运行的应用程序的图像。
图像存储库是一个架构级对象。当您创建或引用一个存储库时,您是在其架构的上下文中执行此操作的。
Snowflake Python API 表示具有两种不同类型的镜像仓库:
ImageRepository
:显示镜像仓库的属性,例如其数据库名称、架构名称、存储库 URL 以及所有者。ImageRepositoryResource
:显示可用于提取相应ImageRepository
对象的方法和删除镜像仓库资源的方法。
有关镜像仓库的详细信息,请参阅 Snowpark Container Services:使用镜像注册表和镜像仓库。
创建镜像仓库¶
要创建镜像仓库,请先创建指定存储库名称的 ImageRepository
对象。
以下示例中的代码会创建 ImageRepository
对象,表示一个名为 my_repo
的存储库:
from snowflake.core import Root
from snowflake.core.image_repository import ImageRepository
my_repo = ImageRepository("my_repo")
root.databases["my_db"].schemas["my_schema"].image_repositories.create(my_repo)
然后,代码通过将 ImageRepository
对象传递给 ImageRepositoryCollection.create
方法来创建镜像仓库,该存储库在 my_db
数据库和 my_schema
架构中进行创建。
获取镜像仓库详细信息¶
您可以通过调用 ImageRepositoryResource.fetch
方法来获取有关镜像仓库的信息,该方法会返回一个 ImageRepository
对象。
以下示例中的代码会获取一个表示 my_repo
镜像仓库的 ImageRepository
对象,然后打印存储库所有者的名称:
from snowflake.core import Root
from snowflake.core.image_repository import ImageRepository
my_repo_res = root.databases["my_db"].schemas["my_schema"].image_repositories["my_repo"]
my_repo = my_repo_res.fetch()
print(my_repo.owner)
列出镜像仓库¶
您可以使用 iter
方法在指定架构中列出镜像仓库,该方法会返回一个 ImageRepository
对象的 PagedIter
迭代器。
以下示例中的代码会列出 my_db
数据库和 my_schema
架构中的存储库名称:
from snowflake.core import Root
repo_list = root.databases["my_db"].schemas["my_schema"].image_repositories.iter()
for repo_obj in repo_list:
print(repo_obj.name)
删除镜像仓库¶
您可以使用 ImageRepositoryResource.delete
方法删除镜像仓库。
以下示例中的代码会删除 my_repo
存储库:
from snowflake.core import Root
from snowflake.core.image_repository import ImageRepositoryResource
my_repo_res = root.databases["my_db"].schemas["my_schema"].image_repositories["my_repo"]
my_repo_res.delete()
管理服务¶
您可以管理这些运行应用程序容器的服务,除非您停止它们。Snowflake 会在服务容器停止时自动重启服务。通过这种方式,服务可以不间断地有效运行。
服务是一个架构级对象。当您创建或引用一项服务时,您是在其架构的上下文中执行此操作的。
Snowflake Python API 使用两种不同类型来表示服务:
Service
:显示服务的属性,例如其规范、最小实例和最大实例,以及数据库和架构的名称。ServiceResource
:显示可用于提取相应Service
对象、暂停和恢复服务以及获取其状态的方法。
有关服务的详细信息,请参阅 Snowpark Container Services:使用服务。
创建服务¶
要创建服务,需要运行 services.create
方法,传递表示要创建的服务的 Service
对象。
您可根据已上传到暂存区的服务规范 .yaml
文件创建服务。有关创建服务规范的详细信息,请参阅 服务规范参考。
上传规范¶
如果要根据尚未上传到暂存区的规范创建服务,可使用 Snowpark FileOperation 对象上传该规范。
以下示例中的代码使用 FileOperation.put
方法将规范作为文件上传:
session.file.put("/local_location/my_service_spec.yaml", "@my_stage")
以下示例中的代码使用 FileOperation.put_stream
方法将规范作为字符串上传:
service_spec_string = """
// Specification as a string.
"""
session.file.put_stream(StringIO(sepc_in_string), "@my_stage/my_service_spec.yaml")
创建服务¶
要根据暂存区规范创建服务,请先创建指定如下服务属性的 Service
对象:
服务名称
Snowflake 可创建的最大和最小服务实例数
应向其中添加服务的计算池
存储位置和规格名称
以下示例中的代码会创建一个 Service
对象,表示从 @my_stage/my_service_spec.yaml
的规范中调用的 my_service
服务:
from snowflake.core import Root
from snowflake.core.service import Service, ServiceSpec
my_service = Service(name="my_service", min_instances=1, max_instances=2, compute_pool="my_compute_pool", spec=ServiceSpec("@my_stage/my_service_spec.yaml"))
root.databases["my_db"].schemas["my_schema"].services.create(my_service)
然后,代码通过将 Service
对象传递给 ServiceCollection.create
方法来创建服务,该服务在 my_db
数据库和 my_schema
架构中进行创建。
您还可以根据您作为内联文本提供的规范创建服务,如下例所示。ServiceSpec
函数采用单个字符串实参 spec
。如果字符串以 @
开头,则函数将其解释并验证为暂存区文件路径。否则该字符串将作为内联文本传递。
from textwrap import dedent
from snowflake.core import Root
from snowflake.core.service import Service, ServiceSpec
spec_text = dedent(f"""\
spec:
containers:
- name: hello-world
image: repo/hello-world:latest
""")
my_service = Service(name="my_service", min_instances=1, max_instances=2, compute_pool="my_compute_pool", spec=ServiceSpec(spec_text))
root.databases["my_db"].schemas["my_schema"].services.create(my_service)
获取服务详细信息¶
您可以通过调用 ServiceResource.fetch
方法获取有关 Snowflake 服务的信息,该方法会返回一个 Service
对象。
以下示例中的代码会获取一个名为 my_service
的服务的信息:
from snowflake.core import Root
from snowflake.core.service import Service
my_service = root.databases["my_db"].schemas["my_schema"].services["my_service"].fetch()
列出服务¶
您可以使用 iter
方法列出指定架构中的服务,该方法会返回一个 Service
对象的 PagedIter
迭代器。
以下示例中的代码会列出名称以 abc 开头的服务:
from snowflake.core import Root
services = root.databases["my_db"].schemas["my_schema"].services.iter(like="abc%")
for service_obj in services:
print(service_obj.name)
执行服务操作¶
您可以使用 ServiceResource
对象执行常见的服务操作 – 如暂停、恢复和获取服务状态。
以下示例中的代码会暂停和恢复 my_service
服务,还会获取服务状态:
from snowflake.core import Root
from snowflake.core.service import ServiceResource
my_service_res = root.databases["my_db"].schemas["my_schema"].services["my_service"]
my_service_res.suspend()
my_service_res.resume()
status = my_service_res.get_service_status(10)