1

我有一个包含 5 个副本的部署。都有 ssh 和 telnet。它们不应该是负载平衡的。我希望每个人都从可预测的 5 个列表中进行选择。

这是我的部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  selector:
    matchLabels:
      app: myapp
  replicas: 5
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:1.0
        ports:
        - name: ssh
          protocol: TCP
          containerPort: 22
        - name: telnet
          protocol: TCP
          containerPort: 23

出于说明目的,这是我的带有无效 nodePort 值的服务。

apiVersion: v1
kind: Service
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  type: NodePort
  ports:
  - name: ssh
    port: 22
    nodePort: [30022, 30122, 30222, 30322, 30422, 30522]
  - name: telnet
    port: 23
    nodePort: [30023, 30123, 30223, 30323, 30423, 30523]

我希望能够完成两件事:

  1. 每个 pod 副本实例只会从 [30022, 30122, 30222, 30322, 30422, 30522] 获得一个 ssh 端口,从 [30023, 30123, 30223, 30323, 30423, 30523] 获得一个 telnet 端口
  2. 获得 ssh 端口 30022 的 pod 副本实例也获得 telnet 端口 30023。获得 ssh 端口 30122 的 pod 副本实例获得 30123 的 telnet 端口,依此类推。

谢谢!

4

2 回答 2

1

考虑到“副本”的概念意味着将与其他的相同;一个克隆

根据您的问题,您需要具有基于模板的唯一对象,因此这些对象DeploymentStatefulSet依赖于ReplicaSet.

至于StatefulSet标签方法,我宁愿说这更像是一种多对一的关系,这意味着整体Service将链接到特定的 pod。这意味着NodePort服务中映射的所有端口都将为集合中的特定 pod 提供服务。如果我的理解是正确的,您宁愿希望暴露的端口和 pod 之间存在一对一的关系。

由于服务的作用类似于负载均衡器,将传入请求路由到每个后端(部署中的副本)上的完全相同的目标(端口),因此您需要的唯一性类型可能最好将每个单独作为DeploymentStatefulSet与其对应的NodePort服务一起使用并根据您对每种情况的需要映射您的端口。

这种方法当然具有很高的运营开销,但可以应对您的用例所需的唯一性级别。

于 2019-08-16T15:54:40.130 回答
1

您可以使用StatefulSet而不是 Deployment:

与 Deployment 类似,StatefulSet 管理基于相同容器规范的 Pod。与 Deployment 不同,StatefulSet 为其每个 Pod 维护一个粘性标识。这些 pod 是根据相同的规范创建的,但不可互换:每个 pod 都有一个持久标识符,它在任何重新调度时都会维护该标识符。

StatefulSets 的一个特别有用的特性是,您将获得一个可预测地为每个 pod 生成的唯一标签:

当 StatefulSet 控制器创建 Pod 时,它会添加一个标签 ,该标签statefulset.kubernetes.io/pod-name设置为 Pod 的名称。此标签允许您将 Service 附加到 StatefulSet 中的特定 Pod。[来源]

然后,您将创建五个不同的服务,每个 pod 一个,格式如下:

apiVersion: v1
kind: Service
metadata:
  name: myapp-${n}
  labels: { ... } # whatever you want
spec:
  type: NodePort
  selector: 
    statefulset.kubernetes.io/pod-name: myapp-${n} # assuming you keep the name
                                                   # "myapp" and just switch kind
                                                   # from Deployment to StatefulSet
  ports:
  - name: ssh
    port: 22
    nodePort: 30${n}22
  - name: telnet
    port: 23
    nodePort: 30${n}23

替换${n}0通过4

于 2019-08-20T05:19:59.120 回答