From 05843a7f9e60ee9edbfcf6417ee3aa4daf5b07f4 Mon Sep 17 00:00:00 2001 From: Qiming Teng Date: Fri, 19 Jun 2020 22:19:21 +0800 Subject: [PATCH] [zh] Sync control-plane-node-communication The original master-node-communication page was renamed with some new text added about Konnectivity. This PR resync the Chinese localization. --- .../control-plane-node-communication.md | 181 ++++++++++++++++++ .../architecture/master-node-communication.md | 69 ------- 2 files changed, 181 insertions(+), 69 deletions(-) create mode 100644 content/zh/docs/concepts/architecture/control-plane-node-communication.md delete mode 100644 content/zh/docs/concepts/architecture/master-node-communication.md diff --git a/content/zh/docs/concepts/architecture/control-plane-node-communication.md b/content/zh/docs/concepts/architecture/control-plane-node-communication.md new file mode 100644 index 0000000000..eafa80f804 --- /dev/null +++ b/content/zh/docs/concepts/architecture/control-plane-node-communication.md @@ -0,0 +1,181 @@ +--- +title: 控制面到节点通信 +content_type: concept +weight: 20 +--- + + + + + + + +本文对控制面节点(确切说是 apiserver)和 Kubernetes 集群之间的通信路径进行了分类。 +目的是为了让用户能够自定义他们的安装,以实现对网络配置的加固,使得集群能够在不可信的网络上 +(或者在一个云服务商完全公开的 IP 上)运行。 + + + + +## 节点到控制面 + +Kubernetes 采用的是中心辐射型(Hub-and-Spoke)API 模式。 +所有从集群(或所运行的 Pods)发出的 API 调用都终止于 apiserver(其它控制面组件都没有被设计为可暴露远程服务)。 +apiserver 被配置为在一个安全的 HTTPS 端口(443)上监听远程连接请求, +并启用一种或多种形式的客户端[身份认证](/docs/reference/access-authn-authz/authentication/)机制。 +一种或多种客户端[鉴权机制](/docs/reference/access-authn-authz/authorization/)应该被启用, +特别是在允许使用[匿名请求](/docs/reference/access-authn-autha/authentication/#anonymous-requests) +或[服务账号令牌](/docs/reference/access-authn-authz/authentication/#service-account-tokens)的时候。 + + + +应该使用集群的公共根证书开通节点,这样它们就能够基于有效的客户端凭据安全地连接 apiserver。 +例如:在一个默认的 GCE 部署中,客户端凭据以客户端证书的形式提供给 kubelet。 +请查看 [kubelet TLS 启动引导](/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/) +以了解如何自动提供 kubelet 客户端证书。 + + + +想要连接到 apiserver 的 Pod 可以使用服务账号安全地进行连接。 +当 Pod 被实例化时,Kubernetes 自动把公共根证书和一个有效的持有者令牌注入到 Pod 里。 +`kubernetes` 服务(位于所有名字空间中)配置了一个虚拟 IP 地址,用于(通过 kube-proxy)转发 +请求到 apiserver 的 HTTPS 末端。 + +控制面组件也通过安全端口与集群的 apiserver 通信。 + + + +这样,从集群节点和节点上运行的 Pod 到控制面的连接的缺省操作模式即是安全的,能够在不可信的网络或公网上运行。 + + + +## 控制面到节点 + +从控制面(apiserver)到节点有两种主要的通信路径。 +第一种是从 apiserver 到集群中每个节点上运行的 kubelet 进程。 +第二种是从 apiserver 通过它的代理功能连接到任何节点、Pod 或者服务。 + + + +### apiserver 到 kubelet + +从 apiserver 到 kubelet 的连接用于: + +* 获取 Pod 日志 +* 挂接(通过 kubectl)到运行中的 Pod +* 提供 kubelet 的端口转发功能。 + +这些连接终止于 kubelet 的 HTTPS 末端。 +默认情况下,apiserver 不检查 kubelet 的服务证书。这使得此类连接容易受到中间人攻击, +在非受信网络或公开网络上运行也是 **不安全的**。 + + + +为了对这个连接进行认证,使用 `--kubelet-certificate-authority` 标志给 apiserver +提供一个根证书包,用于 kubelet 的服务证书。 + +如果无法实现这点,又要求避免在非受信网络或公共网络上进行连接,可在 apiserver 和 +kubelet 之间使用 [SSH 隧道](#ssh-tunnels)。 + +最后,应该启用 [Kubelet 用户认证和/或鉴权](/docs/admin/kubelet-authentication-authorization/)来保护 kubelet API。 + + + +### apiserver 到节点、Pod 和服务 + +从 apiserver 到节点、Pod 或服务的连接默认为纯 HTTP 方式,因此既没有认证,也没有加密。 +这些连接可通过给 API URL 中的节点、Pod 或服务名称添加前缀 `https:` 来运行在安全的 HTTPS 连接上。 +不过这些连接既不会验证 HTTPS 末端提供的证书,也不会提供客户端证书。 +因此,虽然连接是加密的,仍无法提供任何完整性保证。 +这些连接 **目前还不能安全地** 在非受信网络或公共网络上运行。 + + + +### SSH 隧道 {#ssh-tunnels} + +Kubernetes 支持使用 SSH 隧道来保护从控制面到节点的通信路径。在这种配置下,apiserver +建立一个到集群中各节点的 SSH 隧道(连接到在 22 端口监听的 SSH 服务) +并通过这个隧道传输所有到 kubelet、节点、Pod 或服务的请求。 +这一隧道保证通信不会被暴露到集群节点所运行的网络之外。 + +SSH 隧道目前已被废弃。除非你了解个中细节,否则不应使用。 +Konnectivity 服务是对此通信通道的替代品。 + + + +### Konnectivity 服务 + +{{< feature-state for_k8s_version="v1.18" state="beta" >}} + +作为 SSH 隧道的替代方案,Konnectivity 服务提供 TCP 层的代理,以便支持从控制面到集群的通信。 +Konnectivity 服务包含两个部分:Konnectivity 服务器和 Konnectivity 代理,分别运行在 +控制面网络和节点网络中。Konnectivity 代理建立并维持到 Konnectivity 服务器的网络连接。 +启用 Konnectivity 服务之后,所有控制面到节点的通信都通过这些连接传输。 + +请浏览 [Konnectivity 服务任务](/docs/tasks/extend-kubernetes/setup-konnectivity/) +在你的集群中配置 Konnectivity 服务。 diff --git a/content/zh/docs/concepts/architecture/master-node-communication.md b/content/zh/docs/concepts/architecture/master-node-communication.md deleted file mode 100644 index d0357fb3cb..0000000000 --- a/content/zh/docs/concepts/architecture/master-node-communication.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -approvers: -- dchen1107 -- liggitt - -title: Master 节点通信 ---- - -{{< toc >}} - - -## 概览 - - -本文对 Master 节点(确切说是 apiserver)和 Kubernetes 集群之间的通信路径进行了分类。目的是为了让用户能够自定义他们的安装,对网络配置进行加固,使得集群能够在不可信的网络上(或者在一个云服务商完全公共的 IP 上)运行。 - - -## Cluster -> Master - - -所有从集群到 master 的通信路径都终止于 apiserver(其它 master 组件没有被设计为可暴露远程服务)。在一个典型的部署中,apiserver 被配置为在一个安全的 HTTPS 端口(443)上监听远程连接并启用一种或多种形式的客户端[身份认证](/docs/admin/authentication/)机制。一种或多种客户端[身份认证](/docs/admin/authentication/)机制应该被启用,特别是在允许使用 [匿名请求](/docs/admin/authentication/#anonymous-requests) 或 [service account tokens](/docs/admin/authentication/#service-account-tokens) 的时候。 - - -应该使用集群的公共根证书开通节点,如此它们就能够基于有效的客户端凭据安全的连接 apiserver。例如:在一个默认的 GCE 部署中,客户端凭据以客户端证书的形式提供给 kubelet。请查看 [kubelet TLS bootstrapping](/docs/admin/kubelet-tls-bootstrapping/) 获取如何自动提供 kubelet 客户端证书。 - - -想要连接到 apiserver 的 Pods 可以使用一个 service account 安全的进行连接。这种情况下,当 Pods 被实例化时 Kubernetes 将自动的把公共根证书和一个有效的不记名令牌注入到 pod 里。`kubernetes` service (所有 namespaces 中)都配置了一个虚拟 IP 地址,用于转发(通过 kube-proxy)请求到 apiserver 的 HTTPS endpoint。 - - -Master 组件通过非安全(没有加密或认证)端口和集群的 apiserver 通信。这个端口通常只在 master 节点的 localhost 接口暴露,这样,所有在相同机器上运行的 master 组件就能和集群的 apiserver 通信。一段时间以后,master 组件将变为使用带身份认证和权限验证的安全端口(查看[#13598](https://github.com/kubernetes/kubernetes/issues/13598))。 - - -这样的结果使得从集群(在节点上运行的 nodes 和 pods)到 master 的缺省连接操作模式默认被保护,能够在不可信或公网中运行。 - - -## Master -> Cluster - - -从 master(apiserver)到集群有两种主要的通信路径。第一种是从 apiserver 到集群中每个节点上运行的 kubelet 进程。第二种是从 apiserver 通过它的代理功能到任何 node、pod 或者 service。 - - -## apiserver -> kubelet - - -从 apiserver 到 kubelet 的连接用于获取 pods 日志、连接(通过 kubectl)运行中的 pods,以及使用 kubelet 的端口转发功能。这些连接终止于 kubelet 的 HTTPS endpoint。 - - -默认的,apiserver 不会验证 kubelet 的服务证书,这会导致连接遭到中间人攻击,因而在不可信或公共网络上是不安全的。 - - -为了对这个连接进行认证,请使用 `--kubelet-certificate-authority` 标记给 apiserver 提供一个根证书捆绑,用于 kubelet 的服务证书。 - - -如果这样不可能,又要求避免在不可信的或公共的网络上进行连接,请在 apiserver 和 kubelet 之间使用 [SSH 隧道](/docs/tasks/access-application-cluster/port-forward-access-application-cluster/)。 - - -最后,应该启用 [Kubelet 用户认证和/或权限认证](/docs/admin/kubelet-authentication-authorization/)来保护 kubelet API。 - - -## apiserver -> nodes, pods, and services - - -从 apiserver 到 node、pod 或者 service 的连接默认为纯 HTTP 方式,因此既没有认证,也没有加密。他们能够通过给 API URL 中的 node、pod 或 service 名称添加前缀 `https:` 来运行在安全的 HTTPS 连接上。但他们即不会认证 HTTPS endpoint 提供的证书,也不会提供客户端证书。这样虽然连接是加密的,但它不会提供任何完整性保证。这些连接**目前还不能安全的**在不可信的或公共的网络上运行。 - - -## SSH 隧道 - - -[Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine/docs/) 使用 SSH 隧道保护 Master -> Cluster 通信路径。在这种配置下,apiserver 发起一个到集群中每个节点的 SSH 隧道(连接到在 22 端口监听的 ssh 服务)并通过这个隧道传输所有到 kubelet、node、pod 或者 service 的流量。这个隧道保证流量不会在集群运行的私有 GCE 网络之外暴露。