k8s基础(4)—Kubernetes-Service

news2025/1/8 0:05:58

Service概述

抽象层

‌k8s的Service是一种抽象层,用于为一组具有相同功能的Pod提供一个统一的入口地址,并通过负载均衡将网络流量分发到这些Pod上。‌ Service解决了Pod动态变化的问题,例如Pod的IP地址和端口可能会发生变化,通过Service可以提供稳定的访问地址和负载均衡功能,从而屏蔽后端Endpoint的变化。‌

Service的作用

‌服务发现‌:Service通过标签选择器(Label Selector)与Pod关联,提供稳定的访问地址,即使Pod的IP地址发生变化,客户端仍然可以通过Service访问到服务。

‌负载均衡‌:Service可以将网络流量分发到后端的多个Pod上,提供负载均衡的功能,确保服务的可用性和扩展性。

‌抽象层‌:Service提供了一种抽象层,使得客户端不需要关心具体的Pod细节,只需要通过Service的地址进行访问。

Service的类型

k8s中的Service有四种类型:

ClusterIP‌:默认类型,为集群内部提供一个虚拟IP,只能在集群内部访问。

‌NodePort‌:在每台机器上绑定一个端口,可以通过NodeIP来访问该服务。

‌LoadBalancer‌:在NodePort的基础上,创建一个外部负载均衡器,将请求转发到NodeIP。

‌ExternalName‌:将集群外部的服务引入到集群内部,直接使用外部服务的名称,没有任何代理被创建。

Service的工作原理

在k8s集群中,每个Node运行一个kube-proxy进程,负责为Service实现虚拟IP(VIP)的形式。从k8s v1.2版本起,默认使用Iptables代理模式,从v1.8.0-beta.0版本开始,添加了ipvs代理模式。

一、ClusterIP‌

ClusterIP‌:默认类型,为集群内部提供一个虚拟IP,只能在集群内部访问。

实验背景

启动3个nginx pod 每一个节点的nginx配置相关的访问信息

pod1——> web1

pod2——> web2

pod3 ——> web3

修改nginx的访问页面

方便区分service是否实现了负载均衡

pod2、pod3按照上边的操作步骤进行。

测试查看了配置是否生效

访问pod节点IP,检查配置是否成功。

1、使用命令行进行操作

#给nginx02工作负载节点暴露端口8080指向后端的80端口
kubectl expose deploy nginx02 --port=8080 --target-port=80

#查看service产生的虚拟IP
kubectl get service

#删除service命令
kubectl delete service nginx02

#查看每组pod的标签
kubectl get pods --show-labels

1.1 负载均衡测试
crul 192.168.72.130:8080

2、使用yaml文件进行操作

apiVersion: v1
kind: Service
metadata:
  labels:
    run: nginx02
  name: nginx02
spec:
  selector:
    app: nginx02
  ports:
    - port: 8080
      protocol: TCP
      targetPort: 80

3、使用Service产生的虚拟IP进行访问

#在服务器上进行查看产生的虚拟IP信息
kubectl get service

4、通过域名进行访问

命名的规则是: 服务名.所在名称空间.scv

如:上述实验对应的域名为: nginx02.default.svc

curl nginx02.default.svc:8080

不过此方法仅限于在运行的容器pod中进行,如果在外部无法访问

在pod中访问成功

二、NodeIP

NodePort‌:在每台机器上绑定一个端口,可以通过NodeIP来访问该服务。

NodePort会随机在每个pod之间生成一个端口范围在30000-32767之间。

1、使用命令行创建NodeIP

 #创建NodePort类型的service
 kubectl expose deploy nginx02 --port=8080 --target-port=80 --type=NodePort
 
 #查看service端口对应的真实主机映射的端口是多少
 kubectl get service

2、通过NodePort暴露的端口访问到集群

在上一步骤中得知对外暴露的端口为32361,在浏览器上输出真实主机IP:端口进行访问。

三、ExternalName

ExtenlName:将服务通过DNS CNAME 记录方式转发到指定的域名

在访问的时候service过程如下:

client ——> test.domain.org (service) ——> pod(n) 直接用ip访问应用里边的地址可能会改变

1、创建externalName

[root@master test]# vim ex-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx02
spec:
  type: ExternalName
  externalName: test.domain.org

2、安装域名测试工具

sudo yum install bind-utils -y

3、测试验证

[kubeadm@server1 ~]$ sudo yum install bind-utils -y     ##安装测试软件
 
[kubeadm@server1 ~]$ kubectl get svc -n kube-system     ##查看dns 对应的ClusterIP 
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   8d
[kubeadm@server1 ~]$
[kubeadm@server1 ~]$
[kubeadm@server1 ~]$ dig -t A test.domain.org @10.96.0.10      ##测试 
 
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> -t A test.westos.ortg @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 23243
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
 
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;test.westos.ortg.        IN    A
 
;; Query time: 1255 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Mon Mar 02 09:35:40 EST 2020
;; MSG SIZE  rcvd: 45
 
[kubeadm@server1 ~]$
 
[kubeadm@server1 ~]$ kubectl describe svc nginx02
Name:              my-nginx
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          <none>
Type:              ExternalName
IP:                
External Name:     test.domain.org
Session Affinity:  None
Events:            <none>
[kubeadm@server1 ~]$

四、LoadBalancer

从外部访问的Service的第二种方式 是用于共有云上的Kubernetes服务,这时候,可以指定一个LoadBalancer类型的Service。

在service提交后,Kubernetes就会调用CloudProvider 在共有云上 你可以创建一个负载均衡服务,并且把代理的pod的IP 地址配置给负载均衡服务做后缀。(共有云、阿里云、亚马逊)。

在外部的公有云上才可以创建 (因为要收费)

五、创建一个对外访问的指定IP和端口

1、创建Service

#执行yaml文件
[root@master test]# cat exposeIpService-2.yaml

apiVersion: v1                  ##版本
kind: Service                   ##类型
metadata:
  name: nginx02                 ##名称
spec:
  ports:
    - name: nginx02             ##端口服务名称
      port: 8080                ##外部访问的端口号
      targetPort: 80            ##转发的端口号
  selector:
      app: nginx02
  externalIPs:
    - 192.168.72.133             ##创建一个供外部访问的共有ip
 
[root@master test]# kubectl get service      #查看service是否创建成功
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP      PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1       <none>           443/TCP    10d
nginx02      ClusterIP   10.96.103.205   192.168.72.133   8080/TCP   8m38s

2、访问测试

六、服务发现机制验证

1、将缩容节点从负载均衡中剔除

将一个pod节点缩容后,再重新扩容到之前的副本数,通过Service可以访问到新扩容节点的信息。

2、将扩容节点添加到负载均衡中

对节点进行扩容之后,Service能够发现并将扩容的pod节点重新加入集群中,此时访问会出现web1、web2和nginx的原始页面信息,因为web3在上一步骤的缩容中已经被删除,重新扩容之后为新节点的信息。

七、开启kube-proxy的IPVS模式 

1、为什么要使用IPVS代替iptables

IPVS和iptables对比说明

service代理默认使用iptables规则通过内核模块netfilter实现流量转发,内核转发效率高,但是iptables不具备更为灵活的负载均衡策略,只是将流量随意的转发至后端Pod,当Pod不可用时也无法进行健康检查;就以下是将默认流量转发修改为ipvs。

kubernetes自1.8版本开始强推ipvs,之前版本默认使用iptables,是比较古老的一种网络模式。

ipvs采用的hash表,iptables采用一条条的规则列表。集群数量越多iptables规则就越多,而 iptables规则是从上到下匹配,所以效率就越是低下。因此当service数量达到一定规模时,hash查表的速度优势就会显现出来,从而提高service的服务性能。

kubernetes在版本v1.6中已经支持5000个节点,但使用iptables 的 kube-proxy 实际上是将集群扩展到5000个节点的瓶颈。 在5000节点集群中使用 NodePort 服务,如果有2000个服务并且每个服务有10个 pod,这将在每个工作节点上至少产生20000个iptable 记录,这可能使内核非常繁忙。因此,如果是大集群的话,iptables可能会造成集群崩溃。

IPVS模式与iptables同样基于Netfilter,作为linux内核的一部分实现传输层负载均衡的技术,通常称为第4层LAN交换。但是ipvs采用的hash表(性能更加高效),Iptables采用一条条的规则列表。

iptables 模式

iptables 是一个 Linux 内核功能,是一个高效的防火墙,并提供了大量的数据包处理和过滤方面的能力。它可以在核心数据包处理管线上用 Hook 挂接一系列的规则。iptables 模式中 kube-proxy 在 NAT pre-routing Hook 中实现它的 NAT 和负载均衡功能。这种方法简单有效,依赖于成熟的内核功能,并且能够和其它跟 iptables 协作的应用(例如 Calico)融洽相处。

然而 kube-proxy 的用法是一种 O(n) 算法,其中的 n 随集群规模同步增长,这里的集群规模,更明确的说就是服务和后端 Pod 的数量。

IPVS 模式

IPVS 是一个用于负载均衡的 Linux 内核功能。IPVS 模式下,kube-proxy 使用 IPVS 负载均衡代替了 iptable。这种模式同样有效,IPVS 的设计就是用来为大量服务进行负载均衡的,它有一套优化过的 API,使用优化的查找算法,而不是简单的从列表中查找规则。

这样一来,kube-proxy 在 IPVS 模式下,其连接过程的复杂度为 0。换句话说,多数情况下,他的连接处理效率是和集群规模无关的。

另外作为一个独立的负载均衡器,IPVS 包含了多种不同的负载均衡算法,例如轮询、最短期望延迟、最少连接以及各种哈希方法等。而 iptables 就只有一种随机平等的选择算法。

IPVS 的一个潜在缺点就是,IPVS 处理数据包的路径和通常情况下 iptables 过滤器的路径是不同的。如果计划在有其他程序使用 iptables 的环境中使用 IPVS,需要进行一些研究,看看他们是否能够协调工作。(Calico 已经和 IPVS kube-proxy 兼容)

2、安装ipvsadm服务

各个节点上的内核一定要装有ip_vs_rr 这是ipvsadm生效的前提

 #查看内核是否已经安装ip_vs_rr
 lsmod | grep ip_vs
 
 #安装ipvsadm服务
 yum install ipvsadm -y

3、开启kube-proxy 的povs模式

#查看IPVS中是否有策略
ipvsadm -ln

#开启kube-proxy的povs模式
kubectl -n kube-system edit cm kube-proxy      ##改为IPVS mode"ipvs"

#查看是否已经更新
kubectl get pod -n kube-system -o wide | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'

#查看更新是否成功
kubectl get pod -n kube-system -o wide -w

4、验证IPVS策略是否生效

开启firewalld防火墙服务iptables策略失效,此时可以对集群的pod进行扩容,如果能够正常扩容说明IPVS已经生效。

#将之前的2个副本扩容到5个
kubectl scale deploy/nginx02 --replicas=5

八、VIP 和 Service 代理的区别

VIP和Kubernetes Service代理的区别主要体现在定义、功能、实现方式以及应用场景等方面。‌

定义和功能

‌VIP(虚拟IP)‌:VIP是一个全局唯一的虚拟IP地址,用于集群内部服务的访问。它不是一个物理IP地址,而是通过负载均衡器或DNS解析来指向实际的物理服务器或服务实例。VIP通常用于实现高可用性和负载均衡,确保服务故障时的自动切换。

‌Kubernetes Service‌:Kubernetes Service定义了一个服务的访问入口地址,前端应用通过这个入口地址访问其背后的一组由Pod副本组成的集群实例。Service通过Label Selector与后端Pod副本集群对接,实现负载均衡和会话保持机制。Service不是共用一个负载均衡器的IP,而是被分配了一个全局唯一的虚拟IP地址,称为Cluster IP‌。

实现方式

‌VIP‌:通常通过硬件负载均衡器或软件负载均衡器来实现,如F5 BIG-IP或Keepalived等。这些工具负责将VIP指向实际的服务器或服务实例,实现高可用和负载均衡。

‌Kubernetes Service‌:Kubernetes通过kube-proxy进程实现Service代理。kube-proxy运行在每个Node上,负责将请求转发到后端的Pod实例。Kubernetes支持多种代理模式,包括iptables和ipvs等,具体使用哪种模式取决于Kubernetes的版本和配置‌。

应用场景

‌VIP‌:适用于需要高可用性和负载均衡的场景,如数据库、Web服务器等关键服务。VIP确保在服务故障时能够快速切换到备用服务器,减少服务中断时间。

‌Kubernetes Service‌:适用于微服务架构中的应用,通过Service抽象服务访问入口,简化应用部署和维护。

在 Kubernetes 集群中,每个 Node 运行一个 kube-proxy 进程。kube-proxy 负责为 Service 实现了一种 VIP(虚拟 IP)的形式,而不是 ExternalName 的形式。

参考资料:

参考资料:k8s Service 服务 - misakivv - 博客园

IPVS配置参考文档:Kubernetes 当中启用IPVS模式_kubernetes ipvs-CSDN博客

更详细信息可参考之前写的博客:k8s(6)——— service详解_qmfjs-CSDN博客

官网信息:https://kubernetes.io/zh-cn/docs/concepts/services-networking

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

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

相关文章

客户案例:基于慧集通(DataLinkX)集成平台的金蝶云星空公有云与WMS系统对接集成方案

本文档详细介绍了基于慧集通&#xff08;DataLinkX&#xff09;集成平台的金蝶云星空公有云与WMS系统对接集成方案。该方案旨在实现金蝶云星空与WMS系统之间的数据同步和流程对接&#xff0c;以提高企业供应链管理的效率和准确性。通过物料、供应商资料同步&#xff0c;采购、销…

jenkins入门4 --window执行execute shell

1、启动关闭jenkins 在Windows环境下&#xff0c;如果你需要关闭Jenkins服务&#xff0c;可以通过以下几种方式&#xff1a; 1、使用Windows服务管理器&#xff1a; 打开“运行”对话框&#xff08;Win R&#xff09;&#xff0c;输入services.msc&#xff0c;然后回车。 在服…

ZYNQ初识7(zynq_7010)RAM_IP核

学习汇总正点原子bi站教学视频。但由于目前的学习板PL端缺乏时钟晶振&#xff0c;所以需要从PS端调用时钟供给PL端使用&#xff0c;也就造成顶层文件的设置出现一些问题&#xff0c;在IP核创建调用和例化过程中一些功能会受到限制&#xff0c;所以以下仅作汇总参考。 zynq_7000…

LeetCode:98.验证二叉搜索树

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;98.验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 …

Golang:使用minio替代文件系统实战教程

本文讨论项目开发中直接文件系统的限制或不足&#xff0c;接着介绍Minio对象存储的优势。同时给出Golang的实际示例代码&#xff0c;包括初始化客户端、读取minio对象以及设置过期策略等。 文件系统 vs Minio 在开发的早期阶段&#xff0c;常见的做法是使用文件系统来存储和检…

拥抱时代--AI(3)

python语言为了研究机器学习专门发展起来一套框架&#xff0c;并且这个框架是开源的&#xff0c;它就是scikit-learn。它主要实现数据预处理&#xff0c;分类&#xff0c;回归&#xff0c;降维&#xff0c;模型选择等最常用的机器学习算法。 在使用scikit-learn之前&#xff0…

实现多账户cursor限制的免费使用

目录 前言 个人建议&#xff1a; 准备工作 下载&#xff1a; 打开cursor&#xff1a; 打开下载文件目录&#xff1a…

OpenCV计算机视觉 05 图像边缘检测(Sobel算子、Scharr算子、Laplacian算子、Canny边缘检测)

图像边缘检测 边缘检测是图形图像处理、计算机视觉和机器视觉中的一个基本工具&#xff0c;通常用于特征提取和特征检测&#xff0c;旨在检测一张数字图像中有明显变化的边缘或者不连续的区域。 yuancv2.imread(yuan.png) cv2.imshow(yuan,yuan) cv2.waitKey(0) yuan_xcv2.Sob…

2025年1月4日蜻蜓q旗舰版st完整开源·包含前后端所有源文件·开源可商用可二开·优雅草科技·优雅草kir|优雅草星星|优雅草银满|优雅草undefined

2025年1月4日蜻蜓q旗舰版st完整开源包含前后端所有源文件开源可商用可二开优雅草科技优雅草kir|优雅草星星|优雅草银满|优雅草undefined 产品介绍&#xff1a; 本产品主要贡献者优雅草科技优雅草kir|优雅草星星|优雅草银满|优雅草undefined-青史留名&#xff0c;时光如川浪淘…

n8n - AI自动化工作流

文章目录 一、关于 n8n关键能力n8n 是什么意思 二、快速上手 一、关于 n8n n8n是一个具有原生AI功能的工作流自动化平台&#xff0c;它为技术团队提供了代码的灵活性和无代码的速度。凭借400多种集成、原生人工智能功能和公平代码许可证&#xff0c;n8n可让您构建强大的自动化…

cursor 使用技巧

一、创建项目前期步骤 1.先给AI设定一个对应项目经理角色&#xff0c; 2.然后跟AI沟通项目功能&#xff0c;生成功能设计文件&#xff1a;README.md README.md项目功能 3.再让AI总结写出开发项目规则文件&#xff1a; .cursorrules 是技术栈进行限定&#xff0c;比如使用什…

xinput1_3.dll丢失修复方法。方法1-方法6

总结 xinput1_3.dll的核心作用 xinput1_3.dll作为Microsoft DirectX库的关键组件&#xff0c;对于游戏控制器的支持起着至关重要的作用。它不仅提供了设备兼容性、多控制器管理和反馈机制等核心功能&#xff0c;还通过XInput API简化了开发人员对控制器状态的检索和设备特性的…

【C++】P2550 [AHOI2001] 彩票摇奖

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式&#xff1a;输出格式&#xff1a;输入输出样例&#xff1a; &#x1f4af;题解思路1. 问题解析 &#x1f4af;我的实现实现逻辑问题分析 &#x1f4af;老…

01:C语言的本质

C语言的本质 1、ARM架构与汇编2、局部变量初始化与空间分配2.1、局部变量的初始化2.1、局部变量数组初始化 3、全局变量/静态变量初始化化与空间分配4、堆空间 1、ARM架构与汇编 ARM简要架构如下&#xff1a;CPU&#xff0c;ARM(能读能写)&#xff0c;Flash&#xff08;能读&a…

8086汇编(16位汇编)学习笔记10.寄存器总结

8086汇编(16位汇编)学习笔记10.寄存器总结-C/C基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net 寄存器 8086CPU有14个寄存器 它们的名称为&#xff1a; AX、BX、CX、DX、SI、DI、SP、BP、 IP**、CS、DS、ES、**SS、PSW。 8086CPU所有的寄存器都是16位的&#…

如何在 Ubuntu 22.04 上安装 Cassandra NoSQL 数据库教程

简介 本教程将向你介绍如何在 Ubuntu 22.04 上安装 Cassandra NoSQL 数据库。 Apache Cassandra 是一个分布式的 NoSQL 数据库&#xff0c;旨在处理跨多个普通服务器的大量数据&#xff0c;并提供高可用性&#xff0c;没有单点故障。Apache Cassandra 是一个高度可扩展的分布…

uni-app:实现普通选择器,时间选择器,日期选择器,多列选择器

效果 选择前效果 1、时间选择器 2、日期选择器 3、普通选择器 4、多列选择器 选择后效果 代码 <template><!-- 时间选择器 --><view class"line"><view classitem1><view classleft>时间</view><view class"right&quo…

centos,789使用mamba快速安装R及语言包devtools

如何进入R语言运行环境请参考&#xff1a;Centos7_miniconda_devtools安装_R语言入门之R包的安装_r语言devtools包怎么安装-CSDN博客 在R里面使用安装devtools经常遇到依赖问题&#xff0c;排除过程过于费时&#xff0c;使用conda安装包等待时间长等。下面演示centos,789都是一…

STM32第十一课:STM32-基于标准库的42步进电机的简单IO控制(附电机教程,看到即赚到)

一&#xff1a;步进电机简介 步进电机又称为脉冲电机&#xff0c;简而言之&#xff0c;就是一步一步前进的电机。基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩&#xff0c;步进电机的角位移量与输入的脉冲个数严格成正…

kafka使用以及基于zookeeper集群搭建集群环境

一、环境介绍 zookeeper下载地址&#xff1a;https://zookeeper.apache.org/releases.html kafka下载地址&#xff1a;https://kafka.apache.org/downloads 192.168.142.129 apache-zookeeper-3.8.4-bin.tar.gz kafka_2.13-3.6.0.tgz 192.168.142.130 apache-zookee…