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>
    
  • 看到上面显示是服务通了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/578415.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

运维笔记:基于阿里云跨地域服务器通信(上)

运维笔记 阿里云&#xff1a;跨地域服务器通信&#xff08;上&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this a…

【嵌入式AI开发】轻量级卷积神经网络MobileNet项目实战——文末完整源码工程文件

前言:本文介绍轻量级卷积神经网络MobileNet网络实战,包含MobileNetV1、MobileNetV2、ResNet50三个预训练模型可供选择。 实现:1.预训练MobileNet图像分类,2.调用摄像头实时MobileNet图像分类,3.MobileNet视频图像分类。 MobileNet网络理论详解:【嵌入式AI开发】轻量级卷…

git提交常用

git config --global user.name "你的名字或昵称" git config --global user.email "你的邮箱" 第一次上传到码云 1.找到要提交到码云的文件夹 右击打开Git Bash Here 2.用命令行创建本地仓库 git init 3.将待全部文件放入缓冲区 git add . 4.提交缓…

优化贪吃蛇在前进过程中,前进和后退的问题

1. 左边为head,右边为tail 定义相反数在abs&#xff08;&#xff09;绝对值函数中实现 2. 在转向函数turn()中&#xff0c;如果绝对值不相等的时候才赋予方向的值 3.贪吃蛇吃食物的思路 3.1 初始化食物initFood(), 蛇碰到食物函数hasFood&#xff08;&#xff09;,在移…

如何用Python实现智能客服问答系统

随着人工智能技术的不断发展&#xff0c;机器人客服与聊天系统成为了热门话题。Python作为一种简单易学、功能强大的编程语言&#xff0c;在机器人客服与聊天系统的开发中具有广泛应用。 本文将介绍如何使用Python实现机器人客服与聊天系统&#xff0c;包括实现方式、代码示例和…

Mysql-主从复制理解

环境&#xff1a;mysql&#xff0c;主从复制&#xff0c;必须有2个mysql实例&#xff0c;也就是说可以在一台电脑上安装2个msyql&#xff0c;或者2台服务器&#xff0c;一个主服务器&#xff0c;一个从服务器 在实际的生产中&#xff0c;为了解决Mysql的单点故障已经提高MySQL的…

【Unity动画系统】动画基本原理与Avater骨骼复用

动画基本原理 动画片段文件是一个描述物体变化状态的文本文件 在Unity中创建的资源文件大多都是YAML语言编写的文本文件 Curves表示一种变化状态&#xff0c;为空的话则没有记录任何内容 位置变化后的旋转变化状态&#xff1a; 动画文件里的Path名字要相同才能播放相同的动画 …

外贸财务挑战面面观:应对难题之道大揭秘!

出海也开始卷起来了。越来越多的中国企业投身海外市场&#xff0c;寻求更广阔的发展空间。然而&#xff0c;出海之路并非坦途&#xff0c;企业既需把握全球商机&#xff0c;又需应对数字化转型、本土化运营、文化差异性等多重挑战。企业出海&#xff0c;该如何应对这些风浪&…

GPU服务器和普通服务器有何区别?

众所周知&#xff0c;服务器是网络中的重要设备&#xff0c;要接受少至几十人、多至成千上万人的访问&#xff0c;因此对服务器具有大数据量的快速吞吐、超强的稳定性、长时间运行等严格要求。 GPU服务器和普通服务器的主要区别在于硬件配置和适用场景&#xff0c;特别是处理器…

C 函数递归

目录 什么是递归 递归的限制条件 递归的例子 1、用递归求n的阶乘 递归扩展学习 1、青蛙跳台阶 思路 代码实现 2、汉诺塔问题​ 思路 代码实现 总结 什么是递归 递归&#xff1a;“递推” “回归” 在C语言中&#xff0c;函数递归就是&#xff1a;函数自己调用自…

FANUC机器人SOCKET连接指令编写

一、创建一个.KL文件编写连接指令 创建一个KL文本来编写FANUC机器人socket连接指令 二、KAREL指令代码 fanuc机器人karel编辑器编辑的karel代码如下&#xff1a; PROGRAM SM_CON %COMMENT SOCKET连接 %STACKSIZE 4000 --堆栈大小 %INCLUDE klevccdfVAR status,data_type,in…

武汉星起航:成功挂牌新起点,董事长张振邦引领行业再攀高峰

2023年10月30日&#xff0c;对于武汉星起航电子商务有限公司而言&#xff0c;是一个具有里程碑意义的日子。这一天&#xff0c;公司在上海股权托管交易中心成功挂牌展示&#xff0c;正式登陆资本市场&#xff0c;开启了公司发展的新篇章。这一创举不仅彰显了公司在跨境电商领域…

刷题日记 ---- 顺序表与链表相关经典算法题(C语言版)

目录 1. 移除元素2. 合并两个有序数组3. 移除链表元素4. 反转链表5. 合并两个有序链表6. 链表的中间结点7. 环形链表的约瑟夫问题8. 分割链表总结 正文开始 1. 移除元素 题目链接: 移除元素 题目描述: 思路历程: 题目明确要求, 不能使用额外的数组空间, 也就是说不可以创建…

新时代凌迟:考研

我不喜欢上班&#xff0c;但我很欣赏老板的品味&#xff0c;因为咱们公司竟然还在订阅报纸&#xff0c;而且只有一份&#xff0c;《中国青年报》。 这份报纸我最喜欢看的是“冰点周刊”专栏&#xff0c;因为这个栏目能让读者相信&#xff1a;报纸远远可以超越一天的生命。 昨天…

类和对象【三】析构函数和拷贝构造函数

文章目录 析构函数析构函数的定义析构函数的作用主要作用次要作用 析构函数的特点 拷贝构造函数拷贝构造函数的定义拷贝构造函数的作用主要作用次要作用 拷贝构造函数的特点浅拷贝和深拷贝浅拷贝深拷贝 拷贝构造函数的调用场景 析构函数 析构函数的定义 析构函数(destructor) …

stm32 hid自定义接收发送程序开发过程记录

cubleMX配置如下 修改端点描述符一次传输的数据大小 根据cubelMX标准在这里修改 编译错误 直接修改&#xff08;因为没有使用nodef &#xff09;编译通过 修改报告描述符&#xff08;默认的描述符无法传输数据&#xff09; 参考&#xff1a;USB协议详解第10讲&#xff08;USB描…

C++从入门到精通——string类

string类 前言一、为什么学习string类C语言中的字符串示例 二、标准库中的string类string类string类的常用接口说明string类对象的常见构造string类对象的容量操作string的接口测试及使用string类对象的访问及遍历操作下标和方括号遍历范围for遍历迭代器遍历相同的代码&#xf…

元宇宙APP搭建重点,会用到哪些三方服务?

元宇宙APP的搭建是一个综合性的项目&#xff0c;涉及到众多关键要素和第三方服务。以下是一些元宇宙APP搭建的重点&#xff0c;以及可能用到的第三方服务&#xff1a; 一、搭建重点 技术框架的选择与搭建&#xff1a;元宇宙APP需要稳定、高效的技术框架来支撑其运行。这包括前…

上位机图像处理和嵌入式模块部署(树莓派4b与视觉slam十四讲)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 实际使用中&#xff0c;树莓派4b是非常好的一个基础平台。本身板子价格也不是很贵&#xff0c;建议大家多多使用。之前关于vslam&#xff0c;也就是…

Leetcode刷题-(36~40)-Java

算法是码农的基本功&#xff0c;也是各个大厂必考察的重点&#xff0c;让我们一起坚持刷算法题吧。 遇事不决&#xff0c;可问春风&#xff0c;春风不语&#xff0c;即是本心。 我们在我们能力范围内&#xff0c;做好我们该做的事&#xff0c;然后相信一切都事最好的安排就可…
最新文章