在kubernetes中凝视

发布于 2025-02-07 04:24:20 字数 2414 浏览 1 评论 0原文

背景

由于我们的应用程序需要使用粘性表作为自定义标头,我们决定使用Haproxy,我们的布局外观如下:

nginx Ingress - > Haproxy服务 - > 的无头服务

到目前为止,粘性 效果很好,但是在某种情况下,如果由其他haproxy副本处理,则会失败。我们正在尝试使用同行来解决这个问题。

我使用 bitnami helm cart :

metadata:
  chartName: bitnami/haproxy
  chartVersion: 0.3.7
service:
  type: ClusterIP
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 8080
    - name: https
      protocol: TCP
      port: 443
      targetPort: 8080
    - name: peers
      protocol: TCP
      port: 10000
      targetPort: 10000
containerPorts:
  - name: http
    containerPort: 8080
  - name: https
    containerPort: 8080
  - name: peers
    containerPort: 10000

configuration: |
  global
    log stdout format raw local0 debug

  defaults
    mode http
    option  httplog
    timeout client 10s
    timeout connect 5s
    timeout server 10s
    timeout http-request 10s
    log global

  resolvers default
    nameserver dns1 172.20.0.10:53
    hold timeout         30s
    hold refused         30s
    hold valid           10s

    resolve_retries 3
    timeout retry 3s

  peers hapeers  

    peer $(MY_POD_IP):10000  # I attempted to do something like this
    peer $(REPLICA_2_IP):10000 #

  frontend stats
    bind *:8404
    stats enable
    stats uri /
    stats refresh 10s

  frontend myfrontend
    mode http
    option httplog
    bind *:8080
    default_backend webservers

  backend webservers
    mode http
    log stdout local0 debug
    stick-table type string len 64 size 1m expire 1d peers hapeers
    stick on req.hdr(MyHeader)
    server s1 headless-service-1:8080 resolvers default check port 8080 inter 5s rise 2 fall 20
    server s2 headless-service-2:8080 resolvers default check port 8080 inter 5s rise 2 fall 20
    server s3 headless-service-3:8080 resolvers default check port 8080 inter 5s rise 2 fall 20

replicaCount: 2
extraEnvVars:
  - name: LOG_LEVEL
    value: debug
  - name: MY_POD_IP
    valueFrom:
      fieldRef:
        fieldPath: status.podIP

从我在Haproxy文档中阅读的内容,它需要同行IP,在这种情况下,这是复制ips。但是,configmap不允许从Haproxy副本注入IP。

我还考虑使用使用正确的IPS在部署时间修改haproxy.cfg修改haproxy.cfg,但我必须更改图表的叉子来自定义。

如果有人对不同的方法或解决方法有所了解,我将不胜感激。谢谢!

Background

Due to our application needs to use sticky tables for a custom header, we decided to use HAProxy, our layout looks as follows:

Nginx Ingress -> HAproxy service -> headless services of stateful application

So far stickiness works fine, but there is a scenario where if handled by the other HAproxy replica, it fails. We are trying to use peers to address this problem.

I use bitnami helm chart to deploy it, this is my values file:

metadata:
  chartName: bitnami/haproxy
  chartVersion: 0.3.7
service:
  type: ClusterIP
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 8080
    - name: https
      protocol: TCP
      port: 443
      targetPort: 8080
    - name: peers
      protocol: TCP
      port: 10000
      targetPort: 10000
containerPorts:
  - name: http
    containerPort: 8080
  - name: https
    containerPort: 8080
  - name: peers
    containerPort: 10000

configuration: |
  global
    log stdout format raw local0 debug

  defaults
    mode http
    option  httplog
    timeout client 10s
    timeout connect 5s
    timeout server 10s
    timeout http-request 10s
    log global

  resolvers default
    nameserver dns1 172.20.0.10:53
    hold timeout         30s
    hold refused         30s
    hold valid           10s

    resolve_retries 3
    timeout retry 3s

  peers hapeers  

    peer $(MY_POD_IP):10000  # I attempted to do something like this
    peer $(REPLICA_2_IP):10000 #

  frontend stats
    bind *:8404
    stats enable
    stats uri /
    stats refresh 10s

  frontend myfrontend
    mode http
    option httplog
    bind *:8080
    default_backend webservers

  backend webservers
    mode http
    log stdout local0 debug
    stick-table type string len 64 size 1m expire 1d peers hapeers
    stick on req.hdr(MyHeader)
    server s1 headless-service-1:8080 resolvers default check port 8080 inter 5s rise 2 fall 20
    server s2 headless-service-2:8080 resolvers default check port 8080 inter 5s rise 2 fall 20
    server s3 headless-service-3:8080 resolvers default check port 8080 inter 5s rise 2 fall 20

replicaCount: 2
extraEnvVars:
  - name: LOG_LEVEL
    value: debug
  - name: MY_POD_IP
    valueFrom:
      fieldRef:
        fieldPath: status.podIP

From what I read in HAProxy documentation, it requires the peers IP's, which in this case are the replicas IPs. However, the configmap does not allow injecting IPs from the HAProxy replicas.

I also thought of using a initContainer to modify the haproxy.cfg at deployment time with the correct IPs, but the volume is read-only and I would have to alter a fork of the chart to customize it.

If anyone has an idea of a different approach or workaround, I would appreciate the comments. Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

揽月 2025-02-14 04:24:20

... ConfigMap不允许从Haproxy Replicas注入IP。

haproxy的配置支持环境变量。例如。 peer $(my_pod_ip):10000 => peer $ {my_pod_ip}:10000

...the configmap does not allow injecting IPs from the HAProxy replicas.

HAProxy's configuration supports environment variables. Eg. peer $(MY_POD_IP):10000 => peer ${MY_POD_IP}:10000

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文