在 Kubernetes API 服务器和客户端之间加密和解密数据
Encrypt & Decrypt data between Kubernetes API Server and Client
我有两个使用 kubeadm 的 kubernetes 集群设置,我使用 haproxy 将流量重定向和负载平衡到不同的集群。现在我想将请求重定向到每个集群的相应 api 服务器。
因此,我需要解密 ssl 请求,读取 "Host" 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"
我认为我使用了错误的解密和加密证书。
我需要使用 apiserver.crt 、 apiserver.key 和 ca.crt 目录中的文件 /etc/kubernetes/pki ?
您的设置可能需要通过客户端证书对您的 Kubernetes API 服务器进行身份验证;当您的 HAProxy 重新启动连接时,它不会使用本地计算机上的客户端密钥和证书进行连接,并且它可能会发出未经身份验证的请求。因此,它可能无权了解 pod
和 node
资源。
另一种方法是通过读取 SNI header 并以这种方式转发流量来在 L4 进行代理。这样,您不需要读取任何 HTTP header,因此您不需要解密和 re-encrypt 流量。这可能与 HAProxy 相关。
我有两个使用 kubeadm 的 kubernetes 集群设置,我使用 haproxy 将流量重定向和负载平衡到不同的集群。现在我想将请求重定向到每个集群的相应 api 服务器。 因此,我需要解密 ssl 请求,读取 "Host" 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"
我认为我使用了错误的解密和加密证书。 我需要使用 apiserver.crt 、 apiserver.key 和 ca.crt 目录中的文件 /etc/kubernetes/pki ?
您的设置可能需要通过客户端证书对您的 Kubernetes API 服务器进行身份验证;当您的 HAProxy 重新启动连接时,它不会使用本地计算机上的客户端密钥和证书进行连接,并且它可能会发出未经身份验证的请求。因此,它可能无权了解 pod
和 node
资源。
另一种方法是通过读取 SNI header 并以这种方式转发流量来在 L4 进行代理。这样,您不需要读取任何 HTTP header,因此您不需要解密和 re-encrypt 流量。这可能与 HAProxy 相关。