k8s中service概述(一)ClusterIP

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 规则是否正常配置。
相关推荐
JiMoKuangXiangQu28 分钟前
Linux:用 runc 构建 ARM 平台容器
linux·容器·cgroup
菠萝炒饭pineapple-boss37 分钟前
在Kubernetes 1.26 上使用 StatefulSet 部署 MySQL8
mysql·云原生·容器·kubernetes
SG.xf3 小时前
k8s中的通信与调度
云原生·容器·kubernetes
Gold Steps.3 小时前
K8S遇到过的比较深刻的Pod问题
云原生·容器·kubernetes·故障处理
曹天骄3 小时前
Kubernetes Init 容器:实现 Nginx 和 PHP 对 MySQL 的依赖检查
nginx·kubernetes·php
弧襪4 小时前
基于 kubekey -实现懒人一键部署K8S集群
云原生·容器·kubernetes·k8s部署
斯普信云原生组4 小时前
K8S-etcd备份还原操作手册
容器·kubernetes·etcd
桂月二二5 小时前
云原生算力引擎:分布式推理的流体动力学
分布式·云原生
有梦想的攻城狮6 小时前
【一起来学kubernetes】21、Secret使用详解
云原生·eureka·kubernetes·secret