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 方式(更灵活)
相关推荐
疯子的模样2 小时前
Docker 安装 Neo4j 保姆级教程
docker·容器·neo4j
虚伪的空想家3 小时前
rook-ceph配置dashboard代理无法访问
ceph·云原生·k8s·存储·rook
庸子6 小时前
基于Jenkins和Kubernetes构建DevOps自动化运维管理平台
运维·kubernetes·jenkins
Lpy25696 小时前
Docker Desktop 安装到D盘(包括镜像下载等)+ 汉化
运维·docker·容器
好奇的菜鸟7 小时前
Docker 配置项详解与示例
运维·docker·容器
Connie14518 小时前
k8s多集群管理中的联邦和舰队如何理解?
云原生·容器·kubernetes
IT成长日记13 小时前
【Docker基础】Docker数据卷管理:docker volume inspect及其参数详解
运维·docker·容器·volume·inspect
ladymorgana13 小时前
【Docker】如何设置 `wiredTigerCacheSizeGB` 和 `resources.limits.memory`
运维·docker·容器
mcdx13 小时前
基于Docker构建OrangePi5 SDK环境
docker·容器