Kubernetes HAProxy入口控制器服务更改了GCP上的IP

Kubernetes HAProxy入口控制器服务更改了GCP上的IP,kubernetes,google-kubernetes-engine,kubernetes-ingress,kubernetes-service,haproxy-ingress,Kubernetes,Google Kubernetes Engine,Kubernetes Ingress,Kubernetes Service,Haproxy Ingress,我在GKE集群中使用HAProxy作为入口控制器。以及将HAProxy服务公开为LoadBalancer服务(内部) 最近,我遇到了一个问题,HA代理服务更改了其外部IP,流量停止路由到HAProxy。此问题在不同的日期发生多次(现在已停止)。我必须手动将新的外部IP添加到负载均衡器的前端,以允许HAProxy的流量。 有两个豆荚在为HAProxy跑,两个豆荚都跑了好几天了,他们的日志里什么都没有。我认为这与服务或GCP LB有关,而不是HAProxy本身。 恐怕我没有任何与此相关的日志 我仍然

我在GKE集群中使用HAProxy作为入口控制器。以及将HAProxy服务公开为LoadBalancer服务(内部)

最近,我遇到了一个问题,HA代理服务更改了其外部IP,流量停止路由到HAProxy。此问题在不同的日期发生多次(现在已停止)。我必须手动将新的外部IP添加到负载均衡器的前端,以允许HAProxy的流量。
有两个豆荚在为HAProxy跑,两个豆荚都跑了好几天了,他们的日志里什么都没有。我认为这与服务或GCP LB有关,而不是HAProxy本身。
恐怕我没有任何与此相关的日志

我仍然不知道,是什么导致了服务IP的改变。因为最近没有任何变化,集群和所有服务都正常运行了很多天,所以突然发生了这种情况

以前有没有人遇到过类似的问题?或者我可以做些什么来避免将来出现此类问题?
是什么导致了IP的变化

以下是我的服务的配置方式:

---
apiVersion: v1
kind: Service
metadata:
  labels:
    run: haproxy-ingress
  name: haproxy-ingress
  namespace: haproxy-controller
  annotations:
    cloud.google.com/load-balancer-type: "Internal"
    networking.gke.io/internal-load-balancer-allow-global-access: "true"
    cloud.google.com/network-tier: "Premium"
spec:
  selector:
    run: haproxy-ingress
  type: LoadBalancer
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
  - name: stat
    port: 1024
    protocol: TCP
    targetPort: 1024

找到一些日志:

Warning SyncLoadBalancerFailed 30m (x3570 over 13d) service-controller Error syncing load balancer: failed to ensure load balancer: googleapi: Error 409: IP_IN_USE_BY_ANOTHER_RESOURCE - IP '10.17.129.17' is already being used by another resource.
Normal EnsuringLoadBalancer 3m33s (x3576 over 13d) service-controller Ensuring load balancer

不幸的是,没有日志,很难说清楚。您应该检查GKE发送给云日志的审计日志,因为这可能会让您了解发生了什么。一个选项是GCP“oops”,GLB和GKE重新创建了它,从而为它提供了一个新的IP。我从来没有听说过LBs会发生这种情况(这种情况经常发生在节点上,但LBs不会)。更常见的情况是,您运行了一些kubectl命令,无意中删除了服务对象,然后由您设置的某个管理层(Argo、Flux、Helm Operator等)重新创建了服务对象,但删除+重新创建意味着它是一个具有新IP的新LB。后一种情况应该在审计日志中可见,因此请查看这些情况。

简短的回答是:
服务的外部IP
是短暂的。
因为HA代理控制器吊舱是重新创建的,所以HA代理服务是使用临时IP创建的

为了避免这个问题,我建议使用可以在loadBalancerIP字段中引用的静态IP

这可以通过以下步骤完成:

  • 保留一个静态IP。()
  • 使用此IP创建服务()
示例YAML:

apiVersion: v1
kind: Service
metadata:
  name: helloweb
  labels:
    app: hello
spec:
  selector:
    app: hello
    tier: web
  ports:
  - port: 80
    targetPort: 8080
  type: LoadBalancer
  loadBalancerIP: "YOUR.IP.ADDRESS.HERE"

LB没有被重新创建,它与其他后端和前端保持一致。当检查时,服务也存在了很长一段时间,我没有任何管理层。从当天发现的两行日志中,添加了问题。