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 的 Podports:- protocol: TCPport: 80 # 对外暴露的端口,集群内部可访问targetPort: 9376 # 容器底层的端口,如果不配置这个,默认使用和上面的 port 一致的
    
  • 创建 my-service.yaml
    apiVersion: v1
    kind: Service
    metadata:name: my-service
    spec:selector:app: sss-appports:- protocol: TCPport: 80targetPort: 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个 podtemplate: # 定义模板metadata:labels:run: my-dep-nginxspec: # 模板说明containers:- name: my-dep-nginximage: nginxresources: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-nginxlabels:run: my-dep-nginx # 注意这里和上面 deployment 匹配
    spec:ports:- port: 80protocol: TCPselector: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.mzph.cn/bicheng/4101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css 文字左右抖动效果

<template><div class"box"><div class"shake shape">抖动特效交字11</div></div> </template><script setup></script><style scope> .shape {margin: 50px;width: 200px;height: 50px;line-heigh…

计算机存储原理.2

1.主存储器与CPU之间的连接 2.存储器芯片的输入输出信号 3.增加主存的存储字长 3.1位扩展 数据总线的利用成分是不充分的(单块只能读写一位)&#xff0c;为了解决这个问题所以引出了位扩展。 使用多块存储芯片解决这个问题。 3.2字扩展 因为存储器买的是8k*8位的&am…

Linear Secret-Sharing Scheme(LSSS) Monotone Span Program(MSP)

参考文献&#xff1a; [KW93] Karchmer M, Wigderson A. On span programs[C]//[1993] Proceedings of the Eigth Annual Structure in Complexity Theory Conference. IEEE, 1993: 102-111.[CDM00] Cramer R, Damgrd I, Maurer U. General secure multi-party computation fr…

【C++风云录】走向智能农业时代:利用C++库实现农田管理和食品质量监测的突破

农业科学与食品安全&#xff1a;利用C库实现智慧农业的梦想 前言 随着科技的不断进步&#xff0c;农业科学和食品安全已经成为人们关注的焦点。农业生产的效率和质量对于满足不断增长的人口需求和保障食品安全至关重要。为了提高农业生产的效率和可持续性&#xff0c;利用计算…

【探索Java编程:从入门到入狱】Day2

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

K8s: 控制器之StatefulSets对象

StatefulSet 1 ) 概述 Stateful&#xff0c;也就是有状态应用&#xff0c;微服务无状态是一个理想的这么一个环境有些应用是有状态的&#xff0c;比如这个web服务器&#xff0c;它只能运行在一台server上因为它要访问一些持久化的存储比如说 mysql 它就是一个典型的有状态的应…

js[黑马笔记]

js基础 基础语法 输入输出 变量 数组 常量 数据类型 类型转换 运算符 语句 数组 函数 调用方式 函数名() 匿名函数 使用: 1.函数表达式 2.立即执行函数 对象 内置对象 web API DOM document object Model元素操作 获取元素 设置元素 定时器 DOM事件基础 事件监听 事件类…

MySQL商城数据表(70-79)

70店铺入驻流程表 DROP TABLE IF EXISTS xuge_shop_flows; CREATE TABLE xuge_shop_flows (flowId int(11) NOT NULL AUTO_INCREMENT,flowName varchar(100) NOT NULL,isShow tinyint(4) DEFAULT 1 COMMENT 0:隐藏 1:显示,sort tinyint(4) DEFAULT 0,isDelete tinyint(4) DEFA…

流量网关与服务网关的区别:(面试题,掌握)

流量网关&#xff1a;&#xff08;如Nignx&#xff0c;OpenResty&#xff0c;Kong&#xff09;是指提供全局性的、与后端业务应用无关的策略&#xff0c;例如 HTTPS证书认证、Web防火墙、全局流量监控&#xff0c;黑白名单等。 服务网关&#xff1a;&#xff08;如Spring Clou…

含匹配扰动的多智能体领航跟随一致性Matlab仿真

文章目录 [TOC](文章目录) 前言一、问题描述二、基于LQR的观测器和控制器设计1.观测器设计2.控制器设计 三、数值仿真四、参考文献总结 前言 ​本文探讨了带有匹配扰动的多智能体领航跟随一致性控制方法&#xff0c;并提供了相应的Matlab仿真代码。 具体的设计步骤如下&#…

filebeat 设置elasticsearch索引的 max_result_window

在 Filebeat 中设置索引的 max_result_window 需要修改 Elasticsearch 的索引模板。max_result_window 参数定义了在 Elasticsearch 中执行搜索时&#xff0c;最大返回文档的数量。默认情况下&#xff0c;该值为 10000。 答案来着gpt demo&#xff1a;http://124.220.104.235/ …

大数据—数据采集DataX

一、DataX介绍 官网&#xff1a; DataX/introduction.md at master alibaba/DataX GitHub DataX 是阿里云 DataWorks数据集成 的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。 DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、…

【算法刷题 | 贪心算法02】4.24(摆动序列)

文章目录 3.摆动序列3.1题目3.2解法&#xff1a;贪心3.2.1贪心思路3.2.2代码实现 3.摆动序列 3.1题目 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。 第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素…

机器人系统能用MQTT5.0代替ROS2吗?

前言 ROS2是目前最主流的机器人系统&#xff0c;但由于ROS2的学习曲线比较徒陗&#xff0c;而且对于资源受限的系统并不友好&#xff1b;而MQTT5.0是最新的MQTT消息传输协议&#xff0c;为现代IoT提供了更友好的支持&#xff0c;下面讨论MQTT5.0和ROS2结合使用&#xff0c;或机…

WPF 资源基础

动态资源/静态资源 UI代码 <Window x:Class"WpfApp1.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/ex…

太速科技-基于6 U VPX M.2 高带宽加固存储板

基于6 U VPX M.2 高带宽加固存储板 一、板卡概述 基于6 U VPX M.2 高带宽加固存储板&#xff0c;可以实现VPX接口的数据读写到PCI-E总线的NVME存储媒介上。采用PLX8732&#xff0c;上行链路提供带宽x16的PCI-E数据到VPX接口上&#xff1b;下行链路提供3路带宽x4的PCI-E接口…

函数为什么要防抖

一、函数为什么要防抖 有如下代码 复制代码 window.onresize () > { console.log(触发窗口监听回调函数) } 复制代码 当我们在PC上缩放浏览器窗口时&#xff0c;一秒可以轻松触发30次事件。手机端触发其他Dom时间监听回调时同理。 这里的回调函数只是打印字符串&#…

kali中pwn环境的配置-一步到位

文章目录 解决kali没有网络的问题&#xff08;配置eth0即可解决&#xff09;换源前提工具更新安装pwntools安装vscode安装pycharm安装中文输入法gdb配置ROPgadgetone_gadgetLibcSearcherchecksec待完善捏……………… 为了防止有时候出现某些问题需要重新配置pwn环境&#xff0…

Unity打包PC端exe,压缩打包为一个exe文件

目录 一.打包成功 1.打包输出文件 二.压缩输出目录为exe单个文件 1.添加到压缩文件 2.其他设置 1.点击“高级→自压缩选项” 2.修改解压后运行程序 3.设置模式 4.更新 三、生成.exe 一.打包成功 1.打包输出文件 1、一个后缀为 BurstDebugInformation_DoNotShip的文…

Swift加载Lottie

OC使用时&#xff0c;需要通过swift透出方法供OC使用 // 此处文件名可以从Build Settings下搜索Generated Header Name的值得出 #import <Test-Swift.h>一、导入包 target iOS douse_frameworks!# 此处pod lottie-ios end二、功能实现 1. 创建组件 import LottieobjcM…