使用 Ingress Ambassador¶
Seldon Core 与 Ambassador 搭配良好,用于通过单入口暴露 Ambassador 以及 通过 Seldon 创建的 Ambassador 配置化的运行中机器学习部署的动态暴露。 Ambassador 是一个建立在 Envoy Proxy 基础上的 Kubernetes 原生 API 网关。完全通过 Kubernetes 自定义资源实现,Ambassador 提供强大的流量分发,身份验证,可观察性的管理能力。Ambassador 具有流行的服务网格原生实现,比如 Consul、Istio 以及 Linkerd。本文档中我们将讨论 Seldon Deployments 如何通过 Ambassador 暴露服务,以及如何同时使用这两种部署执行各种生产部署策略。
安装 Ambassador¶
安装 Ambassador 有两部建议:
Warning
Seldon Core 当前只支持 V1 Ambassador APIs. 你 必须 使用 datawire/ambassador helm chart 而不是使用 datawire/edge-stack 或者 V2 datawire/emissary charts。跟随 安装指引 可以正确工作。
建议 1:Ambassador 全栈¶
Ambassador Edge Stack 时最简单的开始 Ambassador 的方式,提供简单,自动 TLS 配置 等其他特性,如 身份验证,限流,和高级的路由行为,比如自定义前缀,虚拟主机,method/query-parameter 基础的路由等等。 查看 AES 安装说明将其安装到你的 Kubernetes 集群。
使用 helm 步骤可概况为:
kubectl create namespace ambassador || echo "namespace ambassador exists"
helm repo add datawire https://www.getambassador.io
helm install ambassador datawire/ambassador \
--set image.repository=docker.io/datawire/ambassador \
--set crds.keep=false \
--namespace ambassador
建议 2: Ambassador API 网关 (现为 Emissary Ingress)¶
Ambassador API Gateway (现在为 Emissary Ingress) 是 Ambassador Edge Stack 的完全开源版本,并且提供传统控制器入口的所有功能。 查看 Ambassador OSS 说明 将其安装到你的 Kubernetes 集群。
使用 helm 步骤可概况为:
kubectl create namespace ambassador || echo "namespace ambassador exists"
helm repo add datawire https://www.getambassador.io
helm install ambassador datawire/ambassador \
--set image.repository=docker.io/datawire/ambassador \
--set enableAES=false \
--set crds.keep=false \
--namespace ambassador
TLS¶
强烈建议使用 TLS 加密控制进入 Ambassador 的流量。默认安装自带自签名证书,并且未使用任何其他 TLS 配置。查看 说明 来对集群进行 TLS 配置。
Ambassador REST¶
假设 Ambassador 服务暴露于运行在 namespace 空间 <deploymentName> Seldon deployment 上的 <ambassadorEndpoint>:
注意,如果选择安装的是 Ambassador Edge Stack 需使用 https。即可使用TLS 设置 也可传递 -k 参数在 curl 中允许自签名证书。
对于限定了命名空间的 Seldon Core,singleNamespace=true,节点暴露为:
http(s)://<ambassadorEndpoint>/seldon/<deploymentName>/api/v1.0/predictionshttp(s)://<ambassadorEndpoint>/seldon/<namespace>/<deploymentName>/api/v1.0/predictions
全局运行的 Seldon Core,singleNamespace=false,节点暴露为:
http(s)://<ambassadorEndpoint>/seldon/<namespace>/<deploymentName>/api/v1.0/predictions
Curl示例¶
Ambassador REST¶
如果安装的是 OSS Ambassador API 网关,假设基于 Ambassador 的 Seldon Deployment mymodel 服务暴露为 0.0.0.0:8003 可按下面发送请求:
curl -v 0.0.0.0:8003/seldon/mymodel/api/v1.0/predictions -d '{"data":{"names":["a","b"],"tensor":{"shape":[2,2],"values":[0,0,1,1]}}}' -H "Content-Type: application/json"
或者,安装的是 TLS 配置的 Ambassador Edge Stack,假设基于 Ambassador 的 Seldon Deployment mymodel 服务 hostname 为 example-hostname.com:
curl -v https://example-hostname.com/seldon/mymodel/api/v1.0/predictions -d '{"data":{"names":["a","b"],"tensor":{"shape":[2,2],"values":[0,0,1,1]}}}' -H "Content-Type: application/json"
如果都不是,可使用 IP 地址代替 example-hostname 并传递 -k 选项来方位不安全的 TLS。
curl -vk https://0.0.0.0/seldon/mymodel/api/v1.0/predictions -d '{"data":{"names":["a","b"],"tensor":{"shape":[2,2],"values":[0,0,1,1]}}}' -H "Content-Type: application/json"
Ambassador 配置注解参考¶
注解 |
说明 |
|---|---|
|
自定义 Ambassador 配置 |
|
添加到 Ambassador 配置的 Header |
|
添加到 Ambassador |
|
T用于通过 header 头路由的正则表达式 |
|
Tambassador 将在连接失败时重试请求的次数。默认 0。如果需要更多控制,请使用自定义配置。 |
|
现有 Seldon Deployment 的名称,用于基于 shadow 或 header 的路由 |
|
gRPC 读取超时时间 |
|
REST 读取超时时间 |
|
Seldon 部署的最大连接数 |
|
等待连接时将排队的最大请求数 |
|
Seldon 部署的最大并行未完成请求数 |
|
Seldon 部署允许的最大并行重试次数 |
所有注解需放在 spec.annotations。
下面查看明细。
金丝雀部署¶
如果您希望将一定比例的流量推送到新模型以测试它在生产中是否正常工作,则可以使用 Canary 部署。要将金丝雀添加到您的 SeldonDeployment,只需添加一个新的预测器部分并将主要和金丝雀的流量级别设置为所需的级别。例如:
apiVersion: machinelearning.seldon.io/v1alpha2
kind: SeldonDeployment
metadata:
name: example
spec:
name: canary-example
predictors:
- componentSpecs:
- spec:
containers:
- image: seldonio/mock_classifier_rest:1.2.1
name: classifier
graph:
children: []
endpoint:
type: REST
name: classifier
type: MODEL
name: main
replicas: 1
traffic: 75
- componentSpecs:
- spec:
containers:
- image: seldonio/mock_classifier_rest:1.2.2
name: classifier
graph:
children: []
endpoint:
type: REST
name: classifier
type: MODEL
name: canary
replicas: 1
traffic: 25
以上示例包含 75% 流量分发到 「main」,25% 流量到 「canary」。
这里提供了一个canary 发布的示例。
影子部署¶
影子部署允许您向并行部署发送重复请求,但丢弃响应。这允许您在负载下测试机器学习模型并将结果与实时部署进行比较。
只需预测器中设置 shadow 布尔值。
提供了影子部署工作示例。
要了解有关 ambassador 配置的更多信息,请参阅他们的影子部署文档.
基于 Header 头的路由¶
基于标头的路由允许您根据传入请求中的标头将请求路由到特定的 Seldon 部署。
您只需要向您的 Seldon 部署资源添加一些注释。
seldon.io/ambassador-header:<header>: 加到 Ambassador 配置例:
"seldon.io/ambassador-header":"location: london"
seldon.io/ambassador-regex-header:<header>: 添加到配置的正则表达式标头例:
"seldon.io/ambassador-header":"location: lond.*"
seldon.io/ambassador-service-name:<existing_deployment_name>: 要附加到作为请求的替代映射的现有 Seldon 部署的名称。例:
"seldon.io/ambassador-service-name":"example"
我们提供了一个header头路由工作示例。
要了解有关 ambassador 配置的更多信息,请参阅 header 头路由文档。
限流¶
通过阻止对过载 Seldon 部署的额外连接或请求,限流器有助于提高系统的弹性。
您只需要向您的 Seldon 部署资源添加一些注释。
seldon.io/ambassador-circuit-breakers-max-connections:<maximum number of connections>: Seldon Deployment 的最大连接数Example:
"seldon.io/ambassador-circuit-breakers-max-connections":"200"
seldon.io/ambassador-circuit-breakers-max-pending-requests:<maximum number of queued requests>: 等待连接时排队的最大请求数Example:
"seldon.io/ambassador-circuit-breakers-max-pending-requests":"100"
seldon.io/ambassador-circuit-breakers-max-requests:<maximum number of parallel outstanding requests>: Seldon 部署的最大并行未完成请求数Example:
"seldon.io/ambassador-circuit-breakers-max-requests":"200"
seldon.io/ambassador-circuit-breakers-max-retries:<maximum number of parallel retries>: Seldon Deployment 允许的最大并行重试次数Example:
"seldon.io/ambassador-circuit-breakers-max-retries":"3"
提供了限流器的工作示例。
要了解有关 ambassador 配置的更多信息,请参阅限流器]文档。
同一集群中的多个 Ambassador¶
为了避免在运行多个 Ambassador 的集群中发生冲突,您可以将以下注释添加到您的 Seldon 部署资源中。
seldon.io/ambassador-id:<instance id>: 要添加到 Ambassador 的实例 idambassador_id配置
例如,
apiVersion: machinelearning.seldon.io/v1alpha2
kind: SeldonDeployment
metadata:
name: multi-ambassadors
spec:
annotations:
seldon.io/ambassador-id: my_instance
name: ambassadors-example
请注意,您的 Ambassador 实例必须配置为匹配的 ambassador_id。
查看 AMBASSADOR_ID 获取更多信息。
自定义 Amabassador 配置¶
上面讨论的配置应该涵盖大多数情况,但是自定义配置是必要的,以利用 Ambassador Edge Stack 的完整功能集作为流量管理和身份验证工具。根据您希望如何管理配置,有两种配置 Ambassador 的选项:自定义资源定义 (CRD) 和注释。
Ambassador 主要利用 自定义资源 来管理配置。这是 Kubernetes API 可读的自定义 kind 资源,用于以整个集群可观察的方式更新 Ambassador 的配置(例如,您可以使用 kubectl get 这些资源)。这些 CRD 可以独立于 Seldon Deploy 本身进行管理。
Ambassador 还支持基于注解的配置,可以使用 seldon.io/ambassador-config 注解键将其应用于 Seldon 部署。除了没有 metadata 和 spec 字段之外,基于注释的配置的整体格式与基于 CRD 的配置相同。以下片段演示了 CRD 和基于注释的配置之间的区别,并且在功能上是相同的。
apiVersion: getambassador.io/v2
kind: Mapping
metadata:
name: seldon_example_rest_mapping
spec:
prefix: /mycompany/ml/
service: production-model-example.seldon:8000
timeout_ms: 3000
seldon.io/ambassador-config:<configuration>: 自定义 ambassador 配置Example:
"seldon.io/ambassador-config":"apiVersion: ambassador/v2\nkind: Mapping\nname: seldon_example_rest_mapping\nprefix: /mycompany/ml/\nservice: production-model-example.seldon:8000\ntimeout_ms: 3000"
提供了自定义 Ambassador 配置的工作示例。