K8s: Service对象以及与Pod之间的通信关系

Service 与 Pod 有什么联系? K8s Service 与 Pod 的联系。 阅读详情

Service 对象


1 )概述

  • 每个 Pod 都有自己的 IP 地址,但是在 Deployment 中
  • 注意,实际在部署我们服务的时候创建的是 Deployment 而非 pod
    • Deployment 是控制器的一种
  • 在同一时刻运行的 Pod 集合可能与稍后运行该应用程序的 Pod 集合不同
  • 这导致了一个问题: 如果一组 Pod(比如: “后端”)即有3个pod提供同一个微服务
  • 这是微服务的多实例,也是 K8s 的核心作用
  • 后端为群集内的其他 Pod(比如: “前端”)提供功能
  • 在这种情况下,如果后端的一组pod失效
  • 它会无缝漂移到其他节点上重新启动,这时候服务的ip地址就变了
  • 这时候,外部访问pod(前端)如何找出并跟踪要连接的 IP 地址
  • 以便前端可以继续使用后端部分
  • 为了应对这个问题,K8s 提供了一个资源对象 Service
  • Service 将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法
  • 简单来说,K8s 通过 Service 来暴露 Pod 对外服务的一个地址
  • 通过集群外部访问pod的时候,不应该访问 Pod 的ip地址,而是访问为pod提供的DNS域名
  • Service 负责把请求从后端路由到对应的Pod
  • 使用 K8s 服务无需修改应用程序即可使用通用的服务发现机制
  • K8s 为 Pods 提供自己的 IP 地址,并为一组 Pod 提供相同的 DNS 名
  • 并且可以在它们之间进行负载均衡

2 ) 定义 Service

  • Service 在 K8s 中是一个 REST 对象,和 Pod 类似
  • 像所有的 REST 对象一样,Service 定义可以基于 POST 方式,请求 API server 创建新的实例
  • 例如,假定有一组 Pod,它们对外暴露了 9376 端口,同时还被打上 app=MyApp 标签
  • 示例说明
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service # 这里的名称将来会被用作请求的域名来被集群外部和内部对象使用
    spec:
      selector: # 选择器,Service 会通过满足选择器的Pod去建立和Pod的映射关系,一般是1对多
        app: xxx # 会找对应 这个 xxx label 的 Pod
      ports:
      - protocol: TCP
        port: 80 # 对外暴露的端口,集群内部可访问
        targetPort: 9376 # 容器底层的端口,如果不配置这个,默认使用和上面的 port 一致的
    
  • 创建 my-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: sss-app
      ports:
      - protocol: TCP
        port: 80
        targetPort: 9376
    
  • 可以看到,它没有创建任何容器,它就是虚拟的对象
  • 它只负责建立一系列的规则来访问 Service
  • $ kubectl create -f my-service.yaml
    service/my-service created
    
  • $ kubectl get svc
    kubernetes   ClusterIP   10.1.0.1     <none>        443/TCP   2d8h
    my-service   ClusterIP   10.1.38.99   <none>        80/TCP    35s
    

用Service暴露Pod的服务地址


1 )配置 Deployment 对象用来维护 Pod

  • 新建 dep-my-nginx.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-dep-nginx # 这个是 Deployment 对象的名称
    spec:
      selector:
        matchLabels: # 匹配标签
          run: my-dep-nginx # 运行匹配的 my-nginx 容器
      replicas: 2 # 2个副本,会创建 2个 pod
      template: # 定义模板
        metadata:
          labels:
            run: my-dep-nginx
        spec: # 模板说明
          containers:
          - name: my-dep-nginx
            image: nginx
            resources:
              limits:
                memory: "32Mi"
                cpu: "100m"
            ports:
            - containerPort: 80
    
  • $ kubectl apply -f dep-my-nginx.yaml

    deployment.apps/my-nginx created
    
  • 这样就会创建2个pod, 之后,创建 Service

  • $ kubectl get po | grep my-dep 查看相关 pod

    my-dep-nginx-7776c5d85c-crtgj   1/1     Running     0                 24s
    my-dep-nginx-7776c5d85c-ljztm   1/1     Running     0                 37s
    
    • 注意这里,上面两个pod我们不知道其ip和域名
    • 即使知道了,也访问不了,因为不应该被外部访问,因为其ip地址随时可能变化
    • 如果需要访问的话,就需要下面的 Service
  • $ kubectl get all 可以看到,多了一个 deploment

    NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/my-dep-nginx   2/2     2            2           6m42s
    
  • $ kubectl get pods -l run=my-dep-nginx -o yaml 通过 label 来查看

    • 这里输出过多,不便于在此展示,可以看到 pod 很多详细信息
    • 比如 pod ip 我们可以过滤来看 $ kubectl get pods -l run=my-dep-nginx -o yaml | grep podIP
    • 再比如,通过 $ ip addr | grep 10.244 可以看到网段是从 flannel.1 和 cni 中来的
    • 这里 10.244 是上面输出的,在 ip addr 作为过滤条件
    • 通过这个ip网段,底层容器间就可以相互通信了

2 )创建 Service

  • 这里通常有两种方式

2.1 使用 命令通过 Development 来暴露

  • $ kubectl expose deployment.apps/my-dep-nginx 这里的 deployment 是从上面获取的
    service/my-dep-nginx exposed
    
    • 执行完成后,服务就暴露出来了
  • $ kubectl get svc my-dep-nginx 验证暴露出的 Service
    NAME           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
    my-dep-nginx   ClusterIP   10.1.128.101   <none>        80/TCP    76s
    

2.2 基于yaml文件来处理

  • 上面等价于通过 yaml 文件创建 Service

  • 在用这种方式创建的时候,先把之前创建的 Service 删除

  • $ kubectl delete service my-dep-nginx

    service "my-dep-nginx" deleted
    
  • 现在创建 svc-my-nginx.yaml 文件

    apiVersion: v1
    kind: Service
    metadata:
      name: my-svc-nginx
      labels:
        run: my-dep-nginx # 注意这里和上面 deployment 匹配
    spec:
      ports:
      - port: 80
        protocol: TCP
      selector:
       run: my-dep-nginx # 注意这里和上面 deployment 匹配
    
  • $ kubectl create -f svc-my-nginx.yaml 创建 Service

    service/my-svc-nginx created
    
  • $ kubectl get svc my-svc-nginx

    NAME           TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    my-svc-nginx   ClusterIP   10.1.231.159   <none>        80/TCP    59s
    
  • $ kubectl describe svc my-svc-nginx

    Name:              my-svc-nginx
    Namespace:         default
    Labels:            run=my-dep-nginx
    Annotations:       <none>
    Selector:          run=my-dep-nginx
    Type:              ClusterIP
    IP Family Policy:  SingleStack
    IP Families:       IPv4
    IP:                10.1.231.159
    IPs:               10.1.231.159
    Port:              <unset>  80/TCP
    TargetPort:        80/TCP
    Endpoints:         10.244.2.22:80,10.244.2.23:80
    Session Affinity:  None
    Events:            <none>
    
    • 这里 Endpoints 也是 K8s 对象
    • 如果 Service 创建之后,如果匹配到 Pod Label 之后
    • 会为 Label 创建 Endpoint 对象
    • 这个 Endpoint 值就是ip, 端口就是port
  • 看下: $ curl 10.1.231.159 这里端口 80 是默认,不用添加

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body { width: 35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    
  • 看到上面显示是服务通了

k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡 Service 资源主要用于为 Pod 对象提供一个固定、统一的访问接口及负载均衡的能力。service 是一组具有相同 label pod 集合的抽象,集群内外的各个服务可以通过 service 进行互相通信。 阅读详情

相关推荐

k8s网络基础

是一种传统网络,有交换机和路由器等组成,借助以太网、路由协议、VLAN协议等实现通信,是Overlay的底层网络。容器中的Uderlay网络就是指借助驱动程序,把宿主机的网口暴漏给容器使用的技术,常见方案有MAC VLAN、IP VLAN、直接路由。

lingshengxiyou的博客 455

k8s中service资源与pod详解

详细讲解了关于service的访问端口,与pod拉取镜像与管理资源

cxyxt的博客 2157

自动化运维之k8s——Kubernetes集群部署、pod、service微服务、kubernetes网络通信

一、Kubernetes简介 1、Kubernetes简介 在Docker 作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应用了很多年,Borg系统运行管理着成千上万的容器应用。 Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收了Borg系统中的经验和教训。 Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合,将最终的应用服务交给用户。 Kubernetes的好处: (1)隐藏资源管理和错误处理,用户仅需要关

Zhaohui_Zhang的博客 9101

Docker学习第九天——K8S之pod、service

1.1 Service的作用• 在kubernetes中,Pod是有生命周期的,如果Pod重启它的IP很有可能会发生变化。如果我们的服务都是将Pod的IP地址写死,Pod挂掉或者重启,和刚才重启的pod相关联的其他服务将会找不到它所关联的Pod。• 为了解决这个问题,在kubernetes中定义了service资源对象,Service 定义了一个服务访问的入口。

qq_39637333的博客 1854

【K8S系列】第六讲:Kubernetes的网络模型

iptables规则监视发往服务虚拟的流量IP,并从一组可用的Pod中随机选择一个Pod IP地址,并且iptables规则将数据包的目标IP地址从服务的虚拟IP更改为所选Pod的IP。第三个网络是Pod的网络, K8s中一个Pod由多个容器组成,但是一个pod只有一个IP地址,Pod中所有的容器共享同一个IP。为了解决Pod IP地址不是持久性的,可能会进行更改,k8s采用service对pod进行抽象,集群节点所在的网络,这个网络就是你的主机所在的网络,通常情况下是你的网络基础设施提供。

颜淡慕潇 9111

企业数字化转型的 4A 架构指南:从概念解读到 TOGAF 阶段对应

4A企业架构是中国数字化转型实践中总结的简化框架,包含业务、应用、数据和技术四个架构层。它自上而下形成业务驱动应用的指导关系,自下而上构建技术支撑数据的实现路径,与国际标准TOGAF核心内容高度对应。该模型通过统一语言、战略对齐和系统梳理,有效连接业务需求与IT实施,已成为企业架构规划的实用工具。其分层结构清晰展示了从业务目标到技术落地的完整推导链,特别适合中国企业的数字化转型场景。

友莘居士的博客 2178

Kubernetes中的网络模型:Service、Ingress、Pod通信详解

Pod 间的直接通信、Service 的负载均衡和服务发现,以及 Ingress 的外部访问管理,共同构成了现代微服务架构的基石。这种设计不仅简化了容器的管理,也提高了应用的可扩展性和安全性,为企业级应用提供了强有力的支持。Kubernetes 支持多种网络插件(如 Calico、Flannel、Weave 等),它们实现了网络隔离、网络策略等功能,确保了 Pod 间的安全和效率。Service 是 Kubernetes 中用于抽象一组 Pod 的一种资源,提供了负载均衡和服务发现的功能。

java开发 1744

无人机散热系统设计:从材料选择到智能调控的全面解析

本文全面解析无人机散热系统设计,从材料选择到智能调控,探讨了导热界面材料、轻量化散热结构和智能调控算法的应用。通过实战案例,展示了如何在极端环境下优化散热性能,提升无人机的工作效率和可靠性。

weixin_42567279的博客 430

【Kubernetes】k8s中容器之间、pod之间如何进行网络通信?

集群内的任何位置,寻址到虚拟 IP 的流量都将负载均衡到与Service关联的一组Pod。container模式指定新创建的Docker容器和已经存在的一个容器共享一个网络命名空间,也就是说新创建的Docker容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。的 Docker 容器。Pod 中的容器都具有通过分配给 Pod 的网络命名空间分配的相同 IP 地址和端口空间,并且可以。来管理一组 Pod 的状态,允许我们跟踪一组随时间动态变化的 Pod 的IP 地址。

m0_60511809的博客 8290

STM32实战:电容触摸屏I2C转USB HID设备全解析

本文详细解析了基于STM32的电容触摸屏I2C转USB HID设备实现方案。通过硬件选型、协议分析和代码实现,展示了如何将GT911触摸屏数据转换为标准USB HID协议,并提供了关键调试经验与性能优化技巧,为智能家居控制面板等应用提供高性价比解决方案。

weixin_42548829的博客 321

牛耕式全覆盖算法-matlab代码

牛耕式路径全覆盖算法,也称为牛耕算法或者蚂蚁算法,是一种用于解决路径规划问题的启发式算法。这个算法的灵感来自于牛在耕田时的行为。在这个算法中,假设有一块田地需要耕作,牛从田地的某个角落开始行走,走过的路径会被标记。牛会优先选择尚未经过的路径,当所有的路径都走过后,算法停止。在路径规划问题中,田地可以看作是一个由节点和边构成的图。每个节点代表一个位置,每条边代表两个节点之间的连接。路径全覆盖问题是找出一组路径,使得每个节点都被至少一条路径经过。牛耕式路径全覆盖算法的基本思想是以启发式的方式逐步构建路径。

m0_69611489的博客 1690

k8s中docker,pod,service之间网络通信模型

k8s对Pods之间如何进行组网通信提出了要求,k8s对集群的网络有以下要求: 所有的Pods之间可以在不使用NAT网络地址转换的情况下相互通信 所有的Nodes之间可以在不使用NAT网络地址转换的情况下相互通信 每个Pod自己看到的自己的ip和其他Pod看到的一致 k8s网络模型设计基础原则:每个Pod都拥有一个独立的 IP地址,而且 假定所有 Pod 都在一个可以直接连通的、扁平的网络空间中 。 所以不管它们是否运行在同 一 个 Node (宿主机)中,都要求它们可以直接通过对方的 IP 进行访问

iqifenxia的博客 4114

DLL导出函数名隐藏实战:三种方法保护代码安全

在Windows软件开发中,动态链接库(DLL)的导出函数名是模块间通信的关键标识,也是逆向工程的重要突破口。理解PE文件格式中的导出表结构是掌握DLL工作原理的基础,它记录了函数地址、名称和序号的映射关系。通过隐藏或混淆这些导出名称,可以有效增加代码分析的难度,提升软件的知识产权保护和安全性。这一技术在软件保护、游戏反作弊和安全组件中具有重要价值。本文聚焦DLL导出函数名隐藏,结合Dependencies工具分析,详细解析仅序号导出、导出转发器和运行时动态修改三种实用方案,为开发者提供从原理到实践的完整指

weixin_29315091的博客 308

K8s Service:如何实现Pod的负载均衡与服务暴露

本文深入解析Kubernetes中Service的核心机制,重点探讨如何实现Pod的负载均衡与服务暴露。主要内容包括: 核心概念:Service作为Kubernetes抽象层,通过标签选择器关联Pod,提供稳定的访问端点 工作原理:详细分析ClusterIP、NodePort、LoadBalancer三种Service类型的工作机制 关键技术: 基于iptables/ipvs的负载均衡实现 服务发现与DNS解析机制 网络流量转发路径 实践示

编程世界如山海,探索不止。 1万+

单细胞分析(16)—— RNA Velocity 分析流程

RNA velocity 是一种强大的单细胞转录组分析工具,它可以预测细胞的未来状态,揭示发育轨迹,并用于探索细胞状态转换。RNA velocity 是一种通过单细胞 RNA 测序(scRNA-seq)数据推测细胞未来状态的分析方法。🚀**RNA velocity 提供了一个全新的角度来理解细胞的动态变化,为单细胞转录组分析带来了更深入的时空信息!

阅读文献,记录学习笔记 2981

PyTorch生成式人工智能(3)——使用PyTorch构建神经网络

在本节中,我们使用 PyTorch 在简单数据集上构建了一个神经网络,训练神经网络来映射输入和输出,并通过执行反向传播来更新权重值以最小化损失值,并利用 Sequential 类简化网络构建过程;介绍了获取网络中间值的常用方法,以及如何使用 save、load 方法保存和加载模型,以避免再次训练模型。

盼小辉丶的博客 1万+

Kubernetes K8S之Pod跨namespace名称空间访问Service服务

Kubernetes的两个Service(ServiceA、ServiceB)和对应的Pod(PodA、PodB)分别属于不同的namespace名称空间,现需要PodA和PodB跨namespace名称空间并通过Service实现互访。应该如何实现?

踏歌行的专栏 1万+

海德汉机床采集数据

海德汉数控系统我一般在高端机床上见得比较多。有好多五轴加工精度比较高的机床都用的是海德汉的系统。市面上常见的有530和640等型号。海德汉的采集还是有点难度的,需要对SDK有深度的了解。

若云流风的专栏 1531

Pod之间的通信详解

在Kubernetes集群中,Pod之间的通信是非常核心的功能。Pod是Kubernetes中的最小部署单元,它们之间经常需要进行通信以完成各种任务。本文将深入探讨Pod之间的通信方式,并通过示例代码来进一步解释。在Kubernetes集群中,Pod间通信的实现原理主要依赖于集群的网络架构和配置。

异构算力老群群(在读985计算机博士生)的技术博客 3077

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

3.Kubernetes—pod通信网络原理

4、外部网络和 pod 之间通信容器中 pod 共享同一个 IP 地址。故同一个 Pod 中 Container 可以做到直接通过 localhost 直接通信。pause 容器启动之前,会为容器创建虚拟一对 ethernet 接口,一个保留在宿主机 vethxxx(插在网桥上),一个保留在容器网络命名空间内,并重命名为eth0。两个虚拟接口的两端,从一端进入,另一端出来。任何 Pod 连接到该网桥的 Pod 都可以收发数据。

weixin_45246215的博客 4384

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

K8s网络网络基础:Kubernetes网络模型,Pod间通信原理

Kubernetes网络模型是K8s网络基础的核心内容,重点解析Pod间通信原理。文章从基础概念入手,详细介绍了Kubernetes网络模型的分层结构(CNI、Service、Pod网络等)及其关键术语。深入探讨了Pod间通信的工作原理,包括扁平网络模型、IP-per-Pod原则和跨节点通信机制。通过技术架构图、代码示例和性能指标对比,系统性地讲解了Kubernetes网络实现细节,帮助读者掌握容器网络编排的核心技术。文章还分析了常见网络问题排查方法,为云原生应用部署提供实践指导。

编程世界如山海,探索不止。 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Kubernetes 网络模型:Pod 通信、Service 网络与 CNI

组件职责CNIPod 网络分配与管理,跨节点通信kube-proxyService ClusterIP 转发,iptables/IPVS 规则CoreDNS集群内 DNS 解析,服务发现网络访问控制,依赖 CNI 实现fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;CNI 插件Pod 网络kube-proxyService 网络。

@ 1869

【云原生 • Kubernetes】认识 k8s 网络、外部网络访问 k8s 内部服务

Kubernetes 网络结构介绍、外部网络访问 k8s 内部服务的方法。

商务合作 | 共同学习 | 携手共进 9万+
上一篇: K8s: 运行Pod时的root用户和非root用户的安全相关配置
下一篇: K8s: 集群内Pod通信机制之环境变量
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值