K8s-集群内的通信

Master-WorkNode

Cluster to Master

集群访问K8s Master,其实本质就是对于apiserver的通信(通信不是节点之间的通信,而是进程之间的通信


K8s安装K8s,apiserver默认是监听HTTPS端口(443),并且配置了客户端认证模式,提供授权模式.节点上必须配置集群(apiserver)的公钥根证书(public root certificate),此时,在提供有效的客户端身份认证的情况下,节点可以安全地访问 APIServer。


kubelet提供TLS认证过程


对于需要调用 APIServer 接口的 Pod,应该为其关联 Service Account,此时,Kubernetes将在创建Pod时自动为其注入公钥根证书(public root certificate)以及一个有效的 bearer token(放在HTTP请求头Authorization字段)。所有名称空间中,都默认配置了名为 kubernetes Kubernetes Service,该 Service对应一个虚拟 IP(默认为 10.96.0.1),发送到该地址的请求将由 kube-proxy 转发到 apiserver 的 HTTPS 端口上。请参考 Service连接应用程序 了解 Kubernetes Service 是如何工作的。

Master to Cluster

K8s Master to Cluster have two main ways:

  • apiserver to evert work-node kubelet
  • apiserver of proxy ,apiserver to work-node、Pod、Service

apiserver to kubelet

apiserver 在如下情况下访问 kubelet:

  • 抓取 Pod 的日志
  • 通过 kubectl exec -it 指令
  • 提供 kubectl port-forward 功能

这些连接的访问端点是 kubelet 的 HTTPS 端口。默认情况下,apiserver 不校验 kubelet 的 HTTPS 证书,这种情况下,连接可能会收到 man-in-the-middle 攻击,因此该连接如果在不受信网络或者公网上运行时,是 不安全 的。

如果要校验 kubelet 的 HTTPS 证书,可以通过 --kubelet-certificate-authority 参数为 apiserver 提供校验 kubelet 证书的根证书。

apiserver to nodes, pods, services

从 apiserver 到 节点/Pod/Service 的连接使用的是 HTTP 连接,没有进行身份认证,也没有进行加密传输。您也可以通过增加 https 作为 节点/Pod/Service 请求 URL 的前缀,但是 HTTPS 证书并不会被校验,也无需客户端身份认证,因此该连接是无法保证一致性的。目前,此类连接如果运行在非受信网络或公网上时,是 不安全