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. 关键操作命令

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

六、本章核心总结

  1. Service 本质:封装 Pod 为稳定服务,提供负载均衡和服务发现
  2. 四大类型核心差异
    • ClusterIP:集群内通信(默认)
    • NodePort:节点端口暴露(开发测试)
    • LoadBalancer:云平台负载均衡(生产环境)
    • ExternalName:外部服务映射(跨集群 / 跨命名空间)
  3. 关键组件:kube-proxy(流量转发)+ CoreDNS(DNS 解析)共同实现服务功能
  4. 服务发现:环境变量和 DNS 两种方式,推荐使用 DNS 方式(更灵活)
相关推荐
zhujilisa28 分钟前
k8s基础
云原生·容器·kubernetes
夏天是冰红茶1 小时前
使用Docker将PyQt深度学习项目打包成镜像
运维·docker·容器
努力打怪升级1 小时前
ACA云原生工程师认证知识点脑图
云原生
龙门吹雪1 小时前
Docker 安装 canal 详细步骤
运维·docker·容器·canal·mysql binlog 日志·增量数据订阅消费
小白不想白a4 小时前
【Ansible】使用ansible部署k8s集群前的准备工作脚本
容器·kubernetes·ansible
啥也不会的小胡4 小时前
深入理解 Docker:从入门到实践
docker·容器
极客天成ScaleFlash10 小时前
极客天成让统一存储从云原生‘进化’到 AI 原生: 不是版本升级,而是基因重组
人工智能·云原生
Lin_Aries_042111 小时前
容器化简单的 Java 应用程序
java·linux·运维·开发语言·docker·容器·rpc
小闫BI设源码11 小时前
Dockerfile
云原生·eureka·日志收集·自动重启·容器监控·健康检查·生产环境部署
岁岁种桃花儿11 小时前
详解 Kubernetes 命令:kubectl exec -it nginx -- bash 及实战场景
运维·nginx·kubernetes