(七)K8S核心资源Service

news/2024/4/15 15:11:17

1.什么是service服务

Service

Kubernetes(K8s)中的Service是一种抽象,用于定义一组Pod的访问方式和网络规则。它提供了一个稳定的网络终结点,使得应用程序能够通过Service名称来访问后端的Pod实例。

Service为一组具有相同功能的Pod提供了一个统一的入口,隐藏了Pod背后的具体细节。通过Service,应用程序可以使用DNS名称或Cluster IP来访问后端Pod,而不需要直接暴露Pod的IP地址。这样,当Pod的IP地址发生变化时,应用程序仍然可以通过Service来访问后端的Pod。

Service还支持负载均衡,可以将请求均匀地分发到后端的多个Pod实例,从而实现高可用和水平扩展。它可以根据不同的负载均衡策略(如轮询、IP哈希等)将请求路由到不同的Pod。

Kubernetes中有多种类型的Service,包括ClusterIP、NodePort和LoadBalancer。每种类型都提供了不同的访问方式和网络配置,以满足不同的应用需求。

总之,Kubernetes的Service是一种抽象层,用于定义和管理应用程序的网络访问方式,并提供负载均衡和稳定的网络终结点。它是构建在Pod之上的一种网络抽象,为应用程序提供了方便的访问和可扩展性。

Service分类

  • ClusterIP 是默认类型的Service,它将Service暴露在集群内部的虚拟IP上。其他Pod或Service可以通过该虚拟IP和指定的端口与Service进行通信。ClusterIP类型的Service仅在集群内部可访问,对外部网络是不可见的。
  • NodePort 对外访问应用使用,在ClusterIP基础上为Service在每台机器上绑定一个端口,就可以通过: ip+NodePort来访问该服务
  • LoadBalancer(付费方案) 使在NodePort的基础上,借助公有云创建一个外部负载均衡器,并将请求转发到NodePort
    可以实现集群外部访问服务的另外一种解决方案,不过并不是所有的k8s集群都会支持,大多是在公有云托管集群中会支持该类型
  • ExternalName(很少使用)把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有 Kubernetes 1.7或更高版本的kube-dns才支持。

Service和pod的关系

service和pod之间是通过 selector.app进行关联的

yaml示例:

apiVersion: v1
kind: Service
metadata:creationTimestamp: nullname: svc
spec:ports:- port: 80  # service服务端口protocol: TCPtargetPort: 80 # pod端口,常规和容器内部端口一致selector: # 标签选择器,确定当前service代理控制哪些podapp: nginx-pod
status:loadBalancer: {}

2.多种port端口区分

关于K8S中端口的概念区分

  • port 是service端口,即k8s中服务之间的访问端口 ,clusterIP:port 是提供给集群内部客户访问service的入口
  • nodePort 容器所在node节点的端口,通过nodeport类型的service暴露给集群节点,外部可以访问的端口
  • targetPort 是pod的端口 ,从port和nodePort来的流量经过kube-proxy流入到后端pod的targetPort上,最后进入容器。
  • containerPort 是pod内部容器的端口,targetPort映射到containerPort。

总结:

  • 4种端口作用不一样,port和nodePort都是service的端口
  • port暴露给集群内客户访问服务,nodePort暴露给集群外客户访问服务
  • 这两个端口到来的数据都需要经过反向代理kube-proxy流入后端pod的targetPod,从而到达pod中的容器

yaml示例;

apiVersion: v1
kind: Pod
metadata:name: nginxnamespace: devlabels:app: nginx
spec:containers:- name: nginximage: nginx:1.20imagePullPolicy: IfNotPresentports:- containerPort: 80 #容器端口,不指定则为默认
---
apiVersion: apps/v1
kind: Service
metadata:name: nginx
spec:type: NodePort # 有配置NodePort,外部可访问k8s中的服务 ,ports:- name: nginxport: 80  # 服务service的访问端口protocol: TCPtargetPort: 80  # pod端口,映射到容器端口nodePort: 30015  # NodePort,通过nodeport类型的service暴露给集群外部访问selector:app: nginx

3.K8S服务Service的ClusterIP

在Kubernetes中使用ClusterIP类型的Service非常简单。你可以按照以下步骤进行操作:
1.创建一个Service的定义文件(YAML格式),指定Service的名称、选择器、端口等信息。以下是一个示例

apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: my-appports:- name: httpport: 80targetPort: 8080

2.使用kubectl命令创建Service:

kubectl apply -f service-definition.yaml

3.等待Service创建成功。你可以使用以下命令来检查Service的状态:

kubectl get service my-service

通过Service的ClusterIP来访问相关的Pod。在集群内部,你可以使用Service的ClusterIP作为访问目标,而不需要直接暴露Pod的IP地址。
例如,在同一命名空间内的Pod中,你可以使用Service的ClusterIP来访问其他Pod,如下所示:

curl <cluster-ip>:<port>

请将<cluster-ip>和<port>替换为实际的Service的ClusterIP和端口。
注意:ClusterIP类型的Service默认只在集群内部可用,无法从集群外部访问。如果你需要从集群外部访问Service,可以考虑使用其他类型的Service,如NodePort或LoadBalancer。

4.K8S服务Service的NodePort和EndPoint

NodePort

NodePort是Kubernetes中一种类型的Service,它允许通过集群节点的特定端口将流量转发到Service中的Pod。

1.NodePort是Service的一种类型,它公开了一个固定的端口(NodePort),并将流量转发到Service中定义的端口(TargetPort)。

2.当创建一个NodePort类型的Service时,Kubernetes会为每个节点分配一个随机的端口号(30000-32767范围),并将此端口映射到Service的TargetPort。

3.NodePort类型的Service可以从集群外部访问。通过访问集群的任何节点的IP地址和NodePort端口,可以将流量转发到Service中的Pod。

4.创建NodePort类型的Service的示例定义文件如下:

apiVersion: v1
kind: Service
metadata:name: my-service
spec:type: NodePortselector:app: my-appports:- name: httpport: 80targetPort: 8080nodePort: 30080

上述示例中的nodePort字段指定了NodePort的端口号为30080。

5.使用kubectl命令创建NodePort类型的Service:

kubectl apply -f service-definition.yaml

6.从集群外部访问NodePort类型的Service时,可以使用任何节点的IP地址和指定的NodePort端口。例如:

curl <node-ip>:<node-port>

请注意,NodePort类型的Service通常用于测试或开发环境,并不适合在生产环境中直接使用。在生产环境中,建议使用LoadBalancer类型的Service或使用Ingress控制器来实现更灵活和可靠的流量管理。

Endpoint(ep)

1.是k8s中的一个资源对象,存储在etcd(存储数据库)中,记录service对应的所有pod的访问地址
2.里面有个Endpoints列表,就是当前service可以负载到的pod服务入口
3.service和pod之间的通信是通过endpoint实现的
4.查看endpoint列表 kubectl get ep svc-nodeport-nginx1 -n dev -o wide

kubernetes提供了两种负载均衡策略

  • Round Robin(轮询):在轮询负载均衡策略下,每个请求按照顺序依次分发到后端的Pod。当有多个后端Pod时,每个请求会按照轮询的方式依次发送到不同的Pod上,确保每个Pod都能平均地处理请求。

  • Session Affinity(会话亲和):在会话亲和负载均衡策略下,Kubernetes会根据客户端的源IP地址将一段时间内的请求路由到同一个后端Pod上。这样做的目的是为了保持与同一客户端的会话连续性,确保客户端在同一个Pod上处理的请求都属于同一个会话。

这两种负载均衡策略可以在Service的配置中进行指定。对于Round Robin策略,可以将Service的.spec.sessionAffinity字段设置为None(默认值),表示不启用会话亲和;对于Session Affinity策略,可以将.spec.sessionAffinity字段设置为ClientIP,表示根据客户端的源IP地址进行会话亲和。


http://www.ppmy.cn/news/89634.html

相关文章

Ubuntu 20.04 安装VNC Server的简单教程

1.确保安装了GNOME桌面 桌面版默认就已安装&#xff0c;服务器版需要手动安装&#xff0c;并启动 # apt install ubuntu-gnome-desktop# systemctl set-default multi-user.target$ startx 2.安装VNC 不要安装tigervncserver 要安装这个 standalone的&#xff0c;会有一点…

​Lambda表达式详解​-初遇者-很细

目录 Lambda简介 对接口的要求 Lambda 基础语法 Lambda 语法简化 Lambda 表达式常用示例 lambda 表达式引用方法 构造方法的引用 lambda 表达式创建线程 遍历集合 删除集合中的某个元素 集合内元素的排序 Lambda 表达式中的闭包问题 Lambda简介 Lambda 表达式是 JD…

详解Java项目安全方向解决方案

Java作为一种广泛使用的编程语言&#xff0c;广泛应用于各种企业级应用程序的开发中。但是&#xff0c;Java应用程序被黑客攻击是一种常见现象&#xff0c;因此保障Java应用程序的安全至关重要。 在Java项目开发中&#xff0c;安全方向主要包括以下几个方面&#xff1a;认证、…

C#使用HTTP发送POST Params传参值为Json字符串解决

Post&#xff1a;方法 public static string Post(string url, Dictionary<string, string> dic) { string tempMessage ""; System.Net.WebClient WebClientObj new System.Net.WebClient(); System.Collectio…

VR全景智慧城市:构筑未来城市的数字化大融合

引言&#xff1a; 现代城市正处于数字化时代的浪潮之中&#xff0c;而在这个数字化浪潮中&#xff0c;VR全景智慧城市正以令人瞩目的方式崭露头角。随着虚拟现实&#xff08;VR&#xff09;技术的不断进步和智慧城市的发展需求&#xff0c;VR全景智慧城市作为数字技术与城市发展…

【TI毫米波雷达笔记】IWR6843AOPEVM-G+DCA1000EVM的mmWave Studio数据读取、配置及避坑

【TI毫米波雷达笔记】IWR6843AOPEVM-GDCA1000EVM的mmWave Studio数据读取、配置及避坑 硬件方面连接好以后 就可以打开mmWave Studio了 配置 如果硬件配置成功 则可以通过mmWave Studio的Output看到配置信息 按照如图步骤 在radar api里面一步步来操作 其中 RS232选择波特率…

国家信息安全测评信息安全服务资质证书(安全工程类一级)申请条件

中国信息安全测评中心&#xff08;以下简称CNITSEC&#xff09;是经中央批准成立的国家信息安全权威测评机构&#xff0c;职能是开展信息安全漏洞分析和风险评估工作&#xff0c;对信息技术产品、信息系统和工程的安全性进行测试与评估。对信息安全服务和人员的资质进行审核与评…

内网渗透(八十)之搭建额外域控

搭建额外域控 我们在之前搭建完成Windows Server 2012 R2 域控的基础上搭建一个额外的域控。多个域控的好处在于,当其中有域控出现了故障,仍然能够由其他域控来提供服务。选择一台Windows Server 2012 R2 服务器作为额外域控,主机名为DC2. 首先在DC2上配置IP地址为192.168…

【Lychee图床】本地电脑搭建私人图床,公网远程访问

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 转发自CSDN风浪越大%鱼越贵的文章&#xff1a;Lychee图床 - 本地配置属于自己的相册管理系统并远…

Spring源码阅读:Spring事务传播特性

一、概述 我们平常工作中经常会听到事务的传播级别&#xff0c;但是使用中基本不会太调整这个事务传播级别&#xff0c;因为没什么业务场景需要我们这么做&#xff0c;只需要使用原有的事务传播级别即可解决95%的业务场景。但是为了那5%的业务场景&#xff0c;我们还是还要学习…

开发小程序流程

小程序的诞生&#xff0c;是继微信公众号之后的又一款火爆的 APP&#xff0c;并且小程序的市场需求也是非常大的。在小程序出现后&#xff0c;很多商家都想开发自己的小程序&#xff0c;但是因为不知道怎么开发&#xff0c;所以对此感到迷茫。下面就由爱尚网络科技来为大家介绍…

java urlencode() javaurlencode转utf

Java中URL传中文时乱码的问题相信不少朋友都遇到过&#xff0c;最近就遇到一个问题&#xff0c;就是在Action当中把一条中文信息绑定在URL的后面&#xff0c;ActionForward到别一个页面时&#xff0c;用reqeust.getParameter取出是出现乱码的问题。 解决办法&#xff1a; 1、…

淘宝层级改版,五力模型上线!

最近临近618&#xff0c;淘系又各种功能改版&#xff0c;现在店铺层级也开始陆续改版了。从原来的只需要提升销售金额&#xff0c;到现在的五力模型。我们先说一下原来的店铺层级考核&#xff0c;跟现在的区别主要是哪&#xff1f; 1.原来店铺层级的考核升级特别简单&#xff0…

微信删除的好友如何找回来

微信是一个广泛使用的社交媒体平台&#xff0c;它允许用户发送消息、共享照片、视频、音频和文件&#xff0c;以及查找新朋友。但有时候&#xff0c;如果你不小心从你的微信好友列表中删除了某个好友&#xff0c;这可能是因为误操作或者其他原因。在这种情况下&#xff0c;你肯…

【C++学习】异常

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《C学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 异常 &#x1f96e;异常&#x1f362;自定义异常体系&#x1f362;C标准库的异常体系&#x1f362;异…

分享Python采集99个焦点图,总有一款适合您

分享Python采集99个焦点图&#xff0c;总有一款适合您 Python采集的99个焦点图下载链接&#xff1a;https://pan.baidu.com/s/1887LXr2ovCAw-Bp7PuM66g?pwdbyx4 提取码&#xff1a;byx4 原创Jquery焦点图片切换效果 自定义大小&#xff0c;使用方 jquery立体式缩略图焦点图…

CSS样式的三种引入方式及优先级

说明&#xff1a;网页开发有三种技术&#xff0c;分别是html、css和js&#xff0c;分别对应页面的结构、表现和动作。css样式引入&#xff0c;是指把对页面的渲染作用到html上&#xff0c;有以下三种方式&#xff1a;行内式、内嵌式和外联式。 第一种&#xff1a;行内式&#…

每日站会: 保持简短而有效的方法

开发团队对每天的站立会并不陌生。它们在增加协作和可见性方面的成功&#xff0c;促使它们在不同类型的团队和项目中被采用。团队每天都要召开一次站立会&#xff0c;开发人员和其他团队成员将工作目标积极主动地与项目和交付目标保持一致&#xff0c;与团队分享进展情况&#…

剑指offer -- 二维数组中的查找

二维数组中的查找_牛客题霸_牛客网 (nowcoder.com) 暴力查找法: 是一种简单直接的解决方法&#xff0c;可以用于在二维数组中查找目标值。该方法的思路是遍历数组的每个元素&#xff0c;逐个与目标值进行比较。 具体步骤如下&#xff1a; 从数组的第一行第一列开始&#xff0c;…

4、详细版易学版TypeScript - 元组 枚举

一、元组(Tuple) 数组&#xff1a;合并了相同类型的对象 const myArr: Array<number> [1, 2, 3]; 元组(Tuple)&#xff1a;合并了不同类型的对象 // 定义元组时就要确定好数据的类型&#xff0c;并一一对应 const tuple: [number, string] [12, "hi"]; // 添…
最新文章