当前位置: 首页 > news >正文

K8S四层代理Service-02

Service的四种类型使用

  • ClusterIP
    • 使用示例
    • Pod里使用service的服务名访问应用
  • NodePort
    • 使用示例
  • ExternalName
    • 使用示例
  • LoadBalancer

K8S支持以下4种Service类型:ClusterIP、NodePort、ExternalName、LoadBalancer
以下是使用4种类型进行Service创建,应对不同场景

ClusterIP

默认类型,适用于仅在集群内部提供服务的应用。创建的Service仅可在集群内部访问,由K8S自动分配IP地址。

使用示例

1、创建pod

vim pod_test_1.yaml

编写pod的yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-test-1
spec:selector:matchLabels:test: cluster # 配置deployment的标签,必须与pod标签一致replicas: 2  # 配置deployment的pod数template:metadata:labels:test: cluster # 配置pod的标签spec:containers:- name: my-nginximage: docker.io/library/nginx:latest # 使用的镜像imagePullPolicy: IfNotPresent # 节点本地没找到镜像再去远程仓库拉取ports:- containerPort: 80  #pod中的容器需要暴露的端口startupProbe:  # 配置启动探测periodSeconds: 5initialDelaySeconds: 60timeoutSeconds: 10httpGet:   scheme: HTTPport: 80path: /livenessProbe: # 配置存活探测periodSeconds: 5initialDelaySeconds: 60timeoutSeconds: 10httpGet:scheme: HTTPport: 80path: /readinessProbe: # 配置就绪探测(只有探测就绪成功后才会记录到Service里的endpoint)periodSeconds: 5initialDelaySeconds: 60 # pod启动后首次检查就绪探测的时间,单位为秒。timeoutSeconds: 10httpGet:    # 探测方式是HTTP发起GET请求服务的80端口访问根路径scheme: HTTPport: 80path: /

更新启动资源

kubectl apply -f pod_test_1.yaml

在这里插入图片描述
查看刚才创建的Pod ip地址

kubectl get pods -owide -l test=cluster

在这里插入图片描述
查看 ReplicaSet信息

kubectl get replicaset -l test=cluster

在这里插入图片描述
请求pod的 IP地址,访问应用

curl 10.244.36.75:80

在这里插入图片描述

curl 10.244.169.133

在这里插入图片描述
在pod1中请求pod2的应用,可以访问

kubectl exec -it nginx-test-1-69ddb65d98-vq2r6 -- /bin/bash

在这里插入图片描述
“误”删除其中一个Pod,查看Pod集群变化

kubectl delete pods nginx-test-1-69ddb65d98-vq2r6
kubectl get pods -owide -l test=cluster

在这里插入图片描述

通过上面可以看到重新生成了一个pod:nginx-test-1-69ddb65d98-nkjnv,IP是110.244.36.76,在k8s中创建pod,如果pod被删除了,重新生成的pod的IP地址会发生变化,所以需要在pod前端加一个固定接入层。

2、创建service

vim service_test_1.yaml

编写service的yaml文件

apiVersion: v1
kind: Service
metadata:name: nginx-test-1labels:test: cluster
spec:type: ClusterIPports:- port: 80   #service的端口,暴露给k8s集群内部服务访问protocol: TCPtargetPort: 80    #pod容器中定义的端口selector:test: cluster  #选择拥有test=cluster标签的pod

上述yaml文件将创建一个 Service,关联具有标签test=cluster的Pod,目标TCP端口80
(targetPort:容器接收流量的端口;port:抽象的 Service 端口,可以使任何其它 Pod访问该 Service的端口)。

更新启动Service

kubectl apply -f service_test_1.yaml

查看Service

kubectl get svc -l test=cluster

在这里插入图片描述
在k8s控制节点访问service的 IP:port 就可以把请求代理到后端pod

curl 10.111.10.207:80

在这里插入图片描述
通过上面可以看到请求Service IP:port 跟直接访问pod IP:port 看到的结果一样,这就说明Service可以把请求代理到它所关联的后端Pod
注意:上图的 “10.111.10.207:80” 地址只能是在k8s集群内部访问,在外部无法访问,想要通过浏览器是访问不通的

Pod里使用service的服务名访问应用

service只要创建完成,就可以直接解析它的服务名,每一个服务创建完成后都会在集群dns中动态添加一个资源记录,添加完成后就可以解析了,资源记录格式是:
SVC_NAME.NS_NAME.DOMAIN.LTD. 服务名.命名空间.域名后缀
集群默认的域名后缀是:svc.cluster.local
上面创建的nginx-test-1服务,完整名称解析是:nginx-test-1.default.svc.cluster.local

在Pod里通过Service的服务名访问应用

kubectl exec -it nginx-test-1-69ddb65d98-nkjnv -- /bin/bash
curl nginx-test-1.default.svc.cluster.local

在这里插入图片描述

NodePort

适用于需要从外部访问Service的应用。创建的Service在每个节点上公开一个静态端口,使得外部客户端可以通过公开的端口访问Service的应用。

使用示例

1、创建pod

vim pod_test_2.yaml

编写pod的yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-test-2
spec:selector:matchLabels:test: nodeportreplicas: 2template:metadata:labels:test: nodeportspec:containers:- name: my-nginximage: docker.io/library/nginx:latestimagePullPolicy: IfNotPresentports:- containerPort: 80  #pod中的容器需要暴露的端口startupProbe:periodSeconds: 5initialDelaySeconds: 60timeoutSeconds: 10httpGet:scheme: HTTPport: 80path: /livenessProbe:periodSeconds: 5initialDelaySeconds: 60timeoutSeconds: 10httpGet:scheme: HTTPport: 80path: /readinessProbe:periodSeconds: 5initialDelaySeconds: 60timeoutSeconds: 10httpGet:scheme: HTTPport: 80path: /

更新启动资源

kubectl apply -f pod_test_2.yaml

在这里插入图片描述
查看pod是否创建成功

kubectl get pods -owide -l test=nodeport

在这里插入图片描述
2、创建service,代理pod

vim service_test_2.yaml

编写service的yaml文件

apiVersion: v1
kind: Service
metadata:name: nginx-test-2labels:test: nodeport
spec:type: NodePortports:- port: 80protocol: TCPtargetPort: 80nodePort: 30380selector:test: nodeport

更新启动Service

kubectl apply -f service_test_2.yaml

查看Service

kubectl get svc -l test=nodeport

在这里插入图片描述

kubectl describe svc nginx-test-2

在这里插入图片描述

访问Service

curl 10.102.33.103

在这里插入图片描述

注意:10.102.33.103是k8s集群内部的Service的IP地址,只能在k8s集群内部访问,在集群外无法访问。

在集群外访问Service(K8S的node节点IP:nodePort)
PS. 我本地搭建是一个控制节点+2个工作节点

  • 192.168.40.182:30380(控制节点)
  • 192.168.40.183:30380(工作节点1)
  • 192.168.40.184:30380(工作节点2)

以上3个地址都能访问到应用
在这里插入图片描述
数据转发流程

ipvsadm -Ln

在这里插入图片描述

ip addr

在这里插入图片描述

客户端请求(任何一个节点IP+端口)http://192.168.40.182:30380->docker0
虚拟网卡:172.17.0.1:30380->10.244.36.80:80,10.244.169.137:80

ExternalName

适用于跨名称空间访问。例如:命名空间为“default”下的client 服务,想要访问命名空间为“nginx-ns”下的nginx-svc服务。可通过DNS解析直接访问该服务,不需要其他负载均衡器。

使用示例

1、新建一个命名空间

kubectl create ns nginx-ns

2、搭建nginx-svc服务
2.1 创建pod

vim nginx_deployment.yaml

编写pod的yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:name: nginxnamespace: nginx-ns
spec: replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresent

更新启动资源

kubectl apply -f nginx_deployment.yaml

查看pod是否创建成功

kubectl get pods -n nginx-ns

在这里插入图片描述

2.2 创建service

vim nginx_svc.yaml

编写service的yaml文件

apiVersion: v1
kind: Service
metadata:name: nginx-svcnamespace: nginx-ns
spec:selector:app: nginxports:- name: httpprotocol: TCPport: 80targetPort: 80

更新启动Service

kubectl apply -f nginx_svc.yaml

查看Service信息

kubectl get svc -n nginx-nskubectl describe svc  nginx-svc -n nginx-ns

在这里插入图片描述

3、搭建client 服务
3.1 创建pod

vim client.yaml

编写pod的yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:name: client
spec: replicas: 1selector:matchLabels:app: busyboxtemplate:metadata:labels:app: busyboxspec:containers:- name: busyboximage: busyboximagePullPolicy: IfNotPresentcommand: ["/bin/sh","-c","sleep 36000"]

更新启动资源

kubectl apply -f client.yaml

该文件中指定了到 nginx-svc 的软链,让使用者感觉就好像调用自己命名空间的服务一样
查看pod是否正常运行

kubectl get pods -l app=busybox

在这里插入图片描述

3.2 创建service

vim client_svc.yaml

编写service的yaml文件

apiVersion: v1
kind: Service
metadata:name: client-svc
spec:type: ExternalNameexternalName: nginx-svc.nginx-ns.svc.cluster.localports:- name: httpport: 80targetPort: 80

更新启动Service

kubectl apply -f client_svc.yaml

登录到client pod

kubectl exec -it  client-568955849b-mt47t -- /bin/sh
wget -q -O - client-svc.default.svc.cluster.local
wget -q -O - nginx-svc.nginx-ns.svc.cluster.local

在这里插入图片描述
在这里插入图片描述

上面两个请求的结果一样

LoadBalancer

LoadBalancer类型适用于需要提供公共服务并且需要高可用性和高伸缩性的场景。与其他类型的Service相比实现更复杂,需要绑定到云平台的负载均衡器服务上,因此通常适用于云平台环境。
(ps. 设备有限,没有做这块的实验。
特放官网的链接:https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/#loadbalancer)

相关文章:

K8S四层代理Service-02

Service的四种类型使用 ClusterIP使用示例Pod里使用service的服务名访问应用 NodePort使用示例 ExternalName使用示例 LoadBalancer K8S支持以下4种Service类型:ClusterIP、NodePort、ExternalName、LoadBalancer 以下是使用4种类型进行Service创建,应对…...

3、非数值型的分类变量

非数值型的分类变量 有很多非数字的数据,这里介绍如何使用它来进行机器学习。 在本教程中,您将了解什么是分类变量,以及处理此类数据的三种方法。 本课程所需数据集夸克网盘下载链接:https://pan.quark.cn/s/9b4e9a1246b2 提取码:uDzP 文章目录 1、简介2、三种方法的使用1…...

国内免费chartGPT网站汇总

https://s.suolj.com - (支持文心、科大讯飞、智谱等国内大语言模型,Midjourney绘画、语音对讲、聊天插件)国内可以直连,响应速度很快 很稳定 https://seboai.github.io - 国内可以直连,响应速度很快 很稳定 http://gp…...

【Alibaba工具型技术系列】「EasyExcel技术专题」实战研究一下 EasyExcel 如何从指定文件位置进行读取数据

实战研究一下 EasyExcel 如何从指定文件位置进行读取数据 EasyExcel的使用背景EasyExcel的时候痛点EasyExcel对比其他框架 EasyExcel的编程模式EasyExcel读取的指定位置导入数据的流程表头校验invokeHeadMap()方法 数据处理invoke()方法 执行中断hasNextdoAfterAllAnalysed()方…...

java.security.InvalidKeyException: Illegal key size错误

出现的问题 最近在对接第三方,涉及获取token鉴权。在本地调试能获取到token,但是在Linux环境上调用就报错:java.security.InvalidKeyException: Illegal key size 与三方沟通 ,排除了是传参和网络的原因;搜索资料发现…...

python脚本,实现监控系统的各项资源

今天的文章涉及到docker的操作和一个python脚本,实现监控网络的流量、CPU使用率、内存使用率和磁盘使用情况。一起先看看效果吧: 这是在控制台中出现的数据,可以很简单的看到我们想要的监控指标。如果实现定时任务和数据的存储、数据的展示&a…...

Flink处理函数(2)—— 按键分区处理函数

按键分区处理函数(KeyedProcessFunction):先进行分区,然后定义处理操作 1.定时器(Timer)和定时服务(TimerService) 定时器(timers)是处理函数中进行时间相关…...

服务器数据恢复—服务器进水导致阵列中磁盘同时掉线的数据恢复案例

服务器数据恢复环境: 数台服务器数台存储阵列柜,共上百块硬盘,划分了数十组lun。 服务器故障&检测: 外部因素导致服务器进水,进水服务器中一组阵列内的所有硬盘同时掉线。 北亚数据恢复工程师到达现场后发现机房内…...

npm或者pnpm或者yarn安装依赖报错ENOTFOUND解决办法

如果报错说安装依赖报错,大概率是因为npm源没有设置对,比如我这里安装protobufjs的时候报错:ENOTFOUND npm ERR! code ENOTFOUND npm ERR! syscall getaddrinfo npm ERR! errno ENOTFOUND npm ERR! network request to https://registry.cnpm…...

学会使用ubuntu——ubuntu22.04使用Google、git的魔法操作

ubuntu22.04使用Google、git的魔法操作 转战知乎写作 https://zhuanlan.zhihu.com/p/679332988...

【机组】计算机组成原理实验指导书.

​🌈个人主页:Sarapines Programmer🔥 系列专栏:《机组 | 模块单元实验》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 ​ 目录 第一章 性能特点 1.1 系…...

解决Sublime Text V3.2.2中文乱码问题

目录 中文乱码出现情形通过安装插件来解决乱码问题 中文乱码出现情形 打开一个中文txt文件,显示乱码,在File->Reopen With Encoding里面找不到支持简体中文正常显示的编码选项。 通过安装插件来解决乱码问题 安装Package Control插件 打开Tool->…...

Oracle 12CR2 RAC部署翻车,bug避坑经历

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…...

情绪共享机器:潜力与挑战

在设想的未来科技世界中,有一种神奇的机器,它能够让我们戴上后即刻感知并体验他人当下的情绪。这种情绪共享机器无疑将深刻地改变我们对人际关系、社会交互乃至人性本质的理解。然而,这一科技创新所带来的影响并非全然积极,也伴随…...

docker 安装python3.8环境镜像并导入局域网

一、安装docker yum -y install docker docker version #显示 Docker 版本信息 可以看到已经下载下来了 拉取镜像python3镜像 二、安装docker 中python3环境 运行本地镜像,并进入镜像环境 docker run -itd python-38 /bin/bash docker run -itd pyth…...

修复“电脑引用的账户当前已锁定”问题的几个方法,看下有没有能帮助到你的

面对“电脑引用的账户当前已锁定,且可能无法登录”可能会让你感到焦虑。这是重复输入错误密码后出现的登录错误。当帐户锁定阈值策略配置为限制未经授权的访问时,就会发生这种情况。 但是,如果你在等待半小时后输入正确的密码,你可以重新访问你的帐户。同样,如果你有一个…...

vp9协议笔记

vp9协议笔记📒 本文主要是对vp9协议的梳理,协议的细节参考官方文档:VP9协议链接(需要加速器) vp9协议笔记 vp9协议笔记📒1. 视频编码概述2. 超级帧superframe(sz):2. fr…...

信息检索与数据挖掘 | (九)Link Analysis(链接分析)

文章目录 📚链接分析📚随机矩阵📚random walk📚Google formulation 📚链接分析 将链接看做投票,从重要的网站来的链接其权重更高,所以是递归定义的。 如果网页j权重为rj,有n个出边&…...

yarn的安装及使用教程

Yarn 是一个快速、可靠、安全的包管理工具,用于管理 JavaScript 项目的依赖项。下面是关于 Yarn 的安装和基本使用的详细教程: 安装 Yarn 访问 Yarn 官网 并按照指示下载适合你操作系统的安装程序。安装程序会自动安装 Yarn,并将其添加到系…...

最新AI系统ChatGPT网站H5系统源码,支持Midjourney绘画,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧。已支持GPT…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言:多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

day52 ResNet18 CBAM

在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...