k8s service 原理

Kubernetes(k8s)中的 Service 是一种抽象,它定义了一组 Pod 的逻辑集合和一个访问它们的策略。Service 的主要目的是为一组 Pod 提供一个稳定的网络端点,即使 Pod 的 IP 地址发生变化(例如,由于 Pod 的重启或扩展)。以下是 Service 的工作原理和一些关键概念:

1. Service 的类型

Kubernetes 支持多种类型的 Service:

  • ClusterIP:默认类型,为 Service 分配一个集群内部的 IP 地址,只能在集群内部访问。

  • NodePort:在每个节点的 IP 上暴露一个端口,使得外部流量可以通过节点的 IP 和端口访问 Service。

  • LoadBalancer:在云平台上创建一个外部负载均衡器,并将流量转发到 Service。

  • ExternalName:将 Service 映射到一个 DNS 名称,而不是一个 IP 地址。

2. Service 的创建

你可以通过 YAML 文件定义一个 Service:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP

在这个例子中,selector 指定了哪些 Pod 属于这个 Service。ports 定义了 Service 的端口和目标 Pod 的端口。type 指定了 Service 的类型。

3. Service 的工作原理

3.1 ClusterIP
  • ClusterIP 类型的 Service 为 Service 分配一个集群内部的 IP 地址。

  • 这个 IP 地址只能在集群内部访问。

  • Service 通过 kube-proxy 组件将流量转发到后端的 Pod。

3.2 NodePort
  • NodePort 类型的 Service 在每个节点的 IP 上暴露一个端口。

  • 外部流量可以通过节点的 IP 和端口访问 Service。

  • 例如,如果 NodePort 是 30001,那么你可以通过 http://<NodeIP>:30001 访问 Service。

3.3 LoadBalancer
  • LoadBalancer 类型的 Service 在云平台上创建一个外部负载均衡器。

  • 负载均衡器将流量转发到 Service,Service 再将流量转发到后端的 Pod。

  • 例如,在 AWS 上,Kubernetes 会创建一个 ELB(Elastic Load Balancer)。

3.4 ExternalName
  • ExternalName 类型的 Service 将 Service 映射到一个 DNS 名称。

  • 例如,你可以将 Service 映射到 my.database.example.com

4. Service 的负载均衡

Service 通过 kube-proxy 组件实现负载均衡。kube-proxy 运行在每个节点上,负责将流量转发到后端的 Pod。kube-proxy 支持多种模式:

  • Userspace 模式:在用户空间中进行流量转发。

  • iptables 模式:使用 iptables 规则进行流量转发。

  • IPVS 模式:使用 IPVS(IP Virtual Server)进行流量转发,提供更高的性能和可扩展性。

5. Service 与 Endpoints

Service 通过 Endpoints 对象与后端的 Pod 关联。Endpoints 对象包含了属于 Service 的所有 Pod 的 IP 地址和端口。当 Pod 的 IP 地址发生变化时,Endpoints 对象会自动更新。

6. Service 的 DNS

Kubernetes 集群中的 DNS 服务会为每个 Service 创建一个 DNS 记录。例如,名为 my-service 的 Service 会有一个 DNS 记录 my-service.default.svc.cluster.local。集群中的 Pod 可以通过这个 DNS 名称访问 Service。

7. Service 的会话保持

默认情况下,Service 使用轮询(Round Robin)策略进行负载均衡。如果你需要会话保持(Session Affinity),可以在 Service 的定义中设置 sessionAffinity 字段为 ClientIP

总结

Service 是 Kubernetes 中用于管理网络访问的重要抽象。它为一组 Pod 提供了一个稳定的网络端点,并支持多种类型的访问方式(如 ClusterIP、NodePort、LoadBalancer 和 ExternalName)。通过 kube-proxy 组件,Service 实现了负载均衡,并将流量转发到后端的 Pod。Service 与 Endpoints 对象和 DNS 服务紧密结合,提供了强大的网络管理功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值