有什么根域名和顶级域名区别中‎介平‎台比较好吗?

这是本节的多页打印视图。 .

集群中每一个 都会获得自己的、 独一无二的 IP 地址, 这就意味着你不需要显式地在 Pod 之间创建链接,你几乎不需要处理容器端口到主机端口之间的映射。 这将形成一个干净的、向后兼容的模型;在这个模型里,从端口分配、命名、服务发现、 、 应用配置和迁移的角度来看,Pod 可以被视作虚拟机或者物理主机。

Kubernetes 强制要求所有网络设施都满足以下基本要求(从而排除了有意隔离网络的策略):

  • Pod 能够与所有其他上的 Pod 通信, 且不需要网络地址转译(NAT)
  • 节点上的代理(比如:系统守护进程、kubelet)可以和节点上的所有 Pod 通信

说明:对于支持在主机网络中运行 Pod 的平台(比如:Linux), 当 Pod 挂接到节点的宿主网络上时,它们仍可以不通过 NAT 和所有节点上的 Pod 通信。

这个模型不仅不复杂,而且还和 Kubernetes 的实现从虚拟机向容器平滑迁移的初衷相符, 如果你的任务开始是在虚拟机中运行的,你的虚拟机有一个 IP, 可以和项目中其他虚拟机通信。这里的模型是基本相同的。

Kubernetes 的 IP 地址存在于 Pod 范围内 —— 容器共享它们的网络命名空间 —— 包括它们的 IP 地址和 MAC 地址。 这就意味着 Pod 内的容器都可以通过 localhost 到达对方端口。 这也意味着 Pod 内的容器需要相互协调端口的使用,但是这和虚拟机中的进程似乎没有什么不同, 这也被称为“一个 Pod 一个 IP”模型。

如何实现以上需求是所使用的特定容器运行时的细节。

也可以在 Node 本身请求端口,并用这类端口转发到你的 Pod(称之为主机端口), 但这是一个很特殊的操作。转发方式如何实现也是容器运行时的细节。 Pod 自己并不知道这些主机端口的存在。

  • 一个 Pod 中的容器之间。
  • 集群网络在不同 Pod 之间提供通信。
  • 以支持来自于集群外部的访问。
    • 提供专门用于暴露 HTTP 应用程序、网站和 API 的额外功能。

将运行在一组 上的应用程序公开为网络服务的抽象方法。

使用 Kubernetes,你无需修改应用程序即可使用不熟悉的服务发现机制。 Kubernetes 为 Pod 提供自己的 IP 地址,并为一组 Pod 提供相同的 DNS 名, 并且可以在它们之间进行负载均衡。

创建和销毁 Kubernetes 以匹配集群的期望状态。 Pod 是非永久性资源。 如果你使用 来运行你的应用程序,则它可以动态创建和销毁 Pod。

每个 Pod 都有自己的 IP 地址,但是在 Deployment 中,在同一时刻运行的 Pod 集合可能与稍后运行该应用程序的 Pod 集合不同。

这导致了一个问题: 如果一组 Pod(称为“后端”)为集群内的其他 Pod(称为“前端”)提供功能, 那么前端如何找出并跟踪要连接的 IP 地址,以便前端可以使用提供工作负载的后端部分?

Kubernetes Service 定义了这样一种抽象:逻辑上的一组 Pod,一种可以访问它们的策略 —— 通常称为微服务。 Service 所针对的 Pod 集合通常是通过来确定的。 要了解定义服务端点的其他方法,请参阅。

举个例子,考虑一个图片处理后端,它运行了 3 个副本。这些副本是可互换的 —— 前端不需要关心它们调用了哪个后端副本。 然而组成这一组后端程序的 Pod 实际上可能会发生变化, 前端客户端不应该也没必要知道,而且也不需要跟踪这一组后端的状态。

Service 定义的抽象能够解耦这种关联。

如果你想要在应用程序中使用 Kubernetes API 进行服务发现,则可以查询 的 Endpoints 资源,只要服务中的 Pod 集合发生更改,Endpoints 就会被更新。

对于非本机应用程序,Kubernetes 提供了在应用程序和后端 Pod 之间放置网络端口或负载均衡器的方法。

例如,假定有一组 Pod,它们对外暴露了 9376 端口,同时还被打上 app=MyApp 标签:

为什么不使用 DNS 轮询?

时不时会有人问到为什么 Kubernetes 依赖代理将入站流量转发到后端。那其他方法呢? 例如,是否可以配置具有多个 A 值(或 IPv6 为 AAAA)的 DNS 记录,并依靠轮询名称解析?

使用服务代理有以下几个原因:

  • DNS 实现的历史由来已久,它不遵守记录 TTL,并且在名称查找结果到期后对其进行缓存。
  • 有些应用程序仅执行一次 DNS 查找,并无限期地缓存结果。
  • 即使应用和库进行了适当的重新解析,DNS 记录上的 TTL 值低或为零也可能会给 DNS 带来高负载,从而使管理变得困难。

在本页下文中,你可以了解各种 kube-proxy 实现是如何工作的。 总的来说,你应该注意当运行 kube-proxy 时,内核级别的规则可能会被修改(例如,可能会创建 iptables 规则), 在某些情况下直到你重新引导才会清理这些内核级别的规则。 因此,运行 kube-proxy 只能由了解在计算机上使用低级别、特权网络代理服务后果的管理员来完成。 尽管 kube-proxy 可执行文件支持 cleanup 功能,但此功能不是官方特性,因此只能按原样使用。

请注意,kube-proxy 可以以不同的模式启动,具体取决于其配置。

  • kube-proxy 的 ConfigMap 参数不能在启动时被全部校验和验证。 例如,如果你的操作系统不允许你运行 iptables 命令,则标准内核 kube-proxy 实现将无法工作。 同样,如果你的操作系统不支持 netsh,它将无法在 Windows 用户空间模式下运行。

这种模式,kube-proxy 会监视 Kubernetes 控制平面对 Service 对象和 Endpoints 对象的添加和移除操作。 对每个 Service,它会在本地 Node 上打开一个端口(随机选择)。 任何连接到“代理端口”的请求,都会被代理到 Service 的后端 Pods 中的某个上面(如

最后,它配置 iptables 规则,捕获到达该 Service 的 clusterIP(是虚拟 IP) 和 Port 的请求,并重定向到代理端口,代理端口再代理请求到后端Pod。

默认情况下,用户空间模式下的 kube-proxy 通过轮转算法选择后端。

上面。 对于每个 Endpoints 对象,它也会配置 iptables 规则,这个规则会选择一个后端组合。

使用 iptables 处理流量具有较低的系统开销,因为流量由 Linux netfilter 处理, 而无需在用户空间和内核空间之间切换。 这种方法也可能更可靠。

如果 kube-proxy 在 iptables 模式下运行,并且所选的第一个 Pod 没有响应,则连接失败。 这与用户空间模式不同:在这种情况下,kube-proxy 将检测到与第一个 Pod 的连接已失败, 并会自动使用其他后端 Pod 重试。

你可以使用 Pod 验证后端 Pod 可以正常工作,以便 iptables 模式下的 kube-proxy 仅看到测试正常的后端。 这样做意味着你避免将流量通过 kube-proxy 发送到已知已失败的

特性状态: Kubernetes )。 无需创建任何类型代理。

说明: 你需要使用 kube-dns /internal-vip" 这类前缀。 没有前缀的名字是保留给最终用户的。

在混合环境中,有时有必要在同一(虚拟)网络地址块内路由来自服务的流量。

在水平分割 DNS 环境中,你需要两个服务才能将内部和外部流量都路由到你的端点(Endpoints)。

如要设置内部负载均衡器,请根据你所使用的云运营商,为服务添加以下注解之一。

说明: ExternalName 服务接受 IPv4 地址字符串,但作为包含数字的 DNS 名称,而不是 IP 地址。 类似于 IPv4 地址的外部名称不能由 CoreDNS 或 ingress-nginx 解析,因为外部名称旨在指定规范的 DNS 名称。 要对 IP 地址进行硬编码,请考虑使用。

当查找主机 my-。 访问 my-service 的方式与其他服务的方式相同,但主要区别在于重定向发生在 DNS 级别,而不是通过代理或转发。 如果以后你决定将数据库移到集群中,则可以启动其 Pod,添加适当的选择算符或端点以及更改服务的 type

对于使用主机名的协议,此差异可能会导致错误或意外响应。 HTTP 请求将具有源服务器无法识别的 Host: 标头; TLS 服务器将无法提供与客户端连接的主机名匹配的证书。

Kubernetes 管理,它属于集群管理员的职责范畴。

  • 路径列表 paths(例如,/testpath),每个路径都有一个由 serviceNameservicePort 定义的关联后端。 在负载均衡器将流量定向到引用的服务之前,主机和路径都必须匹配传入请求的内容。
  • )请求将发送到列出的 backend

通常在 Ingress 控制器中会配置 defaultBackend(默认后端),以服务于无法与规约中 path 匹配的所有请求。

没有设置规则的 Ingress 将所有流量发送到同一个默认后端,而 .

创建了如上的 Ingress 之后,你可以使用下面的命令查看它:

Ingress 中的每个路径都需要有对应的路径类型(Path Type)。未明确设置 pathType 的路径无法通过合法性检查。当前支持的路径类型有三种:

  • Exact:精确匹配 URL 路径,且区分大小写。

  • Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个完成。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。 如果每个 p 都是请求路径 p 的元素前缀,则请求与路径 p 匹配。

    说明: 如果路径的最后一个元素是请求路径中最后一个元素的子字符串,则不会匹配 (例如:/foo/bar 匹配 /foo/bar/baz, 但不匹配 /foo/barbaz)。

在某些情况下,Ingress 中的多条路径会匹配同一个请求。 这种情况下最长的匹配路径优先。 如果仍然有两条同等的匹配路径,则精确路径类型优先于前缀路径类型。

主机名可以是精确匹配(例如“”)或者使用通配符来匹配 (例如“*.

不匹配,通配符仅覆盖了一个 DNS 标签
不匹配,通配符仅覆盖了一个 DNS 标签

# 这项定义告诉 Kubernetes 去寻找一个集群作用域的参数资源。

如果你创建的 Ingress 资源没有在 rules 中定义的任何 hosts,则可以匹配指向 Ingress 控制器 IP 地址的任何网络流量,而无需基于名称的虚拟主机。

你可以通过设定包含 TLS 私钥和证书的 来保护 Ingress。 Ingress 只支持单个 TLS 端口 443,并假定 TLS 连接终止于 Ingress 节点(与 Service 及其 Pod 之间的流量都以明文传输)。 如果 Ingress 中的 TLS 配置部分指定了不同的主机,那么它们将根据通过 SNI TLS 扩展指定的主机名(如果 Ingress 控制器支持 SNI)在同一端口上进行复用。 TLS Secret 的数据中必须包含用于 TLS 的以键名 的公用名称(CN)的证书。 这里的公共名称也被称为全限定域名(FQDN)。

注意,默认规则上无法使用 TLS,因为需要为所有可能的子域名发放证书。 因此,tls 字段中的 hosts 的取值需要与 rules 字段中的 host 完全匹配。

说明: 各种 Ingress 控制器所支持的 TLS 功能之间存在差异。请参阅有关 、 或者任何其他平台特定的 Ingress 控制器的文档,以了解 TLS 如何在你的环境中工作。

Ingress 控制器启动引导时使用一些适用于所有 Ingress 的负载均衡策略设置,例如负载均衡算法、后端权重方案等。 更高级的负载均衡概念(例如持久会话、动态权重)尚未通过 Ingress 公开。 你可以通过用于服务的负载均衡器来获取这些功能。

值得注意的是,尽管健康检查不是通过 Ingress 直接暴露的,在 Kubernetes 中存在并行的概念,比如 , 允许你实现相同的目的。 请检查特定控制器的说明文档(、 )以了解它们是怎样处理健康检查的。

要更新现有的 Ingress 以添加新的 Host,可以通过编辑资源来对其进行更新:

保存更改后,kubectl 将更新 API 服务器中的资源,该资源将告诉 Ingress 控制器重新配置负载均衡器。

Endpoints API 提供了在 Kubernetes 中跟踪网络端点的一种简单而直接的方法。遗憾的是,随着 Kubernetes 集群和逐渐开始为更多的后端 Pod 处理和发送请求, 原来的 API 的局限性变得越来越明显。最重要的是那些因为要处理大量网络端点而带来的挑战。

由于任一 Service 的所有网络端点都保存在同一个 Endpoints 资源中, 这类资源可能变得非常巨大,而这一变化会影响到 Kubernetes 组件(比如主控组件)的性能,并在 Endpoints 变化时产生大量的网络流量和额外的处理。 EndpointSlice 能够帮助你缓解这一问题, 还能为一些诸如拓扑路由这类的额外功能提供一个可扩展的平台。

选择算符匹配的所有 Pod 的引用。 EndpointSlice 通过唯一的协议、端口号和 Service 名称将网络端点组织在一起。 EndpointSlice 的名称必须是合法的 。

标志设置此值,最大值为 1000。

当涉及如何路由内部流量时,EndpointSlice 可以充当 的决策依据。 启用该功能后,在服务的端点数量庞大时会有可观的性能提升。

serving 状况与 ready 状况相同,不同之处在于它不考虑终止状态。 如果 EndpointSlice API 的使用者关心 Pod 终止时的就绪情况,就应检查此状况。

尽管 servingready 几乎相同,但是它是为防止破坏 ready 的现有含义而增加的。 如果对于处于终止中的端点,ready 可能是 true,那么对于现有的客户端来说可能是有些意外的, 因为从始至终,Endpoints 或 EndpointSlice API 从未包含处于终止中的端点。 出于这个原因,ready 对于处于终止中的端点 总是 false, 并且在 v1.20 中添加了新的状况 serving,以便客户端可以独立于 ready 的现有语义来跟踪处于终止中的

Terminating 是表示端点是否处于终止中的状况。 对于 Pod 来说,这是设置了删除时间戳的 Pod。

EndpointSlice 中的每个端点都可以包含一定的拓扑信息。 拓扑信息包括端点的位置,对应节点、可用区的信息。 这些信息体现为 EndpointSlices 的如下端点字段:

  • zone - 端点所处的可用区。

EndpointSlice 对象的 endpoint 字段设置任意的拓扑结构信息这一操作已被废弃, 不再被 v1 API 所支持。取而代之的是 v1 API 所支持的 nodeNamezone 这些独立的字段。这些字段可以在不同的 API 版本之间自动完成转译。

通常,控制面(尤其是端点切片的) 会创建和管理 EndpointSlice 对象。EndpointSlice 对象还有一些其他使用场景, 例如作为服务网格(Service Mesh)的实现。 这些场景都会导致有其他实体或者控制器负责管理额外的 EndpointSlice 集合。

在大多数场合下,EndpointSlice 都由某个 Service 所有, (因为)该端点切片正是为该服务跟踪记录其端点。这一属主关系是通过为每个 EndpointSlice 设置一个属主(owner)引用,同时设置 kubernetes.io/service-name 标签来标明的, 目的是方便查找隶属于某 Service 的所有

控制面对 Endpoints 资源进行映射的例外情况有:

  • 对应的 Service 的选择算符不为空。

每个 EndpointSlice 都有一组端口值,适用于资源内的所有端点。 当为 Service 使用命名端口时,Pod 可能会就同一命名端口获得不同的端口号, 因而需要不同的 EndpointSlice。这有点像 Endpoints 用来对子网进行分组的逻辑。

控制面尝试尽量将 EndpointSlice 填满,不过不会主动地在若干 EndpointSlice 之间执行再平衡操作。这里的逻辑也是相对直接的:

  1. 列举所有现有的 EndpointSlices,移除那些不再需要的端点并更新那些已经变化的端点。
  2. 列举所有在第一步中被更改过的 EndpointSlices,用新增加的端点将其填满。
  3. 如果还有新的端点未被添加进去,尝试将这些端点添加到之前未更改的切片中, 或者创建新切片。

这里比较重要的是,与在 EndpointSlice 之间完成最佳的分布相比,第三步中更看重限制 EndpointSlice 更新的操作次数。例如,如果有 10 个端点待添加,有两个 EndpointSlice 中各有 5 个空位,上述方法会创建一个新的 EndpointSlice 而不是将现有的两个 EndpointSlice 都填满。换言之,与执行多个

由于 kube-proxy 在每个节点上运行并监视 EndpointSlice 状态,EndpointSlice 的每次变更都变得相对代价较高,因为这些状态变化要传递到集群中每个节点上。 这一方法尝试限制要发送到所有节点上的变更消息个数,即使这样做可能会导致有多个 EndpointSlice 没有被填满。

在实践中,上面这种并非最理想的分布是很少出现的。大多数被 EndpointSlice 控制器处理的变更都是足够小的,可以添加到某已有 EndpointSlice 中去的。 并且,假使无法添加到已有的切片中,不管怎样都会快就会需要一个新的 EndpointSlice 对象。Deployment 的滚动更新为重新为 EndpointSlice 打包提供了一个自然的机会,所有 Pod 及其对应的端点在这一期间都会被替换掉。

由于 EndpointSlice 变化的自身特点,端点可能会同时出现在不止一个 EndpointSlice 中。鉴于不同的 EndpointSlice 对象在不同时刻到达 Kubernetes 的监视/缓存中, 这种情况的出现是很自然的。 使用 EndpointSlice 的实现必须能够处理端点出现在多个切片中的状况。

如果你希望在 IP 地址或端口层面(OSI 第 3 层或第 4 层)控制网络流量, 则你可以考虑为集群中特定应用使用 Kubernetes 网络策略(NetworkPolicy)。 NetworkPolicy 是一种以应用为中心的结构,允许你设置如何允许 与网络上的各类网络“实体” (我们这里使用实体以避免过度使用诸如“端点”和“服务”这类常用术语, 这些术语在 Kubernetes 中有特定含义)通信。 NetworkPolicies 适用于一端或两端与 Pod 的连接,与其他连接无关。

Pod 可以通信的 Pod 是通过如下三个标识符的组合来辩识的:

  1. 其他被允许的 Pods(例外:Pod 无法阻塞对自身的访问)
  2. IP 组块(例外:与 Pod 运行所在的节点的通信总是被允许的, 无论 Pod 或节点的 IP 地址)

在定义基于 Pod 或名字空间的 NetworkPolicy 时, 你会使用来设定哪些流量可以进入或离开与该算符匹配的 Pod。 另外,当创建基于 IP 的 NetworkPolicy 时,我们基于 IP 组块(CIDR 范围)来定义策略。

网络策略通过来实现。 要使用网络策略,你必须使用支持 NetworkPolicy 的网络解决方案。 创建一个 NetworkPolicy 资源对象而没有控制器来使它生效的话,是没有任何作用的。

Pod 隔离的两种类型

Pod 有两种隔离: 出口的隔离和入口的隔离。它们涉及到可以建立哪些连接。 这里的“隔离”不是绝对的,而是意味着“有一些限制”。 另外的,“非隔离方向”意味着在所述方向上没有限制。这两种隔离(或不隔离)是独立声明的, 并且都与从一个 Pod 到另一个 Pod 的连接有关。

默认情况下,一个 Pod 的出口是非隔离的,即所有外向连接都是被允许的。如果有任何的 NetworkPolicy 选择该 Pod 并在其 policyTypes 中包含 “Egress”,则该 Pod 是出口隔离的, 我们称这样的策略适用于该 Pod 的出口。当一个 Pod 的出口被隔离时, 唯一允许的来自 Pod 的连接是适用于出口的 Pod 的某个

默认情况下,一个 Pod 对入口是非隔离的,即所有入站连接都是被允许的。如果有任何的 NetworkPolicy 选择该 Pod 并在其 policyTypes 中包含 “Ingress”,则该 Pod 被隔离入口, 我们称这种策略适用于该 Pod 的入口。当一个 Pod 的入口被隔离时,唯一允许进入该 Pod 的连接是来自该 Pod

网络策略是相加的,所以不会产生冲突。如果策略适用于 Pod 某一特定方向的流量, Pod 在对应方向所允许的连接是适用的网络策略所允许的集合。 因此,评估的顺序不影响策略的结果。

要允许从源 Pod 到目的 Pod 的连接,源 Pod 的出口策略和目的 Pod 的入口策略都需要允许连接。 如果任何一方不允许连接,建立连接将会失败。

参阅 来了解资源的完整定义。

说明: 除非选择支持网络策略的网络解决方案,否则将上述示例发送到API服务器没有任何效果。

中包含了在一个名字空间中定义特定网络策略所需的所有信息。

ingress:每个 NetworkPolicy 可包含一个 ingress 规则的白名单列表。 每个规则都允许同时匹配 fromports 部分的流量。示例策略中包含一条简单的规则: 它匹配某个特定端口,来自三个来源中的一个,第一个通过

egress:每个 NetworkPolicy 可包含一个 egress 规则的白名单列表。 每个规则都允许匹配 toport 部分的流量。该示例策略包含一条规则, 该规则将指定端口上的流量匹配到 10.0.0.0/24 中的任何目的地。

所以,该网络策略示例:

参阅演练了解更多示例。

podSelector:此选择器将在与 NetworkPolicy 相同的名字空间中选择特定的 Pod,应将其允许作为入站流量来源或出站流量目的地。

namespaceSelector:此选择器将选择特定的名字空间,应将所有 Pod 用作其入站流量来源或出站流量目的地。

from 数组中包含两个元素,允许来自本地名字空间中标有 role=client 的 Pod 的连接, 来自任何名字空间中标有 user=alice 的任何 Pod 的连接。

ipBlock:此选择器将选择特定的 IP CIDR 范围以用作入站流量来源或出站流量目的地。 这些应该是集群外部 IP,因为 Pod IP 存在时间短暂的且随机产生。

集群的入站和出站机制通常需要重写数据包的源 IP 或目标 IP。 在发生这种情况时,不确定在 NetworkPolicy 处理之前还是之后发生, 并且对于网络插件、云提供商、Service 实现等的不同组合,其行为可能会有所不同。

对入站流量而言,这意味着在某些情况下,你可以根据实际的原始源 IP 过滤传入的数据包, 而在其他情况下,NetworkPolicy 所作用的 源IP 则可能是 LoadBalancer 或 Pod 的节点等。

对于出站流量而言,这意味着从 Pod 到被重写为集群外部 IP 的 Service IP 的连接可能会或可能不会受到基于 ipBlock 的策略的约束。

默认情况下,如果名字空间中不存在任何策略,则所有进出该名字空间中 Pod 的流量都被允许。 以下示例使你可以更改该名字空间中的默认行为。

你可以通过创建选择所有容器但不允许任何进入这些容器的入站流量的 NetworkPolicy 来为名字空间创建 “default” 隔离策略。

这确保即使没有被任何其他 NetworkPolicy 选择的 Pod 仍将被隔离以进行入口。 此策略不影响任何 Pod 的出口隔离。

如果你想允许一个命名空间中所有 Pod 的所有入站连接,你可以创建一个明确允许的策略。

有了这个策略,任何额外的策略都不会导致到这些 Pod 的任何入站连接被拒绝。 此策略对任何 Pod 的出口隔离没有影响。

你可以通过创建选择所有容器但不允许来自这些容器的任何出站流量的 NetworkPolicy 来为名字空间创建 “default” 隔离策略。

此策略可以确保即使没有被其他任何 NetworkPolicy 选择的 Pod 也不会被允许流出流量。 此策略不会更改任何 Pod 的入站流量隔离行为。

如果要允许来自命名空间中所有 Pod 的所有连接, 则可以创建一个明确允许来自该命名空间中 Pod 的所有出站连接的策略。

有了这个策略,任何额外的策略都不会导致来自这些 Pod 的任何出站连接被拒绝。 此策略对进入任何 Pod 的隔离没有影响。

默认拒绝所有入站和所有出站流量

你可以为名字空间创建“默认”策略,以通过在该名字空间中创建以下 NetworkPolicy 来阻止所有入站和出站流量。

此策略可以确保即使没有被其他任何 NetworkPolicy 选择的 Pod 也不会被允许入站或出站流量。

你必须使用支持 SCTP 协议网络策略的 插件。

在编写 NetworkPolicy 时,你可以针对一个端口范围而不是某个固定端口。

这一目的可以通过使用 endPort 字段来实现,如下例所示:

使用此字段时存在以下限制:

  • endPort 字段必须等于或者大于 port 字段的值。
  • 两个字段的设置值都只能是数字。

基于名字指向某名字空间

如果 NetworkPolicy 无法在某些对象字段中指向某名字空间, 你可以使用标准的标签方式来指向特定名字空间。

通过网络策略(至少目前还)无法完成的工作

API 还无法实现下面的用户场景是很值得的。

  • 强制集群内部流量经过某公用网关(这种场景最好通过服务网格或其他代理来实现);
  • 与 TLS 相关的场景(考虑使用服务网格或者 Ingress 控制器);
  • 特定于节点的策略(你可以使用 CIDR 来表达这一需求不过你无法使用节点在 Kubernetes 中的其他标识信息来辩识目标节点);
  • 基于名字来选择服务(不过,你可以使用 来选择目标 Pod 或名字空间,这也通常是一种可靠的替代方案);
  • 创建或管理由第三方来实际完成的“策略请求”;
  • 实现适用于所有名字空间或 Pods 的默认策略(某些第三方 Kubernetes 发行版本或项目可以做到这点);
  • 高级的策略查询或者可达性相关工具;
  • 生成网络安全事件日志的能力(例如,被阻塞或接收的连接请求);
  • 显式地拒绝策略的能力(目前,NetworkPolicy 的模型默认采用拒绝操作, 其唯一的能力是添加允许策略);
  • 禁止本地回路或指向宿主的网络流量(Pod 目前无法阻塞 localhost 访问, 它们也无法禁止来自所在节点的访问请求)。

  • 参阅演练了解更多示例;
  • 有关 NetworkPolicy 资源所支持的常见场景的更多信息, 请参见。

你的工作负载可以使用 DNS 发现集群内的 Service,本页说明具体工作原理。

集群中定义的每个 Service (包括 DNS 服务器自身)都被赋予一个 DNS 名称。 默认情况下,客户端 Pod 的 DNS 搜索列表会包含 Pod 自身的名字空间和集群的默认域。

DNS 查询可能因为执行查询的 Pod 所在的名字空间而返回不同的结果。 不指定名字空间的 DNS 查询会被限制在 Pod 所在的名字空间内。 要访问其他名字空间中的 Service,需要在 DNS 查询中指定名字空间。

例如,假定名字空间 test 中存在一个 Pod,prod 名字空间中存在一个服务 data

Pod 查询 data 时没有返回结果,因为使用的是 Pod 的名字空间 test

Pod 查询 data.prod 时则会返回预期的结果,因为查询中指定了名字空间。

DNS 查询,可参阅 。

哪些对象会获得 DNS 记录呢?

以下各节详细介绍已支持的 DNS 记录类型和布局。 其它布局、名称或者查询即使碰巧可以工作,也应视为实现细节, 将来很可能被更改而且不会因此发出警告。 有关最新规范请查看 。

Pod IP 的集合。 客户端要能够使用这组 IP,或者使用标准的轮转策略从这组 IP 中进行选择。

一般而言,Pod 会对应如下 DNS 名字解析:

通过 Service 暴露出来的所有 Pod 都会有如下 DNS 解析名称可用:

Pod 规约中包含一个可选的 hostname 字段,可以用来指定 Pod 的主机名。 当这个字段被设置时,它将优先于 Pod 的名字成为该 Pod 的主机名。 举个例子,给定一个 hostname 设置为 "my-host" 的 Pod, 该 Pod 的主机名将被设置为

如果某无头 Service 与某 Pod 在同一个名字空间中,且它们具有相同的子域名, 集群的 DNS 服务器也会为该 Pod 的全限定主机名返回 A 记录或 AAAA 记录。 例如,在同一个名字空间中,给定一个主机名为 “busybox-1”、 子域名设置为 “default-subdomain” 的 Pod,和一个名称为

字符,请求字符数为 70)。 对于这种场景而言,改善用户体验的一种方式是创建一个 , 在用户创建顶层对象(如

  • "Default": Pod 从运行所在的节点继承名称解析配置。参考 获取更多信息。
  • "ClusterFirst": 与配置的集群域后缀不匹配的任何 DNS 查询(例如 "www.kubernetes.io") 都将转发到从节点继承的上游名称服务器。集群管理员可能配置了额外的存根域和上游 DNS 服务器。 参阅 了解在这些场景中如何处理 DNS 查询的信息。
    • 注意:这在 Windows 上不支持。 有关详细信息,请参见。

用户可以在 dnsConfig 字段中指定以下属性:

  • nameservers:将用作于 Pod 的 DNS 服务器的 IP 地址列表。 最多可以指定 3 个 IP 地址。当 Pod 的 dnsPolicy 设置为 "None" 时, 列表必须至少包含一个 IP 地址,否则此属性是可选的。 所列出的服务器将合并到从指定的 DNS 策略生成的基本名称服务器,并删除重复的地址。

  • searches:用于在 Pod 中查找主机名的 DNS 搜索域的列表。此属性是可选的。 指定此属性时,所提供的列表将合并到根据所选 DNS 策略生成的基本搜索域名中。 重复的域名将被删除。Kubernetes 最多允许 6 个搜索域。

  • options:可选的对象列表,其中每个对象可能具有 name 属性(必需)和 value 属性(可选)。 此属性中的内容将合并到从指定的 DNS 策略生成的选项。 重复的条目将被删除。

以下是具有自定义 DNS 设置的 Pod 示例:

对于 IPv6 设置,搜索路径和名称服务器应按以下方式设置:

  • 在 Windows 上,可以使用的 DNS 解析器有很多。 由于这些解析器彼此之间会有轻微的行为差别,建议使用 powershell cmdlet

有关管理 DNS 配置的指导,请查看

Kubernetes 允许你配置单协议栈 IPv4 网络、单协议栈 IPv6 网络或同时激活这两种网络的双协议栈网络。本页说明具体配置方法。

  • 提供商支持双协议栈网络(云提供商或其他提供商必须能够为 Kubernetes 节点提供可路由的 IPv4/IPv6 网络接口)

如果配置 IPv4/IPv6 双栈,请分配双栈集群网络:

当你定义服务时,可以选择将其配置为双栈。若要指定所需的行为,你可以设置 .spec.ipFamilyPolicy 字段为以下值之一:

  • SingleStack:单栈服务。控制面使用第一个配置的服务集群 IP 范围为服务分配集群 IP。

如果你想要定义哪个 IP 族用于单栈或定义双栈 IP 族的顺序,可以通过设置 服务上的可选字段 .spec.ipFamilies 来选择地址族。

你所列出的第一个地址族用于原来的 .spec.ClusterIP 字段。

以下示例演示多种双栈服务配置场景下的行为。

    • 对于 .spec.ClusterIP 字段,控制面记录来自第一个服务集群 IP 范围 对应的地址族的 IP 地址。

下面示例演示了在服务已经存在的集群上新启用双栈时的默认行为。 (将现有集群升级到 1.21 或者更高版本会启用双协议栈支持。)

  1. 你可以通过使用 kubectl 检查现有服务来验证此行为。

  1. 你可以通过使用 kubectl 检查带有选择算符的现有无头服务来验证此行为。

在单栈和双栈之间切换服务

服务可以从单栈更改为双栈,也可以从双栈更改为单栈。

要为你的服务提供双栈负载均衡器:

为了使用双栈的负载均衡器类型服务,你的云驱动必须支持 IPv4 和 IPv6 的负载均衡器。

如果你要启用出站流量,以便使用非公开路由 IPv6 地址的 Pod 到达集群外地址 (例如公网),则需要通过透明代理或 IP 伪装等机制使 Pod 使用公共路由的 IPv6 地址。 项目 支持在双栈集群上进行 IP 伪装。

关于 Windows 的不同网络模式,你可以进一步阅读 。

**拓扑感知提示(Topology Aware Hints)**提供了一种机制来帮助将网络流量保持在其请求方所在的区域内。 在集群中的 Pod 之间优先选用相同区域的流量有助于提高可靠性、增强性能(网络延迟和吞吐量)或降低成本。

拓扑感知提示包含客户怎么使用服务端点的建议,从而实现了拓扑感知的路由功能。 这种方法添加了元数据,以启用 EndpointSlice 和/或 Endpoints 对象的调用者, 这样,访问这些网络端点的请求流量就可以在它的发起点附近就近路由。

例如,你可以在一个地域内路由流量,以降低通信成本,或提高网络性能。

Kubernetes 集群越来越多的部署到多区域环境中。 拓扑感知提示提供了一种把流量限制在它的发起区域之内的机制。 这个概念一般被称之为 “拓扑感知路由”。 在计算 的端点时, EndpointSlice 控制器会评估每一个端点的拓扑(地域和区域),填充提示字段,并将其分配到某个区域。 集群组件,例如 就可以使用这些提示信息,并用他们来影响流量的路由(倾向于拓扑上相邻的端点)。

此特性启用的功能分为两个组件:EndpointSlice 控制器和 kube-proxy。 本节概述每个组件如何实现此特性。

此特性开启后,EndpointSlice 控制器负责在 EndpointSlice 上设置提示信息。 控制器按比例给每个区域分配一定比例数量的端点。 这个比例来源于此区域中运行节点的 CPU 核心数。 例如,如果一个区域拥有 2 CPU 核心,而另一个区域只有 1 CPU 核心, 那控制器将给那个有 2 CPU 的区域分配两倍数量的端点。

以下示例展示了提供提示信息后 EndpointSlice 的样子:

kube-proxy 组件依据 EndpointSlice 控制器设置的提示,过滤由它负责路由的端点。 在大多数场合,这意味着 kube-proxy 可以把流量路由到同一个区域的端点。 有时,控制器从某个不同的区域分配端点,以确保在多个区域之间更平均的分配端点。 这会导致部分流量被路由到其他区域。

Kubernetes 控制平面和每个节点上的 kube-proxy,在使用拓扑感知提示功能前,会应用一些保护措施规则。 如果没有检出,kube-proxy 将无视区域限制,从集群中的任意节点上选择端点。

  1. 端点数量不足: 如果一个集群中,端点数量少于区域数量,控制器不创建任何提示。
  1. 不可能实现均衡分配: 在一些场合中,不可能实现端点在区域中的平衡分配。 例如,假设 zone-a 比 zone-b 大两倍,但只有 2 个端点, 那分配到 zone-a 的端点可能收到比 zone-b 多两倍的流量。 如果控制器不能确定此“期望的过载”值低于每一个区域可接受的阈值,控制器将不指派提示信息。 重要的是,这不是基于实时反馈。所以对于单独的端点仍有可能超载。
  1. 一个或多个节点信息不足: 如果任一节点没有设置标签 topology.kubernetes.io/zone, 或没有上报可分配的 CPU 数据,控制平面将不会设置任何拓扑感知提示, 继而 kube-proxy 也就不能通过区域过滤端点。
  1. 一个或多个端点没有设置区域提示: 当这类事情发生时, kube-proxy 会假设这是正在执行一个从/到拓扑感知提示的转移。 在这种场合下过滤Service 的端点是有风险的,所以 kube-proxy 回撤为使用所有的端点。
  1. 不在提示中的区域: 如果 kube-proxy 不能根据一个指示在它所在的区域中发现一个端点, 它回撤为使用所有节点的端点。当你的集群新增一个新的区域时,这种情况发生概率很高。

  • 这种方法不适用于大部分流量来自于一部分区域的服务。 相反的,这里假设入站流量将根据每个区域中节点的服务能力按比例的分配。
  • EndpointSlice 控制器在计算每一个区域的容量比例时,会忽略未就绪的节点。 在大量节点未就绪的场景下,这样做会带来非预期的结果。
  • EndpointSlice 控制器在计算每一个区域的部署比例时,并不会考虑 。 如果服务后台的 Pod 被限制只能运行在集群节点的一个子集上,这些信息并不会被使用。
  • 这种方法和自动扩展机制之间不能很好的协同工作。例如,如果大量流量来源于一个区域, 那只有分配到该区域的端点才可用来处理流量。这会导致 要么不能拾取此事件,要么新增 Pod 被启动到其他区域。

Kubernetes 支持运行 Linux 或 Windows 节点。 你可以在统一集群内混布这两种节点。 本页提供了特定于 Windows 操作系统的网络概述。

Windows 容器网络通过 暴露。 Windows 容器网络的工作方式与虚拟机类似。 每个容器都有一个连接到 Hyper-V 虚拟交换机(vSwitch)的虚拟网络适配器(vNIC)。

  • 虚拟网络(包括创建 vSwitch)
  • 包括数据包封装、负载均衡规则、ACL 和 NAT 规则在内的策略。

Windows HNS 和 vSwitch 实现命名空间划分,且可以按需为 Pod 或容器创建虚拟 NIC。 然而,诸如 DNS、路由和指标等许多配置将存放在 Windows 注册表数据库中, 而不是像 Linux 将这些配置作为文件存放在 /etc 内。 针对容器的 Windows 注册表与主机的注册表是分开的,因此将 /etc/resolv.conf 从主机映射到一个容器的类似概念与 Linux 上的效果不同。 这些必须使用容器环境中运行的 Windows API 进行配置。 因此,实现 CNI 时需要调用 HNS,而不是依赖文件映射将网络详情传递到 Pod 或容器中。

容器挂接到一个外部 vSwitch。容器挂接到下层网络,但物理网络不需要了解容器的 MAC,因为这些 MAC 在入站/出站时被重写。 win-bridge 使用 L2bridge 网络模式,将容器连接到主机的下层,提供最佳性能。节点间连接需要用户定义的路由(UDR)。
这是 L2bridge 的一种特例,但仅用在 Azure 上。所有数据包都会被发送到应用了 SDN 策略的虚拟化主机。 MAC 被重写,IP 在下层网络上可见。 Azure-CNI 允许将容器集成到 Azure vNET,允许容器充分利用 所提供的能力集合。例如,安全地连接到 Azure 服务或使用 Azure NSG。参考 。
容器被赋予一个 vNIC,连接到外部 vSwitch。每个上层网络都有自己的 IP 子网,由自定义 IP 前缀进行定义。该上层网络驱动使用 VXLAN 封装。 当需要将虚拟容器网络与主机的下层隔离时(例如出于安全原因),应使用 win-overlay。如果你的数据中心的 IP 个数有限,可以将 IP 在不同的上层网络中重用(带有不同的 VNID 标记)。在 Windows Server 2019 上这个选项需要 。
需要一个外部 vSwitch。容器挂接到一个外部 vSwitch,由后者通过逻辑网络(逻辑交换机和路由器)实现 Pod 内通信。 数据包通过 或 隧道进行封装,以到达其它主机上的 Pod。
数据包基于 OVN 网络控制器提供的隧道元数据信息被转发或丢弃。
南北向通信使用 NAT。
容器被赋予一个 vNIC,连接到内部 vSwitch。DNS/DHCP 是使用一个名为 实现的

插件之一,并将包含节点分配子网的正确配置发送给 IPAM 插件(例如:host-local)。

  • (未设置 IPAM 时的回滚选项)

Kubernetes 是一种抽象:定义了逻辑上的一组 Pod 和一种通过网络访问这些 Pod 的方式。 在包含 Windows 节点的集群中,你可以使用以下类别的 Service:

Windows 容器网络与 Linux 网络有着很重要的差异。 更多细节和背景信息,参考 。

在 Windows 上,你可以使用以下设置来配置 Service 和负载均衡行为:

支持的 Windows 操作系统最低版本
确保每次都将来自特定客户端的连接传递到同一个 Pod。
在负载均衡模式中 IP 地址修正和 LBNAT 直接发生在容器 vSwitch 端口;服务流量到达时源 IP 设置为原始 Pod IP。
跳过服务流量的 DNAT,从而在到达后端 Pod 的数据包中保留目标服务的虚拟 IP。也会禁用节点间的转发。
进出集群和集群内通信都支持原生的 IPv4 间与 IPv6 间流量
确保入站流量的源 IP 得到保留。也会禁用节点间转发。

这些问题需要操作系统修复。 有关更新,请参考 。

Windows 节点不支持以下网络功能:

  • 从节点本身访问本地 NodePort(可以从其他节点或外部客户端进行访问)
  • 为同一 Service 提供 64 个以上后端 Pod(或不同目的地址)
    • 指向同一网络内目的地址的 ICMP 数据包(例如 Pod 间的 ping 通信)可正常工作;
    • TCP/UDP 数据包可正常工作;
    • 通过远程网络指向其它地址的 ICMP 数据包(例如通过 ping 从 Pod 到外部公网的通信)无法被转换, 因此无法被路由回到这些数据包的源点;
    • Flannel 仅限于使用 VNI 4096 和 UDP 端口 4789。 有关这些参数的更多详细信息,请参考官方的 后端文档。

如果集群中的两个 Pod 想要通信,并且两个 Pod 实际上都在同一节点运行, 服务内部流量策略 可以将网络流量限制在该节点内。 通过集群网络避免流量往返有助于提高可靠性、增强性能(网络延迟和吞吐量)或降低成本。

服务内部流量策略开启了内部流量限制,将内部流量只路由到发起方所处节点内的服务端点。 这里的”内部“流量指当前集群中的 Pod 所发起的流量。 这种机制有助于节省开销,提升效率。

.spec.internalTrafficPolicy 项设置为 Local, 来为它指定一个内部专用的流量策略。 此设置就相当于告诉 kube-proxy 对于集群内部流量只能使用本地的服务端口。

说明: 如果某节点上的 Pod 均不提供指定 Service 的服务端点, 即使该 Service 在其他节点上有可用的服务端点, Service 的行为看起来也像是它只有 0 个服务端点(只针对此节点上的 Pod)。

  • 在一个 Service 上,当 externalTrafficPolicy 已设置为 Local时,服务内部流量策略无法使用。 换句话说,在一个集群的不同 Service 上可以同时使用这两个特性,但在一个 Service 上不行。

}

最近看了一篇博文是说微信公众平台搭建,于是心血来潮自己也尝试了一下。

php代码如下,本人不是搞PHP的,因此只能在网上拷贝了,如有复制,纯属巧合。

}

跨境电商平台听得最多的就是亚马逊、速卖通、阿里巴巴 国际站、eBay等主流平台。

亚马逊是全球最大的跨境电商平台,行业老大,流量大、平台成熟,但竞争激烈;速卖通主要面向中欧市场,阿里旗下产品,运营方式和国内电商相似,但价格内卷严重。阿里巴巴 国际站,知名B2B平台,国内外贸人聚集地,订单利润相对低;eBay主要是北美市场,操作简单,投入小,出单周期相对长。

首先考虑平台的5个要素。

平台调性指平台的用户人群特征、体量;平台费用指的是入驻费用,月租费、佣金甚至引流费用;平台门槛则指入驻条件和限制;热销品类指平台的核心类目;学习成本则指的是平台的操作运营的难易程度。

Ueeshop自建站平台建议新手们做好平台前期调研,评估平台的发展潜力。

点击小卡片咨询建站和海外营销详情,一站式建站、免费试用、无佣金哦~

其次自检自身资源、能力与目标。

资源指品类资源,能力指学习和资金能力,目标指方向目标。

每个平台各有其特点和玩法,了解平台的入驻资质、佣金、物流、营销玩法之后结合自身的实际情况来匹配和平台。

供应链是跨境电商重要的一环,有品类资源的卖家选择对应核心类目的平台;能力大于资源,有资金和学习能力的卖家选择大平台,消费力强。个人卖家想要创业,选择入门门槛低,启动资金低的平台......

其实现在主流跨境电商平台偏向饱和,更趋向于合规化、精品化。此前,VAT风暴、review整顿、亚马逊账号封杀、平台合规整治等出现在跨境圈子的“幺蛾子”让新老跨境人为之战栗。

点击小卡片咨询建站和海外营销详情,一站式建站、免费试用、无佣金哦~

平台规则多、受限制于他人,且产品同质化严重,自然螺旋流量消失,再加上不同攀升的运价,绝大部分中小企业陷入价格战中,利润严重缩水,生存空间小。

独立站拥有自主权,直接连接消费者和卖家,不受制于任何平台,卖家自己掌握制定规则,灵活性强,最主要的是可以塑造品牌,建立品牌壁垒和产生品牌溢价,摆脱价格战深渊,有利于稳定长期的发展。

同时,SaaS建站平台服务商能帮助新手轻松搭建属于自己的独立站,只需要简单的拖动模板即可,入门门槛低,另外,服务商们提供有利于营销和交易场景的插件和功能,在支付、物流、营销上提供闭环支持,能够帮助新手快速起步。

而未来,品牌化是跨境电商的必经之路。一个品牌所产生的效益远远大于单单卖货,独立站是品牌的载体,为何不先站在转型升级的起跑线上呢。

点击小卡片咨询建站和海外营销详情,一站式建站、免费试用、无佣金哦~

Ueeshop专注外贸建站,经验丰富,已经服务了2W+的用户,从0帮助卖家搭建符合海外消费趋势的独立站,帮助中国优质商品卖向全球,欢迎跨境卖家体验产品和服务。

}

我要回帖

更多关于 根域名和顶级域名区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信