Kubernetes Master-Node 通信
本文档描述了在 Kubernetes 中,Master 和 Cluster 是如何通信的,其中 Master 指的是 k8s apiserver, Cluster 指的是 k8s 集群。知道它们之间如何通信有助于构建出安全的网络配置,即便运行在不信任的网络上。
- 所有 Cluster 到 Master 的通讯都会发给 apiserver,一个监听 443 + 配置了 virtual ip 地址 + 开启了 authentication 的 https service。Cluster Nodes 启动时必须配置 public root certificate,这样他们才能安全地链接上 apiserver。
- Master 到 Cluster 的通信分为两种:1) apiserver->kubelet, 2) apiserver->nodes,pods,and services. 前者是向
cluster 上的每个节点都会运行着的 kubelet 进程通信,后者则是任意的 node, pod, service。
- apiserver -> kubelet 的使用场景是:拉 pod 的日志,通过 kubectl attach 进 pod,以及 kubelet 端口转发。路径的终点是 kubelets 的 HTTPS 端点。默认情况下这条路不校验 kubelet 的 certificate,所以可能会遭遇中间人攻击。如果要在不信任的网络上,记得给 apiserver 开启
--kubelet-certificate-authority
参数,或者用 SSH 隧道。还有,要接的打开 kubelet 的 authentication 和 authorization。 - apiserver -> nodes,pods,and services. 这条路也是默认 HTTP 连接,就算配置了 https 也不会校验证书。(不安全哦~)
- apiserver -> kubelet 的使用场景是:拉 pod 的日志,通过 kubectl attach 进 pod,以及 kubelet 端口转发。路径的终点是 kubelets 的 HTTPS 端点。默认情况下这条路不校验 kubelet 的 certificate,所以可能会遭遇中间人攻击。如果要在不信任的网络上,记得给 apiserver 开启
- SSH 隧道,apiserver 可以开起来连到 cluster 22 端口,所有的流量都走这条隧道。
衍生思考:通信要考虑的首要问题是 source+target 如何定义,第二个问题是安全。我们可以看出 Kubernetes 在 cluster->master 这个场景特别加上了 TLS 的校验,相信这是因为 master 控制着一切吧!反过来,master->cluster 就没那么紧要。