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

时间:2019-04-03 13:57:25

标签: kubernetes load-balancing

我有一个部署了rke witch的kubernetes集群,它由3个不同服务器中的3个节点组成,在这些服务器中有1个运行yatsukino / healthereum的pod,这是对ethereum / client-go:stable的个人修改。 问题是我不了解如何添加外部ip以将请求发送到Pod女巫

我的广告连播可能处于3种状态:

  1. 他们同步以太坊区块链
  2. 由于同步问题,它们重新启动
  3. 它们是同步的,一切都很好

我不希望我的负载均衡器将请求转移到前两个状态,只有第三个点将我的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/

3 个答案:

答案 0 :(得分:2)

以上答案解释了这些概念,但涉及有关服务和外部IP的问题;您必须声明服务,例如;

apiVersion: v1
kind: Service
metadata:
  name: goerli
spec:
  selector:
    app: goerli
  ports:
  - port: 8545
  type: LoadBalancer

type: LoadBalancer将为公共云或使用metallb之类的地址分配一个外部地址。用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将在您的就绪 POD之间进行负载平衡。

答案 1 :(得分:1)

要进行负载平衡和暴露吊舱,可以使用https://kubernetes.io/docs/concepts/services-networking/service/

要检查Pod准备就绪的时间,您可以按照https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/

的说明来调整活动和就绪状态探针

对于探针,您可能需要考虑执行操作,例如执行检查所需内容并根据状态返回0或1的脚本。

答案 2 :(得分:0)

启动容器时,可以将Kubernetes配置为等待可配置的 进行第一次就绪检查之前要经过的时间。之后,它 定期调用探针,并根据就绪探针的结果进行操作。如果一个 pod表示尚未准备就绪,已将其从服务中删除。如果豆荚变成 再次准备好,重新添加。 与活动探针不同,如果容器未通过就绪检查,它不会被杀死或 重新启动。这是对活动性和就绪性探针的重要区别。 活度探针可以杀死不健康的容器并进行更换,从而使豆荚保持健康 他们使用新的健康的豆荚,而准备情况调查则确保只有 准备好为收到的请求提供服务。这在容器中最有必要 启动,但是在容器运行了一段时间后也很有用。

我认为您可以针对自己的目标使用探测