K8s之Service四层代理入门实战详解

news2024/12/29 11:49:53

文章目录

    • 一、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/628075.html

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

相关文章

『Newsletter丨第一期』PieCloudDB 新增自动启停、预聚集、试用规则优化、费用中心等多项功能模块...

第一部分 PieCloudDB 最新动态 PieCloudDB 完成多个产品兼容性认证 PieCloudDB 与多家基础架构软件厂商完成产品兼容性认证,类别包括操作系统、服务器、CPU、云平台。 新增 8 家生态伙伴 ,包括龙蜥、麒麟、中科可控、海光、博云、杉岩、统信、兆兴…

小解送书【第一期】——《我们世界中的计算机》

目录 书籍介绍 内容简介 作者简介 译者简介 专家推荐 参与方式 书籍介绍 计算机和通信系统,以及由它们所实现的许多事物遍布我们周围。其中一些在日常生活中随处可见,比如笔记本电脑、手机和互联网。今天,在任何公共场所,都…

面向多告警源,如何构建统一告警管理体系?

本文介绍告警统一管理的最佳实践,以帮助企业更好地处理异构监控系统所带来的挑战和问题。 背景信息 在云原生时代,企业IT基础设施的规模越来越大,越来越多的系统和服务被部署在云环境中。为了监控这些复杂的IT环境,企业通常会选…

ATxSG 2023丨美格智能聚焦5G+AIoT,让全场景化数字生活加速到来

6月7日~9日,亚洲科技大会(Asia Tech x Singapore,简称ATxSG)在新加坡博览中心隆重开幕。ATxSG是亚洲旗舰科技盛会,由新加坡资讯通信媒体发展管理局(IMDA)和Informa Tech共同举办。第三届ATxSG聚焦生成式AI、Web 3.0和数…

YOLO系列理论合集(YOLOv1~v3SPP)

前言:学习自霹雳吧啦Wz YOLOV1 论文思想 1、将一幅图像分成SxS个网格(grid cell),如果某个object的中心落在这个网格中,则这个网格就负责预测这个object。 2、每个网格要预测B个bounding box,每个bounding box除了要预测位置(…

【智慧交通项目实战】 《 OCR车牌检测与识别》(二):基于YOLO的车牌检测

👨‍💻作者简介: CSDN、阿里云人工智能领域博客专家,新星计划计算机视觉导师,百度飞桨PPDE,专注大数据与AI知识分享。✨公众号:GoAI的学习小屋 ,免费分享书籍、简历、导图等&#xf…

特瑞仕 | 常见传感器基础知识归纳

​传感器是将物理量转换为电信号的装置,广泛应用于各种领域,如物联网、工业自动化、医疗健康等。传感器技术的发展和应用越来越广泛,其基础知识也日益重要。本文将介绍常见传感器的基础知识,包括传感器的种类、工作原理、应用领域…

JMeter测试笔记(四):逻辑控制器

引言: 进行性能测试时,我们需要根据不同的情况来设置不同的执行流程,而逻辑控制器可以帮助我们实现这个目的。 在本文中,我们将深入了解JMeter中的逻辑控制器,包括简单控制器、循环控制器等,并学习如何正…

Goby 漏洞更新 |Bifrost 中间件 X-Requested-With 系统身份认证绕过漏洞(CVE-2022-39267)

漏洞名称:Bifrost 中间件 X-Requested-With 系统身份认证绕过漏洞(CVE-2022-39267) English Name:Bifrost X-Requested-With Authentication Bypass Vulnerability (CVE-2022-39267) CVSS core: 8.8 影响资产数:14 漏洞描述&a…

vector容器会了吗?一文搞定它

这里写目录标题 赋值操作容量和大小插入和删除操作数据存取互换容器vector预留空间 赋值操作 #include<iostream> #include <vector> using namespace std; void print(vector<int>& v) {for (vector<int>::iterator it v.begin(); it ! v.end()…

【ROS2】使用摄像头功能包 usb_cam

1、准备工作 因为本人使用VirtualBox虚拟机运行的ROS2&#xff0c;所以首先要让摄像头可以在虚拟机中运行 1.1 安装VirtualBox扩展包 1&#xff09;下载地址&#xff1a;https://www.virtualbox.org/wiki/Downloads&#xff0c;注意扩展包的版本要和虚拟机的版本匹配 2&…

《C++高级编程》读书笔记(七:内存管理)

1、参考引用 C高级编程&#xff08;第4版&#xff0c;C17标准&#xff09;马克葛瑞格尔 2、建议先看《21天学通C》 这本书入门&#xff0c;笔记链接如下 21天学通C读书笔记&#xff08;文章链接汇总&#xff09; 1. 使用动态内存 1.1 如何描绘内存 在本书中&#xff0c;内存单…

Tik Tok的海外娱乐公会(中亚、巴西、美国、台湾)怎么申请?

TIKTOK 公会海外市场潜力巨大 自 2016 年始&#xff0c;多家直播平台陆续拓展至东南亚、中东、俄罗斯、日韩、 欧美、拉美等地区 海外市场作为直播发展新蓝海&#xff0c;2021 年直播行业整体规模达百亿美元&#xff0c; 并维持高速增长 TikTok 直播市场空间 TikTok 已经成…

Python3+Selenium2完整的自动化测试实现之旅(七):完整的轻量级自动化框架实现

一、前言 前面系列Python3Selenium2自动化系列博文&#xff0c;陆陆续续总结了自动化环境最基础环境的搭建、IE和Chrome浏览器驱动配置、selenium下的webdriver模块提供的元素定位和操作鼠标、键盘、警示框、浏览器cookie、多窗口切换等场景的方法、web自动化测试框架、python面…

如何系统的学习robo-gym

提醒&#xff1a;以下内容仅做参考&#xff0c;可自行发散。在发布作品前&#xff0c;请把不需要的内容删掉。无论是初学者还是有经验的专业人士&#xff0c;在学习一门新的IT技术时&#xff0c;都需要采取一种系统性的学习方法。那么作为一名技术er&#xff0c;你是如何系统的…

OpenPCDet安装、使用方式及自定义数据集训练

OpenPCDet安装、使用方式及自定义数据集训练 个人博客 OpenPCDet安装 # 先根据自己的cuda版本&#xff0c;安装对应的spconv pip install spconv-cu113# 下载OpenPCDet并安装 git clone https://github.com/open-mmlab/OpenPCDet.git cd OpenPCDet pip install -r requireme…

Jetpack Compose 中安全地消耗Flow

Jetpack Compose 中安全地消耗Flow 以 Lifecycle 为周期的方式收集流是在 Android 上收集流的推荐方式。如果您正在使用 Jetpack Compose 构建 Android 应用程序&#xff0c;则使用 collectAsStateWithLifecycle API 可以在 Lifecycle 为周期的方式下从您的 UI 中收集流。 co…

利用Jmeter做接口测试(功能测试)全流程分析

利用Jmeter做接口测试怎么做呢&#xff1f;过程真的是超级简单。 明白了原理以后&#xff0c;把零碎的知识点填充进去就可以了。所以在学习的过程中&#xff0c;不管学什么&#xff0c;我一直都强调的是要循序渐进&#xff0c;和明白原理和逻辑。这篇文章就来介绍一下如何利用…

CP2102 USB转UART国产桥接芯片 DPU02

芯片概述: DPU02是一个高度集成的USB转UART的桥接控制器&#xff0c;该产品提供了一个简单的解决方案&#xff0c;可将RS-232设计更新为USB设计&#xff0c;并简化PCB组件空间。该DPU02包括了一个USB2.0全速功能控制器、USB收发器、振荡器、EEPROM和带有完整调制解调控制信号的…

通过宝塔辅助部署本地Python爬虫项目到阿里云轻量服务器

文章目录 一、 上传项目文件二、准备项目环境2.1、安装 requirements.txt 依赖2.2、安装 node.js 环境2.3、阿里云服务器MySQL 8.0开启远程连接2.4、本地远程连接MySQL测试2.4.1、navicat 远程连接测试2.4.2、python 代码连接测试 笔记&#xff1a;最近想把本地的一套爬虫项目给…