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

K8S学习之基础十九:k8s的四层代理Service

K8S四层代理Service

  1. 四层负载均衡Service
    在k8s中,访问pod可以通过ip+端口的方式,但是pod是由生命 周期的,pod在重启的时候ip地址往往会发生变化,访问pod就需要新的ip地址,这样就会很麻烦,每次pod地址改变就要修改访问ip。Service的引进解决了这种问题,通过定义Service资源对象,Service定义一个服务访问的入口,客户端可以通过这个入口访问对应的pod,就算pod重新生成,ip发生变化,Service依旧通过pod标签关联到这个pod,避免连接失败,这样看来,Service可以看做是一组Pod的逻辑组合。
    从下图可以看出客户端通过Service访问pod的方式
    pid的ip经常变化,service是pod的代理,只要访问service,就能代理到对应的pod
    pod的ip在集群外部是无法访问的,通过service,可以在集群之外的机器访问pod
    在这里插入图片描述
    Service是一个固定接入层,客户端可以通过访问Service的ip+port访问到其关联的后端pod。这个service工作以来与k8s集群之上部署的dns附件,现在的版本都是用的coredns。k8s要给客户端提供网络功能,还需要依赖第三方网络插件(flannel、calico等)。每个k8s几点上都有一个组件kube-proxy,始终监视着apiserver中有关service资源的变动信息,跟master上的apiserver交互,随时连接到apiserver获取任何一个与service资源相关的资源变动情况,通过k8s中固有的请求方式watch实现,一旦service资源内容发生变动(如创建删除等),kube-proxy都会将它转化成当前几点之上能够实现service资源调度,把请求调度到后端特定pod资源之上的规则,可能是iptables,也可能是ipvs,这个取决于service的实现方式。
    k8s在创建Service的时候,会根据标签选择器selector来查找pod,据此创建与Service同名的endpoint对象,当pod地址发生变化时,endpoint也会随之发生变化,service接收全段client请求时,就会通过endpoint,找到转发到哪个pod进行访问的地址,至于转发到哪个节点的pod,有负载均衡kube-proxy决定

  2. k8s集群中的三类ip地址
    Node Network(节点网络):物理节点或者虚拟节点的网络
    Pod network(pod网络):创建的pod的ip地址,在创建集群时指定网段
    ClusterNetwork(集群地址):也成为service network,这是个虚拟的ip地址,没有配置在某个接口上,只是出现在service规则当中。
    在这里插入图片描述

  3. service的四种类型,先创建一组pod,然后分别用不同类型的service测试

    vi service-pod.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:name: my-nginx
    spec:replicas: 3selector:matchLabels:app: my-nginxversion: v1template:metadata:labels:app: my-nginxversion: v1spec:containers:- name: my-nginximage: 172.16.80.140/nginx/nginx:1.26imagePullPolicy: IfNotPresentports:- containerPort: 80
    

    在这里插入图片描述
    ClusterIP:
    默认类型:创建 Service 时,默认类型为 ClusterIP。
    作用:为集群内部提供访问,Service 会分配一个内部 IP,只能在集群内部访问。
    适用场景:适用于集群内部服务间的通信。
    bash vi service-clusterip.yaml apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-nginx ports: - protocol: TCP. # 协议类型 port: 80 # service的端口 targetPort: 80 # 对应pod中容器的端口
    在这里插入图片描述

    同时会创建一个endpoints(简称ep)
    ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/00ec03b596b8454b861ee8fdde8d268c.png#pic_left =500x)
    ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c3f7466a79d1497eba00a0965461a21b.png#pic_left =500x)
    可通过访问service的方式,访问到代理的pod,即使pod被删除一个,deploy创建一个新的pod,ip发生变化,但是pod标签没有变化,service没有变化,依然可以代理到所有同样标签的pod之上。
    

    NodePort:
    作用:在 ClusterIP 基础上,通过每个节点的 IP 和静态端口(NodePort)暴露服务,外部可通过 : 访问。
    端口范围:默认范围为 30000-32767。
    适用场景:适用于需要从集群外部访问的服务。
    上面的clusterip类型的service,只能在集群内部访问,无法在集群外部访问。为了解决这个问题,可以使用NodePort类型的service

    ```bashvi service-nodeport.yaml kind: Servicemetadata:name: my-servicespec:type: NodePortselector:app: my-nginxports:- protocol: TCPport: 80targetPort: 80```生成一个nodeport类型的service,不但可以在集群内部访问,还可以通过访问node+port的方式访问,端口可以指定,也可以默认生成。其中node指集群中所有的节点。![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6a8a2bc832c74fd9b8ba4dea9a39630d.png#pic_left =500x)
    ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3b3be03ca43b4b598a228cb43aa0bf69.png#pic_left =500x)
    

    LoadBalancer:
    作用:在 NodePort 基础上,使用云服务商的负载均衡器将服务暴露到外部,自动分配外部 IP。
    适用场景:适用于在云环境中需要外部访问的服务。
    ExternalName:
    作用:将 Service 映射到外部 DNS 名称,不提供负载均衡或代理,仅返回 CNAME 记录。
    适用场景:适用于将服务指向外部资源。


http://www.mrgr.cn/news/93789.html

相关文章:

  • 分布式ETCD面试题及参考答案
  • 数据结构第六节:二叉搜索树(BST)的基本操作与实现
  • 数据结构第八节:红黑树(初阶)
  • 74LS148实现优先权管理
  • Python asyncIO 面试题及参考答案 草
  • 《C陷阱与缺陷》读书笔记(一)
  • 如何利用DeepSeek+OCR技术打造一款AI投标工具:自动解析招标文件并生成投标标书的工具?
  • 初识大模型——大语言模型 LLMBook 学习(一)
  • 利用pdf.js+百度翻译实现PDF翻译,创建中文PDF
  • 【UCB CS 61B SP24】Lecture 28 - Tries 学习笔记
  • Java多线程与高并发专题——什么是阻塞队列?
  • Linux中的TCP编程接口基本使用
  • 【开源界的Manus替代战:模块化设计 vs 跨平台实战 vs 全能开发,谁主沉浮?】
  • HTML5(Web前端开发笔记第一期)
  • Vue使用jsts,将wkt转为geojson
  • 微服务与消息队列RabbitMQ
  • Windows控制台函数:控制台窗口设置函数system(“mode con ...“)
  • 【Python】omegaconf 用法详解
  • 深入解析:(基础篇)Linux中KVM虚拟化技术
  • JU TPS研究笔记