k8s中service概述(一)ClusterIP

发布于:2025-03-22 ⋅ 阅读:(12) ⋅ 点赞:(0)

ClusterIP 是 Kubernetes 中最基础且常用的 Service 类型,主要用于在集群内部提供稳定的网络访问端点。以下是关于 ClusterIP Service 的详细说明:


1. ClusterIP 的核心功能
  • 集群内部访问:ClusterIP 提供一个集群内部的虚拟 IP(VIP),只能在 Kubernetes 集群内部访问,外部网络无法直接访问。

  • 服务发现:通过 Kubernetes 的 DNS 服务,其他 Pod 可以通过 Service 名称访问 ClusterIP。

  • 负载均衡:ClusterIP 会自动将流量分发到后端的多个 Pod,实现负载均衡。

  • 稳定的 IP 和端口:无论后端 Pod 如何变化,ClusterIP 的 IP 和端口保持不变,确保服务调用的稳定性。


2. ClusterIP 的工作原理

ClusterIP 的实现依赖于 Kubernetes 的核心组件和网络模型:

  1. Service 创建

    • 当创建一个 ClusterIP Service 时,Kubernetes 会为其分配一个虚拟 IP(ClusterIP),这个 IP 来自集群的 Service CIDR 范围(例如 10.96.0.0/12)。

    • Service 通过 selector 字段选择一组 Pod 作为后端。

  2. Endpoints 创建

    • Kubernetes 会自动创建与 Service 同名的 Endpoints 对象,其中包含所有匹配 selector 的 Pod 的 IP 和端口。

    • 如果 Pod 发生变化(例如扩容或重启),Endpoints 会自动更新。

  3. kube-proxy 的作用

    • 每个节点上的 kube-proxy 组件会监听 Service 和 Endpoints 的变化。

    • kube-proxy 通过以下方式实现流量转发:

      • iptables 模式:在节点上配置 iptables 规则,将流量从 ClusterIP 转发到后端 Pod。

      • IPVS 模式:使用更高效的 IPVS 实现流量转发。

    • 无论使用哪种模式,kube-proxy 都会确保流量被正确负载均衡到后端 Pod。

  4. DNS 解析

    • Kubernetes 的 CoreDNS 或 kube-dns 会为每个 Service 创建一条 DNS 记录。

    • 例如,Service 名称为 my-service,命名空间为 default,则其 DNS 名称为 my-service.default.svc.cluster.local

    • 集群内的 Pod 可以通过 DNS 名称访问 Service,DNS 会解析为 ClusterIP。


3. ClusterIP 的配置示例

以下是一个典型的 ClusterIP Service 的 YAML 配置文件:


  • selector:用于选择后端 Pod,只有匹配标签的 Pod 才会被纳入 Service 的后端。

  • ports

    • port:Service 暴露的端口,集群内的其他服务通过该端口访问 Service。

    • targetPort:后端 Pod 实际监听的端口。

    • protocol:支持的协议类型,默认为 TCP。


4. ClusterIP 的使用场景

ClusterIP 适用于以下场景:

  1. 微服务间通信

    • 在微服务架构中,服务之间通过 ClusterIP 进行内部通信。

    • 例如,前端服务通过 ClusterIP 访问后端 API 服务。

  2. 数据库访问

    • 数据库服务(如 MySQL、PostgreSQL)通常只在集群内部暴露,使用 ClusterIP 可以确保外部无法直接访问。

  3. 内部工具和服务

    • 例如监控系统(Prometheus)、日志系统(Elasticsearch)等,通常只在集群内部使用。

  4. 服务发现和负载均衡

    • ClusterIP 提供稳定的访问端点,并自动实现负载均衡,适合需要高可用的服务。


5. ClusterIP 的优缺点

优点

  • 简单易用,是 Kubernetes 默认的 Service 类型。

  • 提供稳定的 IP 和 DNS 名称,适合服务发现。

  • 自动负载均衡,支持后端 Pod 的动态变化。

缺点

  • 只能在集群内部访问,无法直接从外部访问。

  • 对于需要对外暴露的服务,需要结合 NodePort 或 LoadBalancer 使用。


6. ClusterIP 的调试和排查
  1. 查看 Service 信息

    kubectl get svc <service-name>

    输出示例:

    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    my-service   ClusterIP   10.96.123.45    <none>        80/TCP    5m

  2. 查看 Endpoints

    kubectl get endpoints <service-name>

    输出示例:

    NAME         ENDPOINTS                         AGE
    my-service   10.244.1.2:9376,10.244.2.3:9376   5m

  3. 检查 DNS 解析
    在集群内的 Pod 中使用 nslookupdig 检查 Service 的 DNS 解析:

    nslookup my-service.default.svc.cluster.local

  4. 检查 kube-proxy 和 iptables/IPVS 规则

    • 登录到节点,检查 iptables 或 IPVS 规则是否正常配置。