Kubernetes 为什么一个seldon部署有两个服务

Kubernetes 为什么一个seldon部署有两个服务,kubernetes,seldon,Kubernetes,Seldon,我注意到每当我部署一个模型时,就会有两个服务,例如 kubectl get service -n model-namespace NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE iris-model-default ClusterIP 10.96.82.232 <none> 8000/TCP

我注意到每当我部署一个模型时,就会有两个服务,例如

kubectl get service -n model-namespace 
NAME                            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)             AGE
iris-model-default              ClusterIP   10.96.82.232   <none>        8000/TCP,5001/TCP   8h
iris-model-default-classifier   ClusterIP   10.96.76.141   <none>        9000/TCP            8h

CRD定义似乎很有用

k describe service/iris-model-default
Name:              iris-model-default
Namespace:         model-namespace
Labels:            app.kubernetes.io/managed-by=seldon-core
                   seldon-app=iris-model-default
                   seldon-deployment-id=iris-model
Annotations:       getambassador.io/config:
                     ---
                     apiVersion: ambassador/v1
                     kind: Mapping
                     name: seldon_model-namespace_iris-model_default_rest_mapping
                     prefix: /seldon/model-namespace/iris-model/
                     rewrite: /
                     service: iris-model-default.model-namespace:8000
                     timeout_ms: 3000
                     ---
                     apiVersion: ambassador/v1
                     kind: Mapping
                     name: seldon_model-namespace_iris-model_default_grpc_mapping
                     grpc: true
                     prefix: /(seldon.protos.*|tensorflow.serving.*)/.*
                     prefix_regex: true
                     rewrite: ""
                     service: iris-model-default.model-namespace:5001
                     timeout_ms: 3000
                     headers:
                       namespace: model-namespace
                       seldon: iris-model
Selector:          seldon-app=iris-model-default
Type:              ClusterIP
IP:                10.96.82.232
Port:              http  8000/TCP
TargetPort:        8000/TCP
Endpoints:         172.18.0.17:8000
Port:              grpc  5001/TCP
TargetPort:        8000/TCP
Endpoints:         172.18.0.17:8000
Session Affinity:  None
Events:            <none>
所以只涉及一个pod,我认为这些端口是从不同的容器映射的:

k get pods -o json | jq '.items[].spec.containers[] | .name, .ports'                                                                                                                           [0] 0s 
"classifier"
[
  {
    "containerPort": 6000,
    "name": "metrics",
    "protocol": "TCP"
  },
  {
    "containerPort": 9000,
    "name": "http",
    "protocol": "TCP"
  }
]
"seldon-container-engine"
[
  {
    "containerPort": 8000,
    "protocol": "TCP"
  },
  {
    "containerPort": 8000,
    "name": "metrics",
    "protocol": "TCP"
  }
]

一个更具体的问题是为什么需要这么多的端口?

是的,看起来您的pod中有两个容器

第一项服务:

虹膜模型默认值
➡️ <代码>赛尔登集装箱引擎HTTP:
8000:8000
和GRPC:
5001:8000

第二项服务:

虹膜模型默认分类器
➡️ <代码>分类器HTTP:
9000:9000
(内部使用的6000看起来像是度量)

您没有提到,但听起来像是部署了分类器:

apiVersion:machinelearning.seldon.io/v1 种类:塞尔登 元数据: 名称:虹膜模型 名称空间:seldon 规格: 姓名:iris 预测因素: -图表: 实现:SKLEARN_服务器 modelUri:gs://seldon models/sklearn/iris 名称:分类器 名称:默认值 副本:1份
如果您想了解您可能已经深入研究的两个容器/服务背后的基本原理,请添加部署YAMLCOLD
kubectl描述…
服务并显示
kubectl get pods——显示标签。如果我们可以看到服务选择的标签,我们就可以理解哪些pod用于什么。集群中是否还有其他东西应该使用clusterps?因为如果Pod中的容器需要相互通信,它们应该通过
localhost
进行通信。这就是紧密耦合的微服务的多容器吊舱的便利性。我不知道。老实说,我对这种设置感到困惑。我将调查您创建的CR-可能有配置字段用于操纵此行为。奇怪的是,有两个ClusterIP服务没有在集群中使用。奇怪的是,有两个服务,但只有一个吊舱。这并不能解释为什么有两个服务。考虑到只有一个多集装箱吊舱,我认为这里没有真正的理由(就佳能而言)提供两种服务。Echo@Serge,同样的8000端口映射到8000端口,5001端口也很奇怪。就这个分类器而言,只涉及REST。@Rico,你有什么建议可以在操作员的指导下寻找更好的分类器吗?我对接线员不太熟悉
k get pods --show-labels
NAME                                               READY   STATUS    RESTARTS   AGE   LABELS
iris-model-default-0-classifier-579765fc5b-rm6np   2/2     Running   0          10h   app.kubernetes.io/managed-by=seldon-core,app=iris-model-default-0-classifier,fluentd=true,pod-template-hash=579765fc5b,seldon-app-svc=iris-model-default-classifier,seldon-app=iris-model-default,seldon-deployment-id=iris-model,version=default
k get pods -o json | jq '.items[].spec.containers[] | .name, .ports'                                                                                                                           [0] 0s 
"classifier"
[
  {
    "containerPort": 6000,
    "name": "metrics",
    "protocol": "TCP"
  },
  {
    "containerPort": 9000,
    "name": "http",
    "protocol": "TCP"
  }
]
"seldon-container-engine"
[
  {
    "containerPort": 8000,
    "protocol": "TCP"
  },
  {
    "containerPort": 8000,
    "name": "metrics",
    "protocol": "TCP"
  }
]