# k8s Master-Node 通信
# 概述
本文主要介绍 master 和 k8s 集群之间通信路径。其目的是允许用户自定义安装,以增强网络配置,使集群可以在不受信任(untrusted)的网络上运行。
# Cluster -> Master
从集群到 Master 节点的所有通信路径都在 apiserver 中终止。一个典型的 deployment,如果 apiserver 配置为监听运程连接上的 HTTPS 443 端口,应启用一种或多种 client authentication,特别是如果允许 anonymous requests 或 service account tokens。
Node 节点应该配置为集群的公共根证书,以便安全地连接到 apiserver。
希望连接到 apiserver 的 Pod 可以通过 service account 来实现,以便 k8s 在实例化时自动将公共根证书和有效的 bearer token 插入到 pod 中,k8s service (在所有 namespaces 中)都配置了一个虚拟 IP 地址,该 IP 地址由 apiserver 重定向(通过 kube - proxy)到 HTTPS。
Master 组件通过非加密(未加密或认证)端口与集群 apiserver 通信。这个端口通常只在 Master 主机的 localhost 接口上暴露。
# Master -> Cluster
从 Master (apiserver)到集群有两个主要的通信路径。第一个是从 apiserver 到在集群中的每个节点上运行的 kubelet 进程。第二个是通过 apiserver 的代理功能从 apiserver 到任何 node、pod 或 service。
# apiserver - > kubelet
从 apiserver 到 kubelet 的连接用于获取 pod 的日志,通过 kubectl 来运行 pod,并使用 kubelet 的端口转发功能。这些连接在 kubelet 的 HTTPS 终端处终止。
默认情况下,apiserver 不会验证 kubelet 的服务证书,这会使连接不受到保护。
要验证此连接,使用--kubelet-certificate-authority flag 为 apiserver 提供根证书包,以验证 kubelet 的服务证书。
如果不能实现,那么请在 apiserver 和 kubelet 之间使用 SSH tunneling。
最后,应该启用 Kubelet 认证或授权来保护 Kubelet API。
# apiserver -> nodes、pods、services
从 apiserver 到 Node、Pod 或 Service 的连接默认为 HTTP 连接,因此不需进行认证加密。也可以通过 HTTPS 的安全连接,但是它们不会验证 HTTPS 端口提供的证书,也不提供客户端凭据,因此连接将被加密但不会提供任何诚信的保证。这些连接不可以在不受信任/或公共网络上运行。
# SSH Tunnels
Google Container Engine 使用 SSH tunnels 来保护 Master -> 集群 通信路径,SSH tunnel 能够使 Node、Pod 或 Service 发送的流量不会暴露在集群外部。