【kubernetes】Service 介绍和应用

news2024/11/15 9:39:20

一,Service介绍

  • 四层代理是基于传输层(第四层)工作的代理,主要在传输层(如TCP、UDP协议)上转发和管理数据流

  • 七层代理是基于应用层(第七层)工作的代理,能够对应用层协议(如HTTP、SMTP)进行解析和处理。

Service是四层代理网络,基于IP和端口对数据进行转发和负载均衡

1,概述

因为Pod重启,重建时,它的IP很有可能会发生变化。因此在kubernetes中定义了service资源对象,Service 定义了一个服务访问的入口,客户端通过这个入口即可访问服务背后的应用集群实例。

Service是一个固定接入层,客户端可以通过访问service的ip和端口,访问到service关联的后端pod,这个service工作依赖于在kubernetes集群之上部署的一个附件,就是kubernetes的dns服务

(不同kubernetes版本的dns默认使用的也是不一样的,1.11之前的版本使用的是kubeDNs,较新的版本使用的是coredns),

service的名称解析是依赖于dns附件的,因此在部署完k8s之后,需要再部署dns附件,kubernetes要想给客户端提供网络功能,需要依赖第三方的网络插件(flannel,calico等)。

每个K8s节点上都有一个组件叫做kube-proxy,kube-proxy这个组件将始终监视着apiserver中有关service资源的变动信息,需要跟master之上的apiserver交互,随时连接到apiserver上获取任何一个与service资源相关的资源变动状态,这种是通过kubernetes中固有的一种请求方法watch(监视)来实现的,一旦有service资源的内容发生变动(如创建,删除),kube-proxy都会将它转化成当前节点之上的能够实现service资源调度,把我们请求调度到后端特定的pod资源之上的规则,这个规则可能是iptables,也可能是ipvs,取决于service的实现方式。

2,工作原理

k8s在创建Service时,会根据标签选择器selector(lable selector)来查找Pod,据此创建与Service同名的endpoint对象,当Pod 地址发生变化时,endpoint也会随之发生变化,service接收前端client请求的时候,就会通过endpoint,找到转发到哪个Pod进行访问的地址。(至于转发到哪个节点的Pod,由负载均衡kube-proxy决定)

3,k8s中有三类IP地址

  • 1、Node Network(节点网络):物理节点或者虚拟节点的网络,如ens33接口上的网路地址。
  • 2、Pod network(pod 网络),创建的Pod具有的IP地址。
  • 3、Cluster Network(集群地址,也称为service network),这个地址是虚拟的地址(virtual ip),没有配置在某个接口上,只是出现在service的规则当中。

4,常用字段介绍

kubectl explain Service[svc]
# kubectl explain service

apiVersion	<string>      #service资源使用的api组[版本]
kind	    <string>      #创建的资源类型
metadata	<Object>      #定义元数据
spec	    <Object>     
# kubectl explain service.spec

clusterIP	<string>      # 动态分配的地址,也可以自己在创建的时候指定,创建之后就改不了了
ports	    <[]Object>    # 定义service端口,用来和后端pod建立联系
selector	<map[string]string>   # 通过标签选择器选择关联的pod有哪些
sessionAffinityConfig	<Object>
# service在实现负载均衡的时候还支持sessionAffinity,
# sessionAffinity什么意思?会话联系,默认是none,随机调度的(基于iptables规则调度的)。如果我们定义sessionAffinity的client ip,那就表示把来自同一客户端的IP请求调度到同一个pod上。
type	    <string>       # 定义service的类型 ExternalName, ClusterIP(默认), NodePort, LoadBalancer.
# kubectl explain service.spec.type

ExternalName
ClusterIP
NodePort
LoadBalancer # 下面详细介绍
# kubectl explain service.spec.ports

name	    <string>    # 定义端口的名字
nodePort	<integer>   # service在物理机映射的端口,默认在 30000-32767 之间
port	    <integer> -required-  #service的端口,这个是k8s集群内部服务可访问的端口
targetPort	<string>    # targetPort是pod上的端口,从port和nodePort上来的流量,经过kube-proxy流入到后端pod的targetPort上,最后进入容器。 

二,Service四种类型

1,ClusterIP类型

通过集群的内部 IP 公开 Service,选择该值时 Service 只能够在集群内部访问。 这也是你没有为 Service 指定 type 时使用的默认值
你可以使用 Ingress 或者 Gateway API 向公共互联网公开服务。
创建的pod生成的ip地址,被关联的service生成的endpoints资源管理
创建的pod生成的ip地址,被关联的service生成的endpoints资源管理。

说明:

  • k8s集群内的机器或pod,都能访问此service代理的ip或域名;机器外部是不能访问的。
  • 域名格式:[service名.命名空间名.svc.cluster.local]

2,NodePort类型

通过每个节点上的 IP 和静态端口(NodePort)公开 Service。 为了让 Service 可通过节点端口访问,Kubernetes 会为 Service 配置集群 IP 地址, 相当于你请求了 type: ClusterIP 的 Service。
service.yaml

宿主机(物理机)的ip+ 映射端口(30380) 可以直接访问到集群内部pod内容。
在这里插入图片描述
客户端请求http://192.168.40.180:30380 - > docker0虚拟网卡:172.17.0.1:30380 -> 10.244.186.236:80,10.244.140.90:80

3,ExternalName类型

将服务映射到 externalName 字段的内容(例如,映射到主机名 api.foo.bar.example)。 该映射将集群的 DNS 服务器配置为返回具有该外部主机名值的 CNAME 记录。 集群不会为之创建任何类型代理。

应用场景:**跨名称空间访问**。 例如:default名称空间下的client 服务,去访问nginx-ns名称空间下的nginx-svc服务。

在这里插入图片描述

4,LoadBalancer类型

使用云平台的负载均衡器向外部公开 Service。Kubernetes 不直接提供负载均衡组件; 你必须提供一个,或者将你的 Kubernetes 集群与某个云平台集成。

三,Service案例参考

场景:k8s集群引用外部的mysql数据库

【理解】:

Service 在创建时,通过定义“spec.selector”选择器,选择指定标签的pod,从而生成对应的Endpoints资源,来管理选择的pod的ip地址。

现在,我们生成service的时候,不定义“spec.selector”选择器,而是通过定义Endpoints的yaml资源,指定名称和Service名称相同,即可实现关联。与此同时,定义“subsets.addresses.ip和ports”为外部机器的ip和端口,即可实现k8s集群引用外部的服务(如:mysql数据库等)

【操作】

第一步:在node02上安装mysql数据库:

yum install mariadb-server.x86_64 -y
systemctl start mariadb
# 安装完后,直接输入 mysql 进入终端

第二步:在master上,创建service:

因为没定义“spec.selector”选择器,没有选择pod,所以Endpoint 值为none

#cat mysql_service.yaml 

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  type: ClusterIP
  ports:
  - port: 3306

在这里插入图片描述
通过命令,再次验证没有创建对应的Endpoints资源:

kubectl get  ep[Endpoints]

第三步:在master上,直接创建Endpoint资源:

metadata.name的名字,必须对应特定关联的Service的名称相同。

# cat endpoint.yaml 

apiVersion: v1
kind: Endpoints
metadata:
  name: mysql    # 必须对应特定关联的Service的名称
subsets:
- addresses:
  - ip: 192.168.40.182   # 注册的ip地址
  ports:
  - port: 3306    # 注册的端口

在这里插入图片描述
此时,集群可以直接访问外部node02的集群外部服务。

四,CoreDNS

DNS全称是Domain Name System:域名系统,是整个互联网的电话簿。
其实就是一个 DNS 服务,“ 可被人理解的域名 ”翻译成“ 可被机器理解IP地址 ”。

在k8s中创建service之后,service默认的FQDN是:
<service name>.<name space>.svc.cluster.local

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

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

相关文章

nginx启动报错:worker_connections exceed open file resource limit: 1024

一、问题描述 某次&#xff0c;nginx重启报错&#xff1a; nginx: [warn] 4096 worker_connections exceed open file resource limit: 1024&#xff1b;如下所示&#xff1a; 二、处理 1&#xff09;原因&#xff1a;nginx默认最大的并发数为1024&#xff0c;如果你设置work…

IDEA提示:java: 常量字符串过长

大家好&#xff0c;我是瑶山&#xff0c;今天聊聊java执行字符串过长的问题 起因 main方法测试一个上传人脸的请求&#xff0c;人脸图片使用Base64格式字符串&#xff0c;执行失败&#xff0c;提示&#xff1a;java: 常量字符串过长 在Java中&#xff0c;当你在main方法中直接…

Java | Leetcode Java题解之第390题消除游戏

题目&#xff1a; 题解&#xff1a; class Solution {public int lastRemaining(int n) {int a1 1;int k 0, cnt n, step 1;while (cnt > 1) {if (k % 2 0) { // 正向a1 a1 step;} else { // 反向a1 (cnt % 2 0) ? a1 : a1 step;}k;cnt cnt >> 1;step s…

三大CSS特效与灵感宝藏网站:加速前端开发,提升网站视觉盛宴

在日常的Web开发旅程中&#xff0c;前端程序员扮演着至关重要的角色&#xff0c;他们不仅是页面结构的搭建者&#xff0c;更是用户体验的塑造者。随着技术的不断进步&#xff0c;用户对于网页的视觉效果和交互体验要求越来越高&#xff0c;这就要求前端开发者必须掌握更多高级技…

Session钝化与活化:深度解析

Session钝化与活化&#xff1a;深度解析 1、钝化&#xff08;Passivation&#xff09;2、活化&#xff08;Activation&#xff09;3、序列化要求4、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Web开发中&#xff0c;Session扮演着…

自搭靶机实现SSH爆破复现记录

编写脚本实现ssh爆破。可使用paramiko、pexpect、pxssh等Python模块进行编写。但在ssh服务端将配置加密方式为非常用加密方式3des-cbc&#xff0c;端口为9981端口。 创建 了一个新的Kali虚拟机作为靶机&#xff0c;使用原本的Kali作为攻击机。 设置一个用户为target1234&#…

数学建模强化宝典(5)整数规划

前言 整数规划是数学规划中的一种特殊类型&#xff0c;它要求决策变量的取值必须是整数。这种规划问题在实际应用中非常普遍&#xff0c;因为很多决策问题&#xff08;如生产数量、人员分配、车辆调度等&#xff09;的解都必须是整数。整数规划可以分为几类&#xff0c;主要包括…

07:【江科大stm32】:编码器通过定时器测速

编码器通过定时器测速 编码器的转动方向不同&#xff0c;则输出波形的相位也不同。如下图所示&#xff1a; 编码器标准库的编程接口&#xff1a; ①Encoder.c文件的代码如下&#xff1a; #include "stm32f10x.h" // Device header//使用PA6&…

黑马-Cloud21版-实用篇05:分布式搜索引擎02:DSL查询文档、搜索结果处理、RestClient查询文档、黑马旅游案例

分布式搜索引擎02 在昨天的学习中&#xff0c;我们已经导入了大量数据到elasticsearch中&#xff0c;实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以今天&#xff0c;我们研究下elasticsearch的数据搜索功能。我们会分别使用DSL和Res…

[Linux]:基本指令(上)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Linux学习 贝蒂的主页&#xff1a;Betty’s blog 与Windows环境不同&#xff0c;我们在linux环境下需要通过指令进行各操作&…

PHP8、ThinkPHP8框架中间的应用教程详解

前言 虽然PHP的落幕的话题一直不绝&#xff0c;但是实际在WEB端项目中PHP占有率达到了70%以上&#xff0c;一直在WEB一枝独秀&#xff0c;它以快速、高效的开发闻名&#xff0c;出圈了几十年&#xff0c;等待只是下一次的涅槃。而经过PHP8、PHP9的演变发展&#xff0c;PHP逐渐…

微软最新轻量级、多模态Phi-3.5-vision-instruct模型部署

Phi-3.5-vision-instruct是微软最新发布的 Phi-3.5 系列中的一个AI模型&#xff0c;专注于多模态任务处理&#xff0c;尤其是视觉推理方面的能力。 Phi-3.5-vision-instruct模型具备广泛的图像理解、光学字符识别&#xff08;OCR&#xff09;、图表和表格解析、多图像或视频剪…

【STM32】通用定时器TIM(输入捕获)

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 前言 输入捕获简介 输入捕获配置 初始化IO口 输入捕获初始化 选择触发源及从模式 测量频率方法 输入捕获代码 IC.h IC.c 输入捕获测占空比 前言 建议先阅读这篇博客&#xf…

Open3D mesh 均值滤波

Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博客 一、概述 均值滤波&#xff08;Mean Filtering&#xff09;是一种基本的网格平滑技术&#xff0c;通过将每个顶点的位置替换为其邻域…

[ABC369C] Count Arithmetic Subarrays

首先看了下题意 大致题意就是让你在长度为的序列找出所有的等差数列。 -----------------------------------------------------------------------------------------我是分界线 我的思路了&#xff0c;就是先从2开始计算等差数列&#xff0c;从3开始判断&#xff0c;如果是…

C#从入门到精通(21)—Mutex互斥锁在多线程、多进程下的使用

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff01;人工智能学习网站 前言&#xff1a; 大家好&#xff0c;我是上位机马工&#xff0c;硕士毕业4年年入40万&#xff0c;目前在一家自动化公司担任…

C语言调用子函数时入/出栈(保护/恢复现场)全过程分析:以Cortex-M3为例

0 参考资料&工具 Cortex M3权威指南(中文).pdf keil5&#xff08;用于仿真查看寄存器、栈变化&#xff09;1 C语言调用子函数时出入/出栈&#xff08;保护/恢复现场&#xff09;全过程分析 使用C语言调用子函数是如何保护/恢复现场的呢&#xff1f;本文以Cortex-M3为例&a…

Zynq之IIC使用示例

前言 明确设计思路&#xff0c;精准定位问题&#xff0c;对于我们后期理解迭代工程有很大的帮助。 这就是我们常说的40%设计&#xff0c;20%编写和剩下的40%时间进行调试优化。 今天为大家带来的是Zynq-PS端的IIC使用demo&#xff0c;通过驱动外设DS1337来强化对IIC的使用方…

【C++二分查找 贪心】1552. 两球之间的磁力

本文涉及的基础知识点 C二分查找 贪心&#xff1a;决策兼容性 LeetCode1552. 两球之间的磁力 在代号为 C-137 的地球上&#xff0c;Rick 发现如果他将两个球放在他新发明的篮子里&#xff0c;它们之间会形成特殊形式的磁力。Rick 有 n 个空的篮子&#xff0c;第 i 个篮子的位…

百日草花语探秘:天长地久的情感寄托与丰富内涵解析

百日草宛如一颗璀璨的明珠&#xff0c;散发着独特的魅力。它那鲜艳夺目的花朵&#xff0c;仿佛是大自然用最细腻的笔触勾勒而成&#xff0c;每一朵都蕴含着无尽的奥秘与情感。当我们漫步于花海之间&#xff0c;不经意间与百日草相遇&#xff0c;那绚烂的色彩和别致的形态定会让…