【问题标题】:Encrypt & Decrypt data between Kubernetes API Server and Client在 Kubernetes API 服务器和客户端之间加密和解密数据
【发布时间】:2020-09-02 13:47:26
【问题描述】:

我有两个使用 kubeadm 的 kubernetes 集群设置,我使用 haproxy 将流量重定向和负载平衡到不同的集群。现在我想将请求重定向到每个集群的相应 api 服务器。 因此,我需要解密 ssl 请求,读取“主机”HTTP-Header 并再次加密流量。我的示例 haproxy 配置文件如下所示:

frontend k8s-api-server
        bind *:6443 ssl crt /root/k8s/ssl/apiserver.pem
        mode http
        default_backend k8s-prod-master-api-server

backend k8s-prod-master-api-server
        mode http
        option forwardfor
        server master 10.0.0.2:6443 ssl ca-file /root/k8s/ssl/ca.crt

如果我现在通过 kubectl 访问 api 服务器,我会收到以下错误:

kubectl get pods
error: the server doesn't have a resource type "pods"
kubectl get nodes
error: the server doesn't have a resource type "nodes"

我认为我使用错误的证书进行解密和加密。 我是否需要使用目录 /etc/kubernetes/ 中的 apiserver.crtapiserver.keyca.crt 文件pki ?

【问题讨论】:

  • 您的设置可能需要通过客户端证书与您的 Kubernetes API 服务器进行身份验证;当您的 haproxy 重新启动连接时,它并没有使用本地计算机上的客户端密钥和证书这样做,它可能会发出未经身份验证的请求。因此,它可能无权了解podnode 资源,也许这就是您看到的问题?
  • 我不知道 haproxy 是否支持这一点,但另一种方法是在 L4 代理,但读取 SNI 标头并以这种方式转发流量。这样,您无需读取任何 HTTP 标头,因此您无需对流量进行解密和重新加密。 NGINX 支持这一点,如果 haproxy 也支持,我不会感到惊讶。
  • 正如@AmitKumarGupta 在他最后的评论中提到的那样,我使用 SNI 让它工作
  • 我会把它作为一个正确的答案让其他人更容易找到

标签: kubernetes ssl-certificate haproxy kubeadm kube-apiserver


【解决方案1】:

您的设置可能需要通过客户端证书对您的 Kubernetes API 服务器进行身份验证;当您的 HAProxy 重新启动连接时,它并没有使用本地计算机上的客户端密钥和证书这样做,并且它可能会发出未经身份验证的请求。因此,它可能无权了解podnode 资源。

另一种方法是通过读取 SNI 标头并以这种方式转发流量来在 L4 代理。这样,您无需读取任何 HTTP 标头,因此您无需对流量进行解密和重新加密。这可以通过 HAProxy 完成。

【讨论】:

    猜你喜欢
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多