【Kubernetes资源篇】Service四层代理入门实战详解

news2025/1/3 11:19:04

文章目录

    • 一、Service四层代理概念、原理
      • 1、Service四层代理概念
      • 2、Service工作原理
      • 3、Service原理解读
      • 4、Service四种类型
    • 二、Service四层代理三种类型案例
      • 1、创建ClusterIP类型Service
      • 2、创建NodePort类型Service
      • 3、创建ExternalName类型Service
    • 三、拓展
      • 1、Service域名解析
      • 2、自定义Endpoints资源

一、Service四层代理概念、原理

官网中文参考文档:

1、Service四层代理概念

在K8S中Pod是有生命周期的,如果重启Pod如果Pod重启它的IP很有可能会发生变化,如果我们程序中指定Pod地址是写死的,Pod每升级一次,刚升级的Pod,集群中其他关联此Pod的服务就找不到升级的Pod。

为了解决上面问题,在K8S集群中定义了Service资源对象(简写svc),Service的IP地址是不会随便改动的,相当于定义了一个服务的入口,客户端或者集群中其他组件通过连接Service,Service代理到后端相应的服务实例,Service是一组Pod的集合,这组Pod能够被Service访问到,通常是通过标签关联实现的。

小结:

1、Pod IP地址经常发生变化,Service代理Pod,我们客户端访问,只需要访问Service,Service代理到后端Pod。

2、通过Pod IP在K8S集群之外是无法访问到的,所以需要创建Service,这个Service可以在K8s集群外部访问。

2、Service工作原理

  • k8s在创建Service时,会根据标签选择器selector(lable selector)来查找Pod,据此创建与Service同名的endpoint对象。

  • 当Pod 地址发生变化时,endpoint也会随之发生变化,service接收前端client请求的时候,就会通过endpoint,找到转发到哪个Pod进行访问的地址。(至于转发到哪个节点的Pod,由负载均衡kube-proxy决定)

小结:

具体来说,当一个Pod被创建并加入到Service中时,Kubernetes会为该Pod创建一个Endpoint对象,Endpoint对象包含了Pod的IP地址和端口号。当请求到达Service的Cluster IP地址时,ipvs(iptables)规则会将请求转发到对应的Endpoint上,从而实现了四层代理的功能。

3、Service原理解读

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mCUCSq3H-1686303029941)(D:\MD归档文档\IMG\image-20230605095326789.png)]

  • Service是一个固定接入层,客户端通过访问ServiceIP+端口,从而访问到后端关联的Pod资源,Service的工作需要依赖于K8S集群中的DNS服务,不同版本的K8S集群,使用的DNS服务也是不同的,1.11之前版本使用kubeDNS,较新版本使用coreDNS。

  • Service的域名解析需要依赖于DNS服务,而DNS服务需要依赖于网络插件(flannel、calico)等,因此在部署K8S集群后也需要部署网络插件。

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

4、Service四种类型

  • ClusterIP:默认类型,只能在集群内部访问,通过ClusterIP暴露服务,可以在集群内部的其他Pod中访问该服务。
  • NodePort:在ClusterIP的基础上,通过NodePort将服务暴露到集群外部,可以通过NodeIP:NodePort的方式访问服务。
  • ExternalName:将服务映射到集群外部的DNS记录,可以通过服务名称直接访问外部服务,应用在夸名称空间访问。

二、Service四层代理三种类型案例

1、创建ClusterIP类型Service

默认类型,只能在集群内部访问,通过ClusterIP暴露服务,可以在集群内部的其他Pod中访问该服务。

cat clusterip-deploy.yaml 

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-cluster
  namespace: default
  labels:
    type: web-cluster
    env: uat
spec:
  selector:
    matchLabels:
      type: web-cluster
      env: uat
  replicas: 3 
  template:
    metadata:
      namespace: default
      labels:
        type: web-cluster
        env: uat
    spec:
      containers:
      - name: web-cluster
        image: nginx
        imagePullPolicy: IfNotPresent 
        startupProbe:
          tcpSocket:
            port: 80
        readinessProbe:
          httpGet:
            port: 80
            path: "index.html"
        livenessProbe:
          httpGet:
            port: 80
            path: "index.html"

service资源清单如下:

cat clusterip-svc.yaml 

---
apiVersion: v1
kind: Service
metadata:
  name: web-clusterip
  namespace: default
  labels:
    env: uat
spec:
  type: ClusterIP     # ClusterIP类型
  ports:
  - port: 80          # SVC端口
    protocol: TCP     # TCP协议
    targetPort: 80    # Pod暴露端口
  selector:           # 关联具有以下标签的Pod
    env: uat
    type: web-cluster

执行YAML文件 && 查看资源

kubectl apply -f clusterip-deploy.yaml -f clusterip-svc.yaml 
kubectl get pods,svc

查看Service Endpoints 是否关联上Pod

kubectl describe svc web-clusterip

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b0R2UynR-1686303029942)(D:\MD归档文档\IMG\image-20230609124223861.png)]

获取Service IP地址,通过Service代理访问后端Pod

kubectl get svc web-clusterip|awk NR==2|awk '{print $3}'
10.103.211.187
curl 10.103.211.187

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H4jELXhy-1686303029943)(D:\MD归档文档\IMG\image-20230609124400233.png)]

2、创建NodePort类型Service

在ClusterIP的基础上,通过NodePort将服务暴露到集群外部,可以通过NodeIP:NodePort的方式访问服务。

创建NodePort类型svc关联标签具有 app=demo-nginx

Deployment资源清单如下:

cat nodeport-deploy.yaml 

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-nodeport
  namespace: default
  labels:
    app: web-nodeport
    env: uat
spec:
  selector:
    matchLabels:
      app: web-nodeport
      env: uat
  replicas: 3
  template:
    metadata:
      namespace: default
      labels:
        app: web-nodeport
        env: uat
    spec:
      containers:
      - name: uat-nginx
        image: nginx
        imagePullPolicy: IfNotPresent 
        startupProbe:
          tcpSocket:
            port: 80
        readinessProbe:
          httpGet:
            port: 80
            path: "index.html"
        livenessProbe:
          httpGet:
            port: 80
            path: "index.html"

Service资源清单如下:

cat nodeport-svc.yaml 

---
apiVersion: v1
kind: Service
metadata:
  name: nodeport-svc
  namespace: default
  labels:
    env: uat
spec:
  type: NodePort
  ports:
  - port: 80               # svc的端口,这个是k8s集群内部服务可访问的端口
    protocol: TCP          # 协议
    targetPort: 80         # Pod上端口
    nodePort: 30303        # Node节点暴露端口
  selector:                # 关联具有app=web-nginx && env=uat 的Pod
    app: web-nodeport
    env: uat

执行YAML清单 && 查看状态

kubectl apply -f nodeport-deploy.yaml 
kubectl apply -f nodeport-svc.yaml 
kubectl get pods,svc

查看Service的Endpoints是否关联上Pod

kubectl describe svc nodeport-svc|grep Endpoints

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BFxq3buD-1686303029943)(D:\MD归档文档\IMG\image-20230609130818398.png)]

通过浏览器访问NodeIP:30303

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8aLEg8Ex-1686303029943)(D:\MD归档文档\IMG\image-20230609130955135.png)]

3、创建ExternalName类型Service

将服务映射到集群外部的DNS记录,可以通过服务名称直接访问外部服务。

应用场景:跨名称空间关联,ExternalName可以理解成软链接SVC资源

需求:default名称空间下的client服务要可以访问nginx-ns名称空间下的nginx-svc服务,实验图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cODOsLwZ-1686303029943)(D:\MD归档文档\IMG\image-20230609164044118.png)]

创建 服务端相关资源,并放在 nginx-ns 命名空间下

cat nginx-server.yaml 

---
apiVersion: v1
kind: Namespace
metadata:
  name: nginx-ns
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-server
  namespace: nginx-ns
  labels:
    app: nginx-server
    env: uat
spec:
  selector:
    matchLabels:
      app: nginx-server
      env: uat
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx-server
        env: uat
    spec:
      containers:
      - name: nginx-server
        image: nginx
        imagePullPolicy: IfNotPresent 
        startupProbe:
          tcpSocket:
            port: 80
        readinessProbe:
          httpGet:
            port: 80
            path: "index.html"
        livenessProbe:
          httpGet:
            port: 80
            path: "index.html"
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: nginx-ns
spec:
  ports:
  - name: http
    port: 80              
    protocol: TCP        
  selector:           
    app: nginx-server 
    env: uat
kubectl apply -f nginx-server.yaml 

创建 客户端 Pod资源:

cat nginx-client.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-client
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-client
  template:
    metadata:
      labels:
        app: nginx-client
    spec:
      containers:
      - name: nginx-client
        image: busybox:1.28
        imagePullPolicy: IfNotPresent
        command: ["/bin/sh", "-c", "sleep 3600000"]
kubectl apply -f nginx-client.yaml

创建 ExternalName 类型 Service,链接到 nginx-ns 名称空间下的nginx-svc Service

cat nginx-client-svc.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: client-nginx
spec:
  type: ExternalName
  externalName: nginx-svc.nginx-ns.svc.cluster.local # 访问此SVC链接到nginx-svc.nginx-ns.svc.cluster.local SVC
  ports:
  - name: http
    port: 80
    targetPort: 80
kubectl apply -f nginx-client-svc.yaml

查看Service详细信息:

kubectl describe svc client-nginx

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iQ2iZRNw-1686303029944)(D:\MD归档文档\IMG\image-20230609163103581.png)]

测试:进入client端访问nginx-service网站

kubectl exec -it nginx-client-784fd7bfc7-2d892 -- /bin/sh
wget -q -O - client-nginx

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bM2E4cJY-1686303029944)(D:\MD归档文档\IMG\image-20230609163403871.png)]

三、拓展

1、Service域名解析

Service只要创建成功,我们就可以直接通过他的域名来访问(在Pod内可以使用域名访问,在Node节点是不可以使用域名访问的),每个服务创建后都会在集群DNS中动态添加一个资源记录,添加完成后就可以解析了,资源记录的格式是:

SVC_NAME.NS_NAME.DOMAIN.LTD.
服务名.命名空间.域名后缀
集群默认的域名后缀是svc.cluster.local.

用上面的 创建ClusterIP类型svc 来做实验,在Pod中使用域名访问。

kubectl exec -it web-cluster-5db6bc847b-226k9 -- /bin/bash
curl web-clusterip.default.svc.cluster.local

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IZMqj0Q5-1686303029944)(D:\MD归档文档\IMG\image-20230609130152791.png)]

2、自定义Endpoints资源

场景:创建Service资源,代理本机的3306端口

首先在宿主机安装、启动MySQL服务

yum install mariadb-server.x86_64 -y
systemctl start mariadb
systemctl enable mariadb

创建Service代理3306端口 YAML如下:

cat 3306-svc.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: svc-3306
spec:
  type: ClusterIP
  ports:
  - port: 3306
kubectl apply -f 3306-svc.yaml	

我们svc中没有定义关联的Pod标签,所以svc中并Endpoint为none

kubectl describe svc svc-3306

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yNYsLcQg-1686303029944)(D:\MD归档文档\IMG\image-20230609165500615.png)]

创建 Endpoint资源 并关联上面的SVC

cat 3306-ep.yaml 
---
apiVersion: v1
kind: Endpoints
metadata:
  name: svc-3306 # ep的名称必须和svc一致,通过名称相关联
subsets:
- addresses:
  - ip: 172.21.0.13
  ports:
  - port: 3306

OK,此时我们查看SVC的 Endpoint 会关联上面创建的Endpoint,后续K8S集群连接MySQL服务直接可以写SVC的IP+端口进行访问了。

kubectl describe svc svc-3306

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1xOXWVf6-1686303029945)(D:\MD归档文档\IMG\image-20230609171418074.png)]

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

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

相关文章

Nvidia AGX Orin MAX9296 GMSL 载板设计要点

因为项目的需求,我们设计了Nvidia AGX Orin MAX9296 GMSL 载板(绿板),项目完成,总结以下。需要参考原理图的,可以微我,索取。共同交流。 Jetson AGX Orin建立在NVIDIA Ampere架构之上,全新Jets…

AUTOSAR-BSW EEPROM模块解读

参考文件 AUTOSAR_SWS_EEPROMDriver(4.3.0) AUTOSAR_SWS_BSWGeneral(4.3.0) EEPROM Module 文件结构 如上图所示 EEPROM Module应该主要包含Eep.c,Eep.h,Eep_Cfg.c,Eep_MemMmap.h,Eep_Lcfg.c和Eep_PBcfg.c文件,如果使…

图像分类模型嵌入flask中开发PythonWeb项目

图像分类模型嵌入flask中开发PythonWeb项目 图像分类是一种常见的计算机视觉任务,它的目的是将输入的图像分配到预定义的类别中,如猫、狗、花等。图像分类模型是一种基于深度学习的模型,它可以利用大量的图像数据来学习图像的特征和类别之间…

华为OD机试之找终点

找终点 题目描述 给定一个正整数数组&#xff0c;设为nums&#xff0c;最大为100个成员&#xff0c;求从第一个成员开始&#xff0c;正好走到数组最后一个成员&#xff0c;所使用的最少步骤数。 要求&#xff1a; 第一步必须从第一元素开始&#xff0c;且1<第一步的步长<…

100天精通Golang(基础入门篇)——第3天:Go语言的执行原理及常用命令、编码规范和常用工具

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

java进阶—线程间通信(通俗易懂等待唤醒机制)

今天我们来看一看&#xff0c;线程之间的通信&#xff0c;也就是我们所说的等待唤醒机制 先来看三个关键方法: wait(); 当线程执行这个方法&#xff0c;它就会进入阻塞状态&#xff0c;并且释放同步监视器 notify(); 英文翻译 唤醒&#xff0c;就是说会唤醒wait的线程&…

【 图像分割 2022 ECCV】CP2

【 图像分割 2022 ECCV】CP2 论文题目&#xff1a;CP2: Copy-Paste Contrastive Pretraining for Semantic Segmentation 中文题目&#xff1a;CP2:语义分割的复制粘贴对比预训练 论文链接&#xff1a;https://arxiv.org/abs/2203.11709 论文代码&#xff1a;https://github.co…

Python3+Selenium框架搭建

Webdriver概述 Webdriver (Selenium2&#xff09;是一种用于Web应用程序的自动测试工具&#xff0c; Thoughtworks公司一个强大的基于浏览器的开源自动化测试工具&#xff0c;通常用来编写web应用的自动化测试。 Selenium 是一个用于Web应用程序测试的工具。 Selenium测试直…

异常数据检测 | Python实现支持向量机(SVM)的异常数据检测

文章目录 文章概述模型描述源码分享学习小结参考资料文章概述 SVM通常应用于监督式学习,但OneClassSVM算法可用于将异常检测这样的无监督式学习,它学习一个用于异常检测的决策函数其主要功能将新数据分类为与训练集相似的正常值或不相似的异常值。 模型描述 OneClassSVM的思…

Flink 1.17.0集群搭建

集群角色分配 HostnameIPRolehadoop01192.168.126.132 JobManager TaskManager hadoop02192.168.126.133TaskManagerhadoop03192.168.126.134TaskManager 下载flink安装包 https://archive.apache.org/dist/flink/flink-1.17.0/ 上传至hadoop01并解压&#xff1a; 修改conf/…

微软MFC技术简明介绍

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来看一下微软MFC技术简明介绍 Visual C 与 MFC 微软公司于1992年上半年推出了C/C 7.0 产品时初次向世人介绍了MFC 1.0&#xff0c;这个产品包含了20,000行C原始代码&#xff0c;60个以上的Windows相关类…

【Leetcode】贪心问题合集 | 摆动序列、K次取反最大和、加油站、分发糖果、柠檬水找零、根据身高重建队列、单调递增的数字

贪心问题感觉还是挺不好想的&#xff0c;因为每一题有每一题的策略&#xff0c;感觉只能尽量做过的记住了。 376 摆动序列 注意&#xff1a;是序列&#xff0c;而不是数组。 求最大摆动序列的长度&#xff0c;即求谷 / 峰的个数。 若走势不为一条直线。 起始count 2&…

LED显示屏静电防护指南

LED显示屏是一种电子设备&#xff0c;对静电敏感。静电放电可能会对LED显示屏的电子元件造成损坏&#xff0c;因此需要采取静电防护措施。以下是LED显示屏静电防护的一些建议和指南&#xff1a; 环境控制&#xff1a;在LED显示屏周围创建适宜的环境条件。控制湿度和温度&#x…

Yolov5(tag v7.0)网络结构解读,以yolov5s为例

最近yolov5用的多&#xff0c;发现确实好用&#xff0c;于是较深入学了一下。下面按照训练的流程梳理一下网络的结构&#xff0c;同时也是自己记一下便于后面查阅。 同时&#xff0c;我也查了一些关于yolov5网络结构介绍的资料&#xff0c;发现大多是v5.0&#xff0c;少数v6.0的…

Linux驱动IO篇——阻塞/非阻塞IO

文章目录 非阻塞IO阻塞IO等待队列等待队列变体 非阻塞IO 在应用程序中&#xff0c;使用open函数打开一个/dev目录下的一个设备文件时&#xff0c;默认是以阻塞的方式打开。 所谓阻塞&#xff0c;就是当我们请求的资源不可用时&#xff08;资源被占用&#xff0c;没有数据到达等…

让车载系统与外部系统无缝对接——掌握SOA跨系统通信技术

车载SOA架构原理 车载 SOA&#xff08;Service-Oriented Architecture&#xff0c;面向服务的架构&#xff09;是一种基于服务的体系结构&#xff0c;旨在提高车载电子系统的可维护性、可扩展性和互操作性。它将车载电子系统划分为独立的、可复用的服务单元&#xff0c;这些服…

NodeJS MongoDB⑦

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言Node&MongoDB 第一步 连接数据库 第二步 创建User Mongodb模型 第三步 简单使用 Mongodb命令 第四步 规范使用 Mongodb命令 &#xff08…

爆款视频批量剪辑生成系统源码部署

创建视频 该接口用于创建抖音视频&#xff08;支持话题, 小程序等功能&#xff09;。该接口适用于抖音。 使用限制 抖音的 OAuth API 以https://open.douyin.com/ 开头。挂载小程序请先完成注册开发者平台账号。创建抖音视频后, 会有一个审核过程, 期间只有自己可见。如果发…

docker数据管理与网络通信

一、管理docker容器中数据 管理Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器( DataVolumes Containers) 。 1、 数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机的目录挂载到数据卷上&#xff0c;对数据卷的修改操作立刻…

leetcode11. 盛最多水的容器(java)

盛最多水的容器 leetcode11. 盛最多水的容器题目描述 解题思路代码演示二叉树专题 leetcode11. 盛最多水的容器 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/container-with-most-water 题目描述 给定一个长度为 n 的…