如何使用 HAProxy 设置对 Kubernetes API 进行身份验证的 HTTP 检查

问题描述 投票:0回答:1

我使用 HAProxy 负载平衡我的 Kubernetes 集群,使用 TCP 运行状况检查,如 k3s 文档所述。我发现我的节点有时会变得“Unready”,但节点仍然回复 TCP 检查,使得对集群的请求不可靠。

为了解决这个问题,我想使用 Kubernetes 健康端点(/livez 和 /readyz),但 api 是经过身份验证的。我创建了一个具有长期令牌的服务帐户,并将监视角色绑定到它。现在我可以使用以下命令

curl  https://192.168.1.201:6443/healthz --cacert /usr/local/share/ca-certificates/ca.crt --header "Authorization: Bearer $TOKEN"
来卷曲 api 点。但是,我一生都无法创建一个 HAProxy 配置来转发所有流量而不触及它,并同时对 Kubernetes API 进行经过身份验证的运行状况检查。任何有关 HAProxy 配置的建议将不胜感激。

我当前的 HAProxy 设置:

global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

defaults
        log     global
        mode    tcp
        option  tcplog
        option logasap
        option  dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http

frontend k3s-frontend-api
    bind *:6443
    mode tcp
    option tcplog
    default_backend k3s-backend-api

backend k3s-backend-api
    mode tcp
    option tcp-check

    balance leastconn
    default-server downinter 5s
    server server-1 192.168.1.201:6443 check
    server server-2 192.168.1.202:6443 check
    server server-3 192.168.1.203:6443 check

frontend k3s-frontend-http
    bind *:6443
    mode tcp
    option tcplog
    default_backend k3s-backend-http

backend k3s-backend-http
    mode tcp
    option tcp-check

    balance leastconn
    default-server downinter 5s
    server server-1 192.168.1.201:80 check
    server server-2 192.168.1.202:80 check
    server server-3 192.168.1.203:80 check

frontend k3s-frontend-https
    bind *:443
    mode tcp
    option tcplog
    default_backend k3s-backend-https

backend k3s-backend-https
    mode tcp
    option tcp-check

    balance leastconn
    default-server downinter 5s
    server server-1 192.168.1.201:443 check
    server server-2 192.168.1.202:443 check
    server server-3 192.168.1.203:443 check

frontend stats
    mode http
    bind *:8404
    stats enable
    stats uri /stats
    stats refresh 10s
    stats auth user:pass
load-balancing haproxy kubernetes-apiserver
1个回答
0
投票

您可以在 TCP 模式下为后端创建 HTTP 检查,但您的配置只有

option tcp-check
。 相反,请进行 HTTP 检查:

option httpchk
http-check send meth GET uri /healthz hdr authorization "Bearer $TOKEN"

这使得 HTTP/1.0 检查。如果不起作用,请在

ver HTTP/1.1 hdr host <hostname_of_your_service>
之后添加
uri
来执行 HTTP/1.1。 可能还需要
http-check connect ssl
,因为你的服务器没有提到
ssl
,因为它是TCP模式。

© www.soinside.com 2019 - 2024. All rights reserved.