Kubernetes 在一个pod中对同一应用程序的多个容器进行负载平衡

Kubernetes 在一个pod中对同一应用程序的多个容器进行负载平衡,kubernetes,kubernetes-service,Kubernetes,Kubernetes Service,我有一个场景,需要在同一个pod中运行两个应用程序容器实例。 我将它们设置为在不同端口上侦听。下面是部署清单的外观。 吊舱的发射与预期的集装箱数量相当。 我甚至可以从其他吊舱连接到podIP上的两个端口 kind: Deployment metadata: labels: service: app1-service name: app1-dep namespace: exp spec: template: spec: contianers:

我有一个场景,需要在同一个pod中运行两个应用程序容器实例。 我将它们设置为在不同端口上侦听。下面是部署清单的外观。 吊舱的发射与预期的集装箱数量相当。 我甚至可以从其他吊舱连接到podIP上的两个端口

kind: Deployment
metadata:
  labels:
    service: app1-service
  name: app1-dep
  namespace: exp
spec:
  template:
    spec:
      contianers:
        - image: app1:1.20
          name: app1
          ports:
          - containerPort: 9000
            protocol: TCP
        - image: app1:1.20
          name: app1-s1
          ports:
          - containerPort: 9001
            protocol: TCP
我甚至可以为集装箱的每个港口创建两个不同的服务,这也非常有效。 我可以单独到达这两个服务,并在吊舱内的相应容器上结束

apiVersion: v1
kind: Service
metadata:
  name: app1
  namespace: exp
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 9000
  selector:
    service: app1-service
  sessionAffinity: None
  type: ClusterIP

---
apiVersion: v1
kind: Service
metadata:
  name: app1-s1
  namespace: exp
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 9001
  selector:
    service: app1-service
  sessionAffinity: None
  type: ClusterIP
我希望容器的两个实例都位于单个服务后面,即两个容器之间的圆形知更鸟。
我怎样才能做到这一点?在服务领域内有可能吗?或者我需要探索类似的入口吗?

可以使用单个服务公开多个端口。在Kubernetes服务清单中,
spec.ports[]
是一个数组。因此,可以在其中指定多个端口。例如,请参见下文:

apiVersion: v1
kind: Service
metadata:
  name: app1
  namespace: exp
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 9000
  - name: http-s1
    port: 81
    protocol: TCP
    targetPort: 9001
  selector:
    service: app1-service
  sessionAffinity: None
  type: ClusterIP

现在,主机名除了端口之外都是相同的,默认情况下,
kube proxy
在用户空间模式下通过循环算法选择后端。

Kubernetes服务有三种代理模式:
iptables
(默认),
userspace
IPVS

  • Userspace
    :是较旧的方法,它以循环方式分发,是唯一的方法
  • Iptables
    :是默认设置,随机选择一个pod并坚持使用
  • IPVS
    :有多种方式分配流量,但首先必须在节点上安装,例如在centos节点上,使用以下命令:
    yum安装ipvsadm
    ,然后使其可用
正如我所说,默认情况下Kubernetes服务没有循环。 要激活
IPVS
,必须向kube代理添加一个参数

--代理模式=IPV


--ipvs scheduler=rr
(选择循环)

我要做的是将应用程序分为两个不同的部署,每个部署中有一个容器。我将为这两个部署设置相同的标签,并使用一个服务攻击它们

这样,您甚至不必在不同的端口上运行它们


稍后,如果您想让其中一个接收更多流量,我只需要计算每个部署的副本数量。

为什么要这样设置,而不是让部署使用每个容器的一个副本管理多个Pod副本?(…在这种情况下,普通服务将在副本之间循环,无需特殊配置。)多个pod副本是我们目前拥有的方式。然而,有一款应用程序在将数据映射到memroy时消耗了大约50G的RAM,但只占系统cpu的十分之一。我试图在pod中获得更多的容器实例,而不是pod副本,以便更好地利用集群资源。通过这种方式,两个应用程序实例使用相同的共享内存,因为它们最终都希望能够访问50G的某些部分。所有这些都不涉及应用程序,而是实际利用更多的CPU资源和吞吐量。但为什么不让它们成为具有不同副本计数的单独部署或复制集呢?通过这种方式,可以为不同大小的节点提供不同的节点注释,然后您可以为不同的部署制定关联规则,将更高内存使用率的POD固定在更高内存的节点上,反之亦然。我们使用单独的部署,每个部署都有多个Replicate。我试图解决的问题是减少内存占用。如果我有5个副本,例如,将创建5 x 50Gb的POD,并且可能/可能不在单个节点上。因此,如果我有两个AppContainer实例可以使用50Gb的共享内存,我就有可能减少副本数量并减少集群上的资源使用。不过,我将研究的一个选项是,尝试通过关联规则将这些应用程序pod固定到单个节点上,并查看interpod IPC共享。我应该澄清一下,我需要一个包含两个容器实例的单一IP和端口。我已经尝试了您所建议的,但是有了这个,我需要一些类似入口的东西,以便在两个服务端口之间实现负载平衡。我想看看服务区有没有什么东西。可能是一个特殊的服务和端点设置,可以让我工作。Ipvs是我们默认设置的。是的,IPV是为了实现更好的负载平衡。但我上面提到的情况是,需要一种将一个源端口映射到多个目标端口的方法。到目前为止,我可以找到一个有效的解决方案。服务连接到端点,端点由地址和端口定义,因此使用多个具有相同地址的端点应该没有问题。