【kubernetes】Service 介绍和应用

2024-09-02 00:04

本文主要是介绍【kubernetes】Service 介绍和应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一,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 serviceapiVersion	<string>      #service资源使用的api组[版本]
kind	    <string>      #创建的资源类型
metadata	<Object>      #定义元数据
spec	    <Object>     
# kubectl explain service.specclusterIP	<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.typeExternalName
ClusterIP
NodePort
LoadBalancer # 下面详细介绍
# kubectl explain service.spec.portsname	    <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: ClusterIPports:- 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

这篇关于【kubernetes】Service 介绍和应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128422

相关文章

Spring Boot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)

《SpringBoot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)》本文将以一个实际案例(用户管理系统)为例,详细解析SpringBoot中Co... 目录引言:为什么学习Spring Boot分层架构?第一部分:Spring Boot的整体架构1.1

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库