Kubernetes 有没有办法在多个节点的pod之间进行负载平衡?

Kubernetes 有没有办法在多个节点的pod之间进行负载平衡?,kubernetes,load-balancing,Kubernetes,Load Balancing,我使用rke部署了kubernetes群集,该群集由3个不同服务器中的3个节点组成,在这些服务器中有1个pod运行yatsukino/healthereum,这是以太坊/客户端go:stable的个人修改。 问题是,我不明白如何添加一个外部ip来发送请求到POD 我的播客可能有3种状态: 他们正在同步以太坊区块链 由于同步问题,它们重新启动 它们是同步的,一切都很好 < P>我不希望我的负载均衡器将请求转移到2个第一状态,只有第三点认为我的POD是最新的。 我一直在kubernetes文档中搜索

我使用rke部署了kubernetes群集,该群集由3个不同服务器中的3个节点组成,在这些服务器中有1个pod运行yatsukino/healthereum,这是以太坊/客户端go:stable的个人修改。 问题是,我不明白如何添加一个外部ip来发送请求到POD

我的播客可能有3种状态:

  • 他们正在同步以太坊区块链
  • 由于同步问题,它们重新启动
  • 它们是同步的,一切都很好
  • < P>我不希望我的负载均衡器将请求转移到2个第一状态,只有第三点认为我的POD是最新的。 我一直在kubernetes文档中搜索,但(可能是因为误解)我只在一个唯一节点中找到了POD的负载平衡

    这是我的部署文件:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: goerli
      name: goerli-deploy
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: goerli
      template:
        metadata:
          labels:
            app: goerli
        spec:
          containers:
            - image: yatsukino/healthereum
              name: goerli-geth
              args: ["--goerli", "--datadir", "/app", "--ipcpath", "/root/.ethereum/geth.ipc"]
              env:
              - name: LASTBLOCK
                value: "0"
              - name: FAILCOUNTER
                value: "0"
              ports:
              - containerPort: 30303
                name: geth
              - containerPort: 8545
                name: console
              livenessProbe:
                exec:
                  command:
                  - /bin/sh
                  - /app/health.sh
                initialDelaySeconds: 20
                periodSeconds: 60
              volumeMounts:
              - name: app
                mountPath: /app
          initContainers: 
          - name: healthcheck
            image: ethereum/client-go:stable
            command: ["/bin/sh", "-c", "wget -O /app/health.sh http://my-bash-script && chmod 544 /app/health.sh"]
            volumeMounts:
            - name: app
              mountPath: "/app"
          restartPolicy: Always
          volumes:
          - name: app
            hostPath:
              path: /app/
    
    

    对于负载平衡和公开吊舱,您可以使用

    为了检查pod何时准备就绪,您可以使用所解释的调整您的活跃度和准备度探测器


    对于探针,您可能需要考虑执行操作,如执行脚本,检查需要什么,返回依赖于状态的0或1。<以上>解释了概念,但是关于您的问题,服务和外部IP;例如,您必须声明服务

    apiVersion: v1
    kind: Service
    metadata:
      name: goerli
    spec:
      selector:
        app: goerli
      ports:
      - port: 8545
      type: LoadBalancer
    
    type:LoadBalancer
    将为公共云中的或如果您使用类似的方式,分配一个外部地址。使用
    kubectl get svc goerli
    检查您的地址。如果外部地址“挂起”,则您有问题

    如果这是您自己的设置,您可以使用
    externalIPs
    分配您自己的外部ip

    apiVersion: v1
    kind: Service
    metadata:
      name: goerli
    spec:
      selector:
        app: goerli
      ports:
      - port: 8545
      externalIPs:
      - 222.0.0.30
    
    externalIPs
    可以从集群外部使用,但您必须自己将流量路由到任何节点,例如

    ip route add 222.0.0.30/32 \
      nexthop via 192.168.0.1 \
      nexthop via 192.168.0.2 \
      nexthop via 192.168.0.3
    

    假设您的k8s节点具有ip 192.168.0.x。这将设置到节点的ECMP路由。当您从集群外部向222.0.0.30:8545发出请求时,k8s将在您准备好的吊舱之间实现负载平衡。

    当容器启动时,Kubernetes可以配置为等待可配置的 在执行第一次准备就绪检查之前要经过的时间量。在那之后,它 定期调用探测,并根据准备就绪探测的结果进行操作。如果 pod报告它还没有准备好,已经从服务中删除。如果豆荚变成 准备好了,它被重新添加。 与活动性探测不同,如果容器未通过就绪性检查,它将不会被终止或终止 重新启动。这是活性和就绪性探测之间的一个重要区别。 Liveness探测器通过清除不健康的容器和更换容器来保持豆荚的健康 他们使用新的健康的,而就绪探测器确保只有那些 已准备好处理请求并接收它们。这在集装箱运输过程中是非常必要的 启动,但在容器运行一段时间后也很有用


    我想你可以用probe来实现你的目标

    写的都是同样的东西哈哈@FrankYuchengGu是的,它确实发生在开放论坛:)对于负载平衡,我已经看过那些文档页面,但我不理解它的工作方式。为什么客户端位于节点中?为什么总是有一个kubeProxy?服务在哪里?因为我已经做好了准备。我只是更准确地解释了我的想法,但问题是如何实现负载平衡。很抱歉造成这种混乱!负载平衡是在服务中实现的。谢谢!我很欣赏这个明确的答案。在第一种情况下,我似乎有问题。。。状态为挂起。我已经尝试了第二种方法,然后和外部IP,但它的钢不可能为我ping的外部IP。。。有什么想法吗?可能是因为rke?您永远无法在k8s中ping服务(外部或内部),因为ICMP echo未转发。不过,TCP连接仍然可以工作。