k8s进阶1-集群内的通信
k8s进阶1-集群内的通信
Master-Node之间的通信
Kubernetes集群和Master节点(实际上是 apiserver)之间的通信路径。用户在自定义集群的安装之前,或者调整集群的网络配置之前必须理解这部分内容。
例如:
将公网 IP 地址上的机器作为节点加入到 Kubernetes 集群
Master-Node 之间的通信可以分为如下两类:
Cluster to Master
Master to Cluster
一 Cluster to Master
Cluster to Master**
所有从集群访问 Master 节点的通信,都是针对 apiserver 的(没有任何其他 master 组件发布远程调用接口)。通常安装 Kubernetes 时,apiserver 监听 HTTPS 端口(443),并且配置了一种或多种 客户端认证方式 authentication
。至少需要配置一种形式的 授权方式 authorization
,尤其是 匿名访问 anonymous requests
或 Service Account Tokens
被启用的情况下。
节点上必须配置集群(apiserver)的公钥根证书(public root certificate),此时,在提供有效的客户端身份认证的情况下,节点可以安全地访问 APIServer。例如,在 Google Kubernetes Engine 的一个默认 Kubernetes 安装里,通过客户端证书为 kubelet 提供客户端身份认证。
对于需要调用 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 是如何工作的。
得益于这些措施,默认情况下,从集群(节点以及节点上运行的 Pod)访问 master 的连接是安全的,因此,可以通过不受信的网络或公网连接 Kubernetes 集群
二 mater to cluster
从 master(apiserver)到Cluster存在着两条主要的通信路径:
apiserver 访问集群中每个节点上的 kubelet 进程
使用 apiserver 的 proxy 功能,从 apiserver 访问集群中的任意节点、Pod、Service
1 apiserver to kubelet
apiserver 在如下情况下访问 kubelet:
2 抓取 Pod 的日志
通过
kubectl exec -it 指令
(或 kuboard 的终端界面)获得容器的命令行终端提供 kubectl port-forward 功能
这些连接的访问端点是 kubelet 的 HTTPS 端口。默认情况下,apiserver 不校验 kubelet 的 HTTPS 证书,这种情况下,连接可能会收到 man-in-the-middle 攻击,因此该连接如果在不受信网络或者公网上运行时,是 不安全 的。
如果要校验 kubelet 的 HTTPS 证书,可以通过--kubelet-certificate-authority
参数为 apiserver 提供校验 kubelet 证书的根证书。
如果不能完成这个配置,又需要通过不受信网络或公网将节点加入集群,则需要使用 SSH隧道 连接 apiserver 和 kubelet。
同时,Kubelet authentication/authorization 需要激活,以保护 kubelet API
3 apiserver to nodes, pods, services
从 apiserver 到 节点/Pod/Service 的连接使用的是 HTTP 连接,没有进行身份认证,也没有进行加密传输。您也可以通过增加 https 作为 节点/Pod/Service 请求 URL 的前缀,但是 HTTPS 证书并不会被校验,也无需客户端身份认证,因此该连接是无法保证一致性的。目前,此类连接如果运行在非受信网络或公网上时,是 不安全 的
4 SSH隧道
Kubernetes 支持 SSH隧道(tunnel)来保护 Master –> Cluster 访问路径。此时,apiserver 将向集群中的每一个节点建立一个 SSH隧道(连接到端口22的ssh服务)并通过隧道传递所有发向 kubelet、node、pod、service 的请求。
三 yaml的hostAliases
Kubelet 管理 hosts Pod 中每个容器的 hosts 文件,以便可以阻止 Docker 在容器启动以后 修改 该文件
当修改或者添加yaml文件的hostAliases:IP时候,就会添加到/etc/hosts文件内
spec:
restartPolicy: Never
hostAliases:
- ip: "127.0.0.1"
由于该文件已经被 Kubelet 管理起来,任何对该文件手工修改的内容,都将在 Kubelet 重启容器或者 Pod 重新调度时被覆盖。因此,最好是通过hostAliases
修改 Pod 的 /etc/hosts 文件,而不是手工修改
。
- 感谢你赐予我前进的力量