本文主要描述容器服务中同一个集群内的应用,如何相互访问,满足通信需求。
工作负载创建完成后在多个 Pod 中运行,而 Pod 由于具备弹性伸缩属性,因此访问 Pod 会面临如下几个问题:
Kubernetes 中使用 Service 对象解决上述 Pod 访问问题。
集群内访问是指将工作负载暴露给同一集群内其他工作负载访问的方式,可以通过“集群内部域名”访问。
例如创建一个名为 nginx 的 Service,端口号为 8080,则集群内部访问时,直接通过 nginx:8080 就可以访问到 Service,进而访问后台 Pod。
节点访问是指在每个节点的 IP 上开放一个静态端口,通过静态端口对外暴露服务。集群内其他应用通过请求NodeIP:NodePort,即可访问服务。
LoadBalancer 类型的 Service 其实是 NodePort 类型的扩展,通过 LoadBalancer 访问Service,Service 再将请求转发到节点的 NodePort。实现了负载均衡,提供了更高的可靠性保障。
在微服务相关场景,如果不需要负载均衡以及 Service IP,需要直通Pod的时候。可以通过指定 Cluster IP(spec.clusterIP
)的值为"None"
来创建 Headless Service。
Headless Service 不会为 Service 创建 ClusterIP,DNS 查询时会返回所有 Pod 的 DNS 记录,这样就可以访问到所有 Pod 的 IP 地址。相当于直接访问 Pod。
集群内访问(ClusterIP)和 Headless Service 的主要区别和应用场景如下。
差异项 | 集群内访问(ClusterIP) | Headless Service |
---|---|---|
ClusterIP | 有。 | 无。 |
解析 Service 的 DNS 结果 | 返回 Service 的 ClusterIP 地址。 | 返回所有 Pod 的 Pod IP 地址。 |
其他应用访问 Service | 只能访问到 Service,具体的 Pod 由 iptables 决定,实现了针对 Pod 的负载均衡。 | 能够直接访问到全部 Pod。 |
应用场景 | 需要 Service 为 Pod 进行负载均衡的场景。 |
|
访问方式 | 公开内容 | 说明 |
---|---|---|
ClusterIP | spec.clusterIp:spec.ports[*].port | 只能在集群内访问此服务。可从其spec.clusterIp 端口访问。如果设置了spec.ports[*].targetPort ,它将从端口路由到 targetPort。调用时获得的 ClusterIP:kubectl get services 是集群内部分配给该服务的 IP。 |
NodePort |
| 如果从节点的外部 IP 在 NodePort 上访问此服务,它将把请求路由到spec.clusterIp:spec.ports[*].port ,然后将请求路由到spec.ports[*].targetPort (如果已设置)。也可以使用与 ClusterIP 相同的方式访问此服务。NodeIP 是节点的外部 IP 地址。无法从访问服务<ClusterIP>:spec.ports[*].nodePort 。 |
LoadBalancer |
| 可以从负载均衡器的 IP 地址访问此服务,该服务会将请求路由到 NodePort,后者又将请求路由到 ClusterIP 端口。用户可以像访问 NodePort 或 ClusterIP 服务一样访问此服务。 |
<hostIP, hostPort, protocol>
组合必须是唯一,因此 hostPort 会限制 Pod 可以调度的位置数。 如果没有明确指定 hostIP 和 Protocol,Kubernetes 将使用0.0.0.0
作为默认的 hostIP,TCP 作为默认的 Protocol。如果需要跨 VPC 访问工作负载,则需要通过对等连接等手段打通不同 VPC 网络。
以无状态负载(Deployment)为例。详细的操作步骤和参数说明,请参见 集群内访问(ClusterIP)。
进入容器服务操作界面,选择 集群 > 工作负载 > 无状态工作负载,创建负载。
选择新创建好的工作负载,在 访问方式 页签中。选择 服务,单击 创建服务。
进入服务配置页面,配置服务的基本信息。
配置项 | 配置说明 |
---|---|
名称 | 配置服务的名称。 |
命名空间 | 配置服务的命名空间。本示例默认与 Deployment 所属命名空间相同。 |
标签 | 单击 添加标签 图标,配置服务的标签。标签能够为服务定义不同的属性,方便批量筛选等需求。 |
注解 | 对应 Kubernetes 中的 Annotation。单击 添加注解,为服务添加注解并配置键值对。 |
配置访问类型,本例中选择 集群内访问(ClusterIP)。
配置 端口映射。分别配置 Service 的端口、容器的端口和协议。
配置项 | 配置说明 |
---|---|
名称 | 配置服务端口到容器端口映射的名称。 |
服务端口 | 配置 Service 对外提供服务的端口。同一种协议的服务端口不允许重复。 |
协议 | 根据业务的协议类型,选择端口协议。当前支持 TCP 协议和 UDP 协议。 |
容器端口 | 配置容器的端口,该端口为工作负载对外提供服务的端口。例如 nginx 默认使用 80 端口。 |
配置标签选择器。Service 使用标签进行流量转发。
(可选)配置会话保持,配置超时时间,超时后依配置项处理。
单击 确定,完成配置。
登录集群中的其他节点,使用集群 IP + 服务端口号
的访问暴露的工作负载,发现访问成功(本例以 nginx 为例)。
以无状态负载(Deployment)为例。详细的操作步骤和参数说明,请参见 节点端口访问(NodePort)。
进入容器服务操作界面,选择 集群 > 工作负载 > 无状态工作负载,创建负载。
选择新创建好的工作负载,在 访问方式 页签中。选择 服务,单击 创建服务。
进入服务配置页面,配置服务的基本信息。
配置项 | 配置说明 |
---|---|
名称 | 配置服务的名称。 |
命名空间 | 配置服务的命名空间。本示例默认与 Deployment 所属命名空间相同。 |
标签 | 单击 添加标签 图标,配置服务的标签。标签能够为服务定义不同的属性,方便批量筛选等需求。 |
注解 | 对应 Kubernetes 中的 Annotation。单击 添加注解,为服务添加注解并配置键值对。 |
配置访问类型,本例中选择 节点端口访问(NodePort)。
配置端口映射。分别配置节点的端口、Service 的端口、容器的端口和协议。
配置项 | 配置说明 |
---|---|
名称 | 配置服务端口到容器端口映射的名称。 |
服务端口 | 配置 Service 对外提供服务的端口。同一种协议的服务端口不允许重复。 |
协议 | 根据业务的协议类型,选择端口协议。当前支持 TCP 协议和 UDP 协议。 |
节点端口 | 即 NodePort,可以填写具体的端口,也可以不填写。不填写具体值时系统自动分配端口。 |
容器端口 | 配置容器的端口,该端口为工作负载对外提供服务的端口。例如 nginx 默认使用 80 端口。 |
配置标签选择器。通过标签与工作负载相关联。
(可选)配置会话保持,配置超时时间,超时后依配置项处理。
单击 确定,完成配置。
登录集群中的其他节点,使用节点 IP+节点端口号
的访问暴露的工作负载,发现访问成功(本例以 nginx 为例)。
以无状态负载(Deployment)为例。详细的操作步骤和参数说明,请参见 负载均衡(LoadBalancer)。
进入容器服务操作界面,选择 集群 > 工作负载 > 无状态工作负载,创建负载。
选择新创建好的工作负载,在 访问方式 页签中。选择 服务,单击 创建服务。
进入服务配置页面,配置服务的基本信息。
配置项 | 配置说明 |
---|---|
名称 | 配置服务的名称。 |
命名空间 | 配置服务的命名空间。本示例默认与 Deployment 所属命名空间相同。 |
标签 | 单击 添加标签 图标,配置服务的标签。标签能够为服务定义不同的属性,方便批量筛选等需求。 |
注解 | 对应 Kubernetes 中的 Annotation。单击 添加注解,为服务添加注解并配置键值对。 |
配置访问类型,本例中选择 负载均衡(LoadBalancer)。
(可选)配置直通 Pod 模式。该模式是指 CLB 和 Pod 直接连接,不经过 Kube-proxy 的处理,能够利用 CLB 的健康检查等高级能力(仅 VPC-CNI 网络支持该配置项)。
配置 负载均衡器。在下拉菜单中选择 私网访问 和 自动创建。子网、实例规格按实际需求选择。
配置监听器调度算法,支持 加权轮询(WRR)、加权最小连接数(WLC) 和 源地址哈希(SH)。
算法 | 说明 |
---|---|
加权轮询(WRR) | 基于权重值进行流量的分发,权重值越高的后端服务器,被轮询到的次数(概率)越高。 |
加权最小连接数(WLC) | 优先将流量分发给当前连接数与权重比值最小的后端。 |
源地址哈希(SH) | 基于源 IP 地址的一致性哈希,相同源地址的请求会调度到相同的后端服务器。 |
(可选)按需选择是否启用健康检查。本示例不设置健康检查。
配置端口映射。
配置项 | 配置说明 |
---|---|
名称 | 配置端口映射的名称。 |
服务端口 | 配置 Service 对外提供服务的端口,同一种协议的服务端口不允许重复。 |
协议 | 根据业务的协议类型,选择端口协议。当前支持 TCP 协议和 UDP 协议 |
容器端口 | 配置容器的端口,该端口为工作负载对外提供服务的端口。例如 Nginx 的端口为 80 端口。 |
配置标签选择器。通过标签与工作负载相关联。
(可选)配置会话保持,配置超时时间,超时后依配置项处理。
单击 确定,完成配置。
登录集群中的其他节点,使用LoadBalancer 外部端点 IP + 端口号
的访问暴露的工作负载。
访问成功后如下所示(本例以 nginx 为例)。