当前位置: 首页 > news >正文

Kubernetes服务发布基础

Kubernetes 服务发布基础

本章要点

  • Service 的概念和原理
  • ClusterIP 类型 service
  • NodePort 类型的 service
  • LoadBalancer 类型的 service
  • ExternalName 类型的 service
  • Service 的多端口设置
  • Kubernetes 服务发现

前言

在当今的云计算和微服务架构中,Kubernetes(简称 K8s)已经成为了容器编排和管理的事实标准。通过 Kubernetes,我们可以轻松地将应用部署到集群中,并确保其高可用性和可扩展性。然而,应用部署完成后,如何将这些服务暴露给外部用户访问,成为了一个关键问题。

在传统的架构中,用户访问公司内部服务通常需要经过多层代理、网关和防火墙等组件。这些组件可能包括 Nginx、Haproxy、LVS 等负载均衡工具,或者公有云提供的 SLB、ELB 等服务。虽然 Kubernetes 在实现负载均衡和域名路由时也采用了类似的技术,但其内部的实现方式与传统架构并无本质区别,只是名称和配置方式有所不同。

在 Kubernetes 中,Service 和 Ingress 是两个核心概念,分别用于实现负载均衡和域名路由。Service 通过为一组 Pod 提供稳定的虚拟 IP 地址,实现了服务的负载均衡和服务发现;而 Ingress 则通过配置域名路由规则,使得外部用户可以通过域名访问集群中的服务。通过这两个组件,Kubernetes 能够有效地管理服务的暴露和访问,确保应用的高可用性和可扩展性。

本章将详细介绍 Kubernetes 中 Service 的概念、工作原理及其不同类型的应用场景,帮助读者深入理解如何通过 Service 将应用暴露给外部用户,并实现高效的负载均衡和服务发现。

一、Service 的定义

service 是 kubernetes 中的一种抽象,用于定义一组 pod 以及访问这一组 pod 的策略。service 的作用是将一组 pod 封装为一个虚拟的服务,并提供一个统一的入口,供客户端访问。service 支持负载均衡、服务发现、服务暴露等功能。

Service 用于为一组提供服务的 Pod 抽象一个稳定的网络访问地址,是 k8s 实现微服务的核心概念。通过 Service 的定义设置的访问地址是 DNS 域名格式的服务名称,对于客户端应用来说,网络访问方式并没有改变。Service 还提供了负载均衡器的功能,将客户端请求负载分发到后端提供具体服务的各个 Pod 上。

Service 主要用于提供网络服务,通过 Service 的定义,能够为客户端应用提供稳定的访问地址(域名或 IP 地址)和负载均衡功能,以及屏蔽后端 EndPoint 的变化,是 Kubernetes 实现微服务的核心资源。

总之,service 是 kubernetes 中一个非常重要的概念,service 用于将外部请求代理到内部 pod 上,提供 4 层负载均衡和服务发现的功能,使得我们可以构建高可用和可扩展的应用程序。

二、Service 工作原理

1. service 基本原理介绍

在 kubernetes 中,pod 的 IP 地址是动态变化的,因此无法直接通过 pod 的 IP 地址进行访问。service 的出现正是为了解决这个问题的。service 会为一组 pod 创建一个虚拟的 IP 地址,通过这个 IP 地址可以访问这组 pod 中的任意一个 pod。当客户端请求这个虚拟 IP 地址时,请求会被负载均衡到一组 pod 中的某一个 pod 上,从而完成对 pod 的访问。

service 的实现依赖于 kube-proxy 组件。kube-proxy 会在每个节点上监听 service 的变化,一旦有 service 发生变化,kube-proxy 会更新本地的 iptables 规则,从而实现流量的转发和负载均衡。

另外,service 还与 CoreDNS 有关。CoreDNS 是 kubernetes 集群中的 DNS 解析服务。在 kubernetes 中 service 的虚拟 IP 地址还会注册到 CoreDNS 中,从而使得客户端还可以通过 service 名称访问 service 的虚拟 IP 地址。在 service 的定义中,可以通过 spec.selector 字段指定哪些 pod 属于这个 service,这样,就可以将请求负载均衡到这些 pod 中。

总之,service 是 kubernetes 中一种非常重要的资源对象,它可以让 pod 对外提供服务,并提供负载均衡、服务发现等功能 。service 的实现依赖于 kube-proxy 和 CoreDNS 组件,他们共同协作,将 service 与 pod 连接起来,实现对 pod 的代理访问。

(Service 代理 Pod 流程图)

2. Service 的负载均衡机制

当一个 Service 对象在 Kubernetes 集群中被定义出来时,集群内的客户端应用就可以通过服务 IP 访问到具体的 Pod 容器提供的服务了。从服务 IP 到后端 Pod 的负载均衡机制,则是由每个 node 上的 kube-proxy 代理来负责实现的。

kube-proxy 的代理模式有:userspace、iptables、ipvs 和 kernelspace。

  • (1)userspace
    起初,kube-proxy 进程是一个真实的 TCP/UDP 代理,当某个 pod 以 clusterIP 方式访问某个 service 的时候,这个流量会被 pod 所在的本机的 iptables 转发到本机的 kube-proxy 进程,然后将请求转发到后端某个 pod 上。具体过程为:
    kube-proxy 为每个 service 在 node 上打开一个随机端口作为代理端口
    建立 iptables 规则,将 clusterip 的请求重定向到代理端口(用户空间)
    到达代理端口的请求再由 kubeproxy 转发到后端
    clusterip 重定向到 kube-proxy 服务的过程存在内核态到用户态的切换,开销很大,因此有了 iptables 模式,而 userspace 模式也被废弃了。
  • (2)iptables
    kubernets 从 1.2 版本开始将 iptabels 模式作为默认模式,这种模式下 kube-proxy 不再起到 proxy 的作用。其核心功能:通过 API Server 的 Watch 接口实时跟踪 Service 和 Endpoint 的变更信息,并更新对应的 iptables 规则,Client 的请求流量通过 iptables 的 NAT 机制 “直接路由” 到目标 Pod。
    不同于 userspace,在 iptables 的模式中,kube-proxy 不再负责转发数据包,kube-proxy 主要完成对 iptables 策略的动态管理。数据包的走向完全由 iptables 规则决定,这样的过程不存在内核态到用户态的切换,效率明显会高很多。但是随着 service 的增加,iptables 规则会不断增加,导致内核十分繁忙(等于在读一张很大的没建索引的表)
  • (3)ipvs
    从 kubernetes 1.8 版本开始引入第三代的 IPVS 模式,它也是基于 netfilter 实现的,但定位不同:iptables 是为防火墙设计的,IPVS 则专门用于高性能负载均衡,并使用高效的数据结构 Hash 表,允许几乎无限的规模扩张。
    ipvs 为负载均衡提供了更多的算法:
    rr: 轮训
    lc: 最小连接数
    df: 目标哈希
    sh: 源哈希
    sed: 预计延迟最短
    nq: 从不排队

ipvs 使用 ipset 存储 iptables 规则,在查找时类似 hash 表查找,时间复杂度为 0 (1),而 iptables 时间复杂度则为 O (n)。时间复杂度用字母 0 表示。
可以将 ipset 简单理解为 ip 集合,这个集合的内容可以是 Ip 地址、Ip 网段、端口等,iptabels 可以直接添加规则对这个可变集合进行操作,这样做的好处可以大大减少 iptables 规则的数量,从而减少性能损耗。
如果操作系统没有启用 IPVS 内核模块,kube-proxy 会自动运行为 iptables 模式,如果操作系统启用了 ipvs 模块,则 kube-proxy 会运行为 ipvs 模式。查看系统是否开启了 ipvs 模块,可以使用命令:lsmod | grep ip_vs

  • (4)kernelspace
    Windows Server 上的代理模式,此处不作介绍。

3. service 的 4 种类型

kubernetes 支持 4 种 service 类型。

  • (1)ClusterIP
    这是最常用的 Service 类型,它为 Pod 提供了一个虚拟的 IP 地址。当其他 Pod 需要访问该 Service 时,它们只需要使用该虚拟 IP 地址即可。Kubernetes 会自动将请求路由到相应的 Pod 上
  • (2)NodePort
    这种 Service 类型将 Pod 公开为集群中所有节点上的某个端口。当外部请求到达任何一个节点上的该端口时,Kubernetes 会将请求路由到相应的 Pod 上。
  • (3)LoadBalancer
    LoadBalancer Service: 这种 Service 类型使用云提供商的负载均衡器将请求路由到后端 Pod。Kubernetes 会自动创建和配置负载均衡器,并将其绑定到 Service 上。
  • (4)ExternalName
    ExternalName Service: 这种 Service 类型允许你将 Service 映射到集群外部的某个名称。当 Pod 需要访问该 Service 时,它们将使用该名称来解析出相应的 IP 地址。

三、生成用于测试 service 的 Deployment

编写 Deployment,用于各种 service 的验证。

在应用 Service 概念之前,先创建一个提供 web 服务的 Pod 集合,有两个 Tomcat 容器副本组成,每个容器提供的服务端口都为 8080。

  1. 编辑 deployment
apiVersion: apps/v1  # 指定API版本,Deployment属于apps/v1 API组
kind: Deployment     # 指定资源类型为Deployment,用于管理Pod副本集
metadata:name: webapp       # Deployment的名称,在命名空间内必须唯一
spec:replicas: 2        # 定义Pod的副本数量,确保始终有2个Pod运行selector:          # 标签选择器,用于确定Deployment管理哪些PodmatchLabels:     # 精确匹配标签app: webapp    # 匹配带有"app: webapp"标签的Podtemplate:          # Pod模板,定义新建Pod的配置metadata:labels:        # 为Pod添加标签,必须与selector匹配app: webapp  # 标签用于将Pod与Deployment关联spec:containers:    # 容器配置列表- name: webapp # 容器名称,在Pod内必须唯一image: kubeguide/tomcat-app:v1  # 使用的Docker镜像及版本ports:       # 容器暴露的端口配置- name: http # 端口名称,用于标识端口用途containerPort: 8080  # 容器内部监听的端口号protocol: TCP       # 协议类型,可选TCP或UDP

selector(选择器)主要用于资源的匹配,只有符合条件的资源才会被调用或使用,可以使用该方式对集群中的各类资源进行分配。Kubernetes 和核心资源 Deployment、StatefulSet 管理的 Pod 是通过选择器字段决定的,通过 Service 访问这些后端 Pod 也是通过选择器字段决定的。

label(标签)可以对 Kubernetes 的其他资源进行配置,当 Kubernetes 对系统的任何 API 对象如 Pod 进行分组时,会对其添加标签,用以精准的选择对应的 API 对象。

  1. 创建该 Deployment
[root@k8s-master ~]# kubectl create -f webapp-deployment.yaml
  1. 查看 pod 创建情况
[root@k8s-master ~]# kubectl get pod
NAME                         READY   STATUS    RE
http://www.xdnf.cn/news/1172071.html

相关文章:

  • 【数据结构】线性表概括
  • [特殊字符] 从数据库无法访问到成功修复崩溃表:一次 MySQL 故障排查实录
  • SQL基础⑧ | 表格篇
  • React中的antd的表格使用方法
  • 在 Ubuntu 上将 Docker 降级到版本 25.0.5 (二) 降低版本,涉及兼容性问题
  • 解决 i.MX6ULL 通过 ADB 连接时权限不足问题 not in the plugdev group
  • C++ 扫描局域网某个端口是否开放(如 5555 )(android adb) 线程并发加速
  • 苍穹外卖DAY11
  • 华为云数据库 GaussDB的 nvarchar2隐式类型转换的坑
  • gig-gitignore工具实战开发(一):项目愿景与蓝图规划
  • C#与WPF使用mvvm简单案例点击按钮触发弹窗
  • C Primer Plus 第6版 编程练习——第10章(上)
  • MySQL金融级数据一致性保障:从原理到实战
  • 视频、音频录制
  • Javascript常见的使用场景
  • 基于 XGBoost 与 SHAP 的医疗自动化办公与可视化系统(上)
  • Deep learning--模型压缩的五种方法
  • 什么是5G-A三防平板?有什么特点?哪些领域能用到?
  • Java 抽象类 vs 接口(Abstract Class vs Interface)对比笔记
  • 220V降5V,输出100MA,为家电电器消费类产品提供电源WD5202L
  • 【Dify】-进阶11- 权限与发布配置详解
  • ESP32-CAM实战:DIY基于OpenAI的AI视觉识别相机
  • 显微科研中的关键选择:不同显微镜相机技术特性与应用适配性全面解析
  • k8s pvc是否可绑定在多个pod上
  • 学生信息管理系统 - HTML实现增删改查
  • 硬件基础 -- 信号完整性
  • solidity从入门到精通 第四章:智能合约的生命周期
  • 需要系统的学习下Docker的使用
  • 【图像处理基石】如何对遥感图像进行目标检测?
  • Upload-Labs通关全攻略详细版