服务的 Pod 选择器仅用来构建 IP 和端口列表,存储在 Endpoint 资源中。当客户端连接到服务时,服务代理会选择一个 IP 进行重定向
$ kubectl get endpoints kubia NAME ENDPOINTS AGE kubia 10.108.1.4:8080,10.108.2.5:8080,10.108.2.6:8080 2h 2. 手动配置服务的 Endpoint创建不包含 Pod 选择器的服务将不会创建 Endpoint 资源,此时需要手动创建 Endpoint
apiVersion: v1 kind: Service metadata: name: external-service spec: # 没有指定 Pod 选择器 ports: - port: 80 apiVersion: v1 kind: Endpoints metadata: name: external-service # Endpoint 名称需和服务名称匹配 subsets: - addresses: # 服务将连接重定向到 Endpoint 的 IP 地址 - ip: 11.11.11.11 - ip: 22.22.22.22 ports: # Endpoint 的目标端口 - port: 80 3. 为外部服务创建别名通过 FQDN(完全限定域名)访问外部服务
apiVersion: v1 kind: Service metadata: name: external-service spec: type: ExternalName # 创建一个具有别名的外部服务的服务 externalName: someapi.somecompany.com # 实际服务的全限定名 ports: - port: 80Pod 通过external-service.default.svc.cluster.local访问外部服务
ExternalName 服务仅在 DNS 级别实施,为服务创建了简单的 CNAME DNS 记录。因此连接到服务的客户端将直接连接到外部服务,完全绕过服务代理。因此该类型服务不会获得集群 IP
CNAME 记录指向完全限定的域名而不是数字 IP 地址
三、将服务暴露给外部客户端将服务类型设置为 NodePort:每个集群节点打开一个端口,并将在该端口上收到的流量重定向到该服务
将服务类型设置为 LoadBalance:NodePort 类型的一种扩展。服务通过一个专用的负载均衡器来访问,客户端通过负载均衡器的 IP 连接到服务
创建一个 Ingress 资源:通过一个 IP 地址公开多个服务。运行在 HTTP 层(网络协议第七层,而服务运行在第四层)
1. 使用 NodePort 类型的服务 apiVersion: v1 kind: Service metadata: name: kubia-nodeport spec: type: NodePort # 默认 ClusterIP ports: - port: 80 targetPort: 8080 nodePort: 30123 # 集群节点端口(不指定则随机) selector: app: kubia可通过<node-ips>:30123或<cluster-ip>:80访问
2. 使用 LoadBalancer 类型的服务负载均衡器拥有独一无二的可公开访问的 IP 地址,并将连接重定向到服务(节点无需关闭防火墙)
若 K8s 在不支持 LoadBalancer 服务的环境中运行,则不会调用负载均衡器,此时服务仍表现为 NodePort 服务
spec: type: LoadBalancer可通过<external-ip>:80访问
3. 了解外部连接的特性网络跳数
当访问到某个节点的端口,服务随机转发 Pod,此时 Pod 可能不在此节点上,这就需要额外的网络跳转。可将服务配置为仅将外部连接重定向到接收该连接的节点上的 Pod 来阻止跳转:
spec: externalTrafficPolicy: Local缺点:
若无本地 Pod 存在,连接将挂起
会导致 Pod 的负载分布不均衡
客户端 IP 不会被记录
当通过节点端口接收到连接时,会对数据包进行 SNAT(源网络地址转换),因此数据包的源 IP 将发生更改
Local 外部流量策略会保留客户端 IP,因为接收连接的节点和 Pod 所在节点没有额外跳跃(不执行 SNAT)
四、通过 Ingress 暴露服务每个 LoadBalancer 服务都需要自己的负载均衡器以及独有的公有 IP,而 Ingress 只需一个公网 IP 便可为多个服务提供访问
客户端发送 HTTP 请求时,Ingress 会根据请求的主机名和路径决定请求转发到的服务
Ingress 在网络栈(HTTP)的应用层,可以提供一些服务不能实现的功能。如基于 cookie 的会话亲和性
只有 Ingress 控制器在集群中运行,Ingress 资源才能正常工作。不同的 K8s 环境使用不同的控制器实现,但有些不提供默认控制器