Kubernetes 服务发布基础

目录

[一、Service 核心概念与作用](#一、Service 核心概念与作用)

[1. Service 定义](#1. Service 定义)

[2. 应用背景](#2. 应用背景)

[3. 核心组件协作原理](#3. 核心组件协作原理)

[二、Service 工作原理](#二、Service 工作原理)

[1. 基本原理](#1. 基本原理)

[2. 负载均衡机制](#2. 负载均衡机制)

[2. Endpoint 动态关联机制](#2. Endpoint 动态关联机制)

[三、Service 四种类型及应用](#三、Service 四种类型及应用)

[1. ClusterIP(默认类型)(集群内服务)](#1. ClusterIP(默认类型)(集群内服务))

[2. NodePort(节点端口暴露)](#2. NodePort(节点端口暴露))

[3. LoadBalancer(云服务商负载均衡)](#3. LoadBalancer(云服务商负载均衡))

[4. ExternalName(外部服务映射)](#4. ExternalName(外部服务映射))

[四、Service 高级功能](#四、Service 高级功能)

[1. 多端口设置](#1. 多端口设置)

[2. 服务发现机制](#2. 服务发现机制)

五、实战案例与关键命令

[1. 完整案例:创建 NodePort 服务](#1. 完整案例:创建 NodePort 服务)

[2. 关键操作命令](#2. 关键操作命令)

六、本章核心总结


一、Service 核心概念与作用

1. Service 定义

  • 本质:Kubernetes 中用于封装一组 Pod 的抽象资源,为其提供稳定访问入口,屏蔽后端 Pod 动态变化
  • 核心功能:负载均衡、服务发现、服务暴露,是实现微服务的核心资源
  • 关键价值:将外部请求代理到内部 Pod,提供 4 层负载均衡,构建高可用应用

2. 应用背景

传统架构中需通过 Nginx、LVS 等组件实现负载均衡,而 Kubernetes 通过 Service 和 Ingress 实现类似功能,但配置方式更标准化4。其中 Service 负责负载均衡,Ingress 负责域名路由。

3. 核心组件协作原理

  • kube-proxy :
    • 负责流量转发和负载均衡,运行在每个节点上
    • 监听 Service 变化并更新 iptables/ipvs 规则
  • CoreDNS :
    • 集群 DNS 解析服务,将 Service 名称映射为 ClusterIP
    • 支持通过 服务名.命名空间.svc.cluster.local 格式访问

二、Service 工作原理

1. 基本原理

  • Pod IP 动态问题:Pod IP 会随重启变化,Service 为其创建虚拟 IP,客户端通过该 IP 访问 Pod
  • 组件协作 :
    • kube-proxy:监听 Service 变化,更新 iptables/ipvs 规则实现流量转发
    • CoreDNS:将 Service 虚拟 IP 注册到 DNS,支持通过服务名访问

2. 负载均衡机制

2. Endpoint 动态关联机制

  • 流量转发流程 :

    1. 客户端请求 Service 的 ClusterIP
    2. kube-proxy 根据模式更新路由规则
    3. 流量通过规则转发到后端 Pod
  • kube-proxy 模式对比 :

    模式 核心特点 性能
    userspace 早期模式,通过用户空间进程转发,存在内核态与用户态切换开销,已废弃 低
    iptables 默认模式,直接通过 iptables 规则路由,规则数量增加会影响性能 中
    ipvs 高性能模式,基于哈希表实现负载均衡,支持 RR/LC/DH 等多种算法 高
    kernelspace Windows 专用模式 -
  • Endpoint 定义 :Service 后端 Pod 的 IP:Port 组合,自动由 selector 匹配生成

  • 查看方式 :

    复制代码
    kubectl get endpoints  # 查看所有 Endpoint
    kubectl describe svc <服务名>  # 查看服务关联的 Endpoint

三、Service 四种类型及应用

1. ClusterIP(默认类型)(集群内服务)

  • 核心特性 :
    • 为集群内部服务提供虚拟 IP,外部无法直接访问
    • 默认类型,创建时无需指定 type
  • 创建方式 :
    • 命令行:kubectl expose deployment webapp 自动生成

    • YAML 配置:

      apiVersion: v1
      kind: Service
      metadata:
      name: webapp
      spec:
      ports:
      - port: 8080 # Service端口
      targetPort: 8080 # Pod端口
      selector:
      app: webapp # 匹配Pod标签

创建方式:

复制代码
kubectl expose deployment webapp  # 基于 Deployment 快速创建
kubectl create -f webapp-service.yaml  # 基于 YAML 创建
  • 验证 :通过curl 10.104.162.209:8080访问,流量会负载到后端 Pod

2. NodePort(节点端口暴露)

  • 核心特性 :

    • 在每个节点上开放指定端口,外部通过 NodeIP:NodePort 访问
    • 端口范围固定为 30000-32767
  • 配置示例 :

    复制代码
    spec:
      type: NodePort                # 指定类型为 NodePort
      ports:
        - nodePort: 30008           # 节点暴露端口
          port: 8080                # Service 内部端口
          targetPort: 8080          # Pod 端口
      selector:
        app: webapp                 # 匹配标签 
  • 访问示例 :http://192.168.10.101:30008 可访问集群服务

3. LoadBalancer(云服务商负载均衡)

  • 特点:调用云服务商负载均衡器,自动分配外部 IP15

  • 适用场景:生产环境对外暴露服务,需云平台支持(如 AWS ELB)

  • 配置示例:

    spec:
    type: LoadBalancer # 指定类型
    ports:
    - nodePort: 31771 # 可选,系统自动分配

4. ExternalName(外部服务映射)

  • 核心特性 :

    • 将 Service 映射到集群外部服务(如外部数据库、API)
    • 无 ClusterIP 和 Endpoint,通过 CNAME 记录指向外部地址
  • 跨命名空间案例 :

    复制代码
    spec:
      type: ExternalName            # 指定类型为 ExternalName
      externalName: myapp-svc02.test02.svc.cluster.local
      # 格式说明:目标服务名.目标命名空间.svc.cluster.local
  • 应用场景 :

    • 连接外部数据库(如externalName: mysql.example.com)
    • 跨命名空间通信:通过externalName: service.testns.svc.cluster.local映射

四、Service 高级功能

1. 多端口设置

  • 场景:当 Pod 提供多个服务端口时(如 Web 服务 + 管理端口)
  • 配置示例:
bash 复制代码
spec:
  ports:
    - protocol: TCP
      port: 8080                # Web 服务端口
      targetPort: 8080
      name: web                 # 端口命名
    - protocol: TCP
      port: 8005                # 管理服务端口
      targetPort: 8005
      name: management          # 端口命名
  selector:
    app: webapp                 # 匹配标签 

2. 服务发现机制

  • 1. 环境变量方式 :

    • 原理:Pod 创建时自动注入所有 Service 的环境变量

    • 示例变量:

      复制代码
      KUBERNETES_SERVICE_HOST=10.96.0.1       # Kubernetes 主服务 IP
      MYNGINX_SERVICE_HOST=10.109.164.93     # 自定义服务 IP
      MYNGINX_SERVICE_PORT=80                # 自定义服务端口 
  • 2. DNS 方式 :

    • 原理:通过 CoreDNS 解析 Service 名称为 ClusterIP

    • 解析格式:

      复制代码
      服务名.命名空间.svc.cluster.local
      示例:webapp.default.svc.cluster.local 
    • 测试命令:

      复制代码
      kubectl exec -it <Pod名> -- nslookup webapp  # 解析服务名

五、实战案例与关键命令

1. 完整案例:创建 NodePort 服务

  1. 创建 Deployment:

    复制代码
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: webapp
    spec:
      replicas: 2                 # 2 个 Pod 副本
      selector:
        matchLabels:
          app: webapp             # Pod 标签
      template:
        metadata:
          labels:
            app: webapp           # 与 selector 匹配
        spec:
          containers:
            - name: webapp
              image: kubeguide/tomcat-app:v1
              ports:
                - containerPort: 8080  # Pod 端口 
  2. 创建 Service:

    复制代码
    apiVersion: v1
    kind: Service
    metadata:
      name: webapp
    spec:
      type: NodePort                # NodePort 类型
      ports:
        - nodePort: 30008           # 节点端口
          port: 8080                # Service 端口
          targetPort: 8080          # Pod 端口
      selector:
        app: webapp                 # 匹配标签 
  3. 访问测试:

    复制代码
    curl http://<节点IP>:30008       # 浏览器或命令行访问

2. 关键操作命令

  • 创建 Service :kubectl create -f <yaml文件>
  • 暴露 Service :kubectl expose deployment <部署名> --port=<端口>
  • 查看 Service :kubectl get svc
  • 删除 Service :kubectl delete svc <服务名> 或 kubectl delete -f <yaml文件>

六、本章核心总结

  1. Service 本质:封装 Pod 为稳定服务,提供负载均衡和服务发现
  2. 四大类型核心差异 :
    • ClusterIP:集群内通信(默认)
    • NodePort:节点端口暴露(开发测试)
    • LoadBalancer:云平台负载均衡(生产环境)
    • ExternalName:外部服务映射(跨集群 / 跨命名空间)
  3. 关键组件:kube-proxy(流量转发)+ CoreDNS(DNS 解析)共同实现服务功能
  4. 服务发现:环境变量和 DNS 两种方式,推荐使用 DNS 方式(更灵活)
相关推荐
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS3 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
codeejun3 天前
每日一Go·MySQL-5、锁机制全解析
云原生·golang
赵文宇(温玉)3 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang3 天前
上传本地镜像到harbor中
docker·容器·持续部署
张洛闻Eren3 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
忆~遂愿3 天前
本地片库怎么在外面打开?Plex + cpolar 搭一套可远程访问的私人影音库
docker·容器
Thneonl3 天前
你的 Pod 为什么 Pending:调度器两阶段
后端·kubernetes
不吃香菜kkk、3 天前
CI/CD(GitOps)学习与部署手册
运维·云原生·容器·kubernetes·云计算·jenkins·argocd
ChaITSimpleLove3 天前
云原生性能对决:JDK21虚拟线程+GraalVM vs .NET10/11 技术栈深度对比
微服务·云原生·serverless·graalvm native·native aot·runtime async·.net11/java21