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

k8s的service自动发现服务:实战版

Service服务发现的必要性:

对于kubernetes整个集群来说,Pod的地址也可变的,也就是说如果一个Pod因为某些原因退出了,而由于其设置了副本数replicas大于1,那么该Pod就会在集群的任意节点重新启动,这个重新启动的Pod的IP地址与原IP地址不同,这对于业务来说,就不能根据Pod的IP作为业务调度。kubernetes就引入了Service的概念,它为Pod提供一个入口,主要通过Labels标签来选择后端Pod,这时候不论后端Pod的IP地址如何变更,只要Pod的Labels标签没变,那么 业务通过service调度就不会存在问题。

当声明Service的时候,会自动生成一个cluster IP,这个IP是虚拟IP。我们就可以通过这个IP来访问后端的Pod,当然,如果集群配置了DNS服务,比如现在的CoreDNS,那么也可以通过Service的名字来访问,它会通过DNS自动解析Service的IP地址。

Service的模式有三种,user space,iptables,ipvs:
1、userspace模式
客户端请求到内核空间后,由iptables规则将其转发到用户空间的 kube-proxy,kube-proxy 将其调度到各个node上的目标Pod。这种模式需要多次切换用户空间和内核空间,性能很差,生产环境不再使用。

在这里插入图片描述

2、iptables模式
iptables模式中,客户端的请求进入内核态后,直接由iptables将请求转发到各个pod上,这种模式中随着iptables规则的增加,性能越来越差,而且iptables规则查看和管理难度很大,生产环境中尽量少用。

在这里插入图片描述

3、ipvs模式
ipvs模式中,客户端的请求进入内核态后,直接由ipvs规则将请求转发到各个pod上,这种模式相当于内嵌一套lvs集群,性能比iptables强大,更重要的是支持lvs中调度算法,生产环境中ipvs模式优先考虑使用。ipvs内部时使用ipset维护映射关系,由于是hash链表,因此查询速度远远大于iptables的遍历速度。

在这里插入图片描述

Service的类型有四种:Cluster IP,LoadBalance,NodePort,ExternalName

其中Cluster IP是默认的类型。
(1)、Cluster IP:通过 集群内部IP暴露服务,默认是这个类型,选择该值,这个Service服务只能通过集群内部访问;
(2)、LoadBalance:使用云提供商的负载均衡器,可以向外部暴露服务,选择该值,外部的负载均衡器可以路由到NodePort服务和Cluster IP服务;
(3)、NodePort:顾名思义是Node基本的Port,如果选择该值,这个Service可以通过NodeIP:NodePort访问这个Service服务,NodePort会路由到Cluster IP服务,这个Cluster IP会通过请求自动创建;
(4)、ExternalName:通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容,没有任何类型代理被创建,可以用于访问集群内其他没有Labels的Pod,也可以访问其他NameSpace里的Service。

今天我主要介绍两种类型的用法Cluster IP和NodePort

开始实验

代码我还是用上个实验的tomcat+mysql项目zrlog

mysql的service用Cluster IP类型,因为mysql只通过集群内部访问也可以了

tomcat的service用NodePort类型,因为tomcat要和mysq通信,也要和外部通信

k8s集群的安装这里就不讲了 前面的文章有详细的写了,没装好的可以去看看

首先配置好系统环境

[root@server153 test]#  modprobe  ip_va
[root@server153 test]#  echo "ip_vs" >> /etc/modules-load.d/k8s.conf

然后创建一个空目录

开始编写yaml文件,如果不想手写那么多代码的,可以生成一个模板,我上一篇文章也有介绍了

tomcat和mysql的代码其实也可以写在一个文件里,用—分开就可以了,但是那样太长了,所以我分两个文件写

先写tomcat的yaml文件

[root@server153 test]# cat tomcat-deploy.yaml 
apiVersion: v1
kind: Service  # 声明版本为Service
metadata:name: tomcat-service   # 定义Service的名字labels:name: show-tomcat-pod    # 定义Service的标签
spec:type: NodePort   # 定义Service的类型,自动分配一个集群serviceipselector:app: tomcat-deploy   #定义标签选择器,会代理后端app=tomcat-deploy的Podports:- port: 80   #内部暴露的端口    targetPort: 8080  #代理的pod的端口 nodePort: 31111 #暴露给主机外部访问的端口(default: 30000-32767)---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: tomcat-deployname: tomcat-deploynamespace: default
spec:progressDeadlineSeconds: 600replicas: 1revisionHistoryLimit: 10selector:matchLabels:app: tomcat-deploystrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:labels:app: tomcat-deployspec:#创建init容器initContainers:#代码镜像- image: www.test.com/mytest/zrlog:v1#init容器名字name: init#将代码复制到匿名数据卷command: ["cp","-r","/tmp/ROOT.war","/www"]#将匿名数据卷挂载到容器中的/www目录下volumeMounts:- mountPath: /wwwname: tomcat-volume#创建tomcat容器containers:- image: oxnme/tomcatimagePullPolicy: Alwaysname: tomcatterminationMessagePath: /dev/termination-logterminationMessagePolicy: File#将数据卷挂载到tomcat的代码目录下volumeMounts:- mountPath: /usr/local/tomcat/webapps/name: tomcat-volumednsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulerterminationGracePeriodSeconds: 10#创建匿名数据卷volumes:- name: tomcat-volumeemptyDir: {}

然后是mysql的yaml文件,有些是一样的字段,所以我就不写注释了

本来mysql这种有状态的pod应该用StatefulSet控制器的,但是现在主要是实验service

所以我就用简单的pod来代替了

[root@server153 test]# cat mysql-pod.yaml 
apiVersion: v1
kind: Service
metadata:name: mysql-headless-servicelabels:name: svc-mysql-pod
spec:type: ClusterIPselector:run: mysql-podports:- port: 3306   #内部的暴露端口targetPort: 3306  #代理的pod的端口,这里不用暴露给外部网络访问,所以不用写nodePort了---
apiVersion: v1
kind: Pod
metadata:labels:run: mysql-podname: mysql-podnamespace: default
spec:containers:- image: mysql:5.7imagePullPolicy: IfNotPresentname: mysql-podresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:env:- name: MYSQL_ROOT_PASSWORD #定义mysql的初始密码value: MySQL@666- name: MYSQL_DATABASE     #初始化是创建一个zrlog数据库value: ZrlogdnsPolicy: ClusterFirstenableServiceLinks: truepreemptionPolicy: PreemptLowerPriorityrestartPolicy: AlwaysschedulerName: default-schedulerserviceAccount: defaultserviceAccountName: defaultterminationGracePeriodSeconds: 30

配置文件写好以后就可以启动服务了

[root@server153 test]# kubectl apply -f mysql-pod.yaml 
service/mysql-headless-service created
pod/mysql-pod created
[root@server153 test]# kubectl apply -f tomcat-deploy.yaml 
service/tomcat-service created
deployment.apps/tomcat-deploy created

看运行结果可以看到service和pod都被创建了,然后去查看pod和service的情况

[root@server153 test]# kubectl get pods
NAME                             READY   STATUS    RESTARTS   AGE
mysql-pod                        1/1     Running   0          104s
tomcat-deploy-555479bdf4-bj7mt   1/1     Running   0          96s
[root@server153 test]# kubectl get service
NAME                     TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes               ClusterIP   10.1.0.1      <none>        443/TCP        4d3h
mysql-headless-service   ClusterIP   10.1.50.178   <none>        3306/TCP       2m13s
tomcat-service           NodePort    10.1.7.229    <none>        80:31111/TCP   2m5s

可以看到情况是正常的

然后我们去看service的详细情况

[root@server153 ~]# kubectl describe services

在这里插入图片描述

然后我们去浏览器访问刚才我们定义的外部端口31111

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以看到是能访问的,不需要像上次那样又查看变化的ip又要nginx代理才能访问了

就像docker端口映射一样,现在就可以通过端口访问了

然后我们连接数据库安装

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

然后我们的service实验就完成了

pod之间的访问通过名称和端口就可以了,service是通过标签名来自动发现的,所以ip再怎么变也没有关系

这就解决了pod重建ip会变的问题了

希望对大家的学习有帮助

相关文章:

k8s的service自动发现服务:实战版

Service服务发现的必要性: 对于kubernetes整个集群来说&#xff0c;Pod的地址也可变的&#xff0c;也就是说如果一个Pod因为某些原因退出了&#xff0c;而由于其设置了副本数replicas大于1&#xff0c;那么该Pod就会在集群的任意节点重新启动&#xff0c;这个重新启动的Pod的I…...

项目笔记记录

一、node下载版本报错&#xff1a;npm install --legacy-peer-deps 二、Scheduled: 任务自动化调度 Scheduled 标记要调度的方法的注解&#xff0c;必须指定 cron&#xff0c;fixedDelay或fixedRate属性之一 fixedDelay&#xff1a;固定延迟 延迟执行任务&#xff0c;任务在…...

【leetcode】1137. 第 N 个泰波那契数

题目 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2 给你整数 n&#xff0c;请返回第 n 个泰波那契数 Tn 的值。 示例 1&#xff1a; 输入&#xff1a;n 4 输出&#xff1a;4 解释&#xff1a; T_3 0 1 1 2 …...

【解决】conda-script.py: error: argument COMMAND: invalid choice: ‘activate‘

运行conda activate base报错&#xff1a; 试了网上找到的解决方法都不行&#xff1a; 最后切换了一下terminal&#xff1a; 从powershell改回cmd&#xff08;不知道为什么一开始手贱换成powershell&#xff09; 就可以了...

Linux 性能调优之硬件资源监控

写在前面 考试整理相关笔记博文内容涉及 Linux 硬件资源监控常见的命名介绍&#xff0c;涉及硬件基本信息查看查看硬件错误信息查看虚拟环境和云环境资源理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#x…...

Windows系统隐藏窗口启动控制台程序

背景 上线项目有时候需要一些控制台应用作为辅助服务来协助UI应用满足实际需求&#xff0c;这时候如果一运行UI就冒出一系列的黑框&#xff0c;这将会导致客户被下的不起&#xff0c;生怕中了什么不知名病毒 方案 可以使用vbs来启动&#xff0c;这个是window系统自带的&#…...

FreeSWITCH fail2ban.lua

--[[ 部署:在vars.xml里面增加配置项目&#xff1a;<X-PRE-PROCESS cmd"set" data"api_on_startupluarun fail2ban.lua"/>或者在 lua.conf.xml 里面增加下面这个配置项目&#xff1a;<param name"startup-script" value"fail2ban.…...

Qt HTTP下载数据

添加头文件&#xff1a; #include <QNetworkAccessManager> #include <QNetworkReply> #include <QUrl> #include <QDesktopServices> 创建对象&#xff1a; QNetworkAccessManager networkManager;//网络管理QNetworkReply *reply; …...

8. 深度学习——NLP

机器学习面试题汇总与解析——NLP 本章讲解知识点 什么是 NLP循环神经网络(RNN)RNN 变体Attention 机制RNN 反向传播推导LSTM 与 GRUTransformerBertGPT分词算法分类CBOW 模型与 Skip-Gram 模型本专栏适合于Python已经入门的学生或人士,有一定的编程基础。本专栏适合于算法…...

部署 KVM 虚拟化平台

虚拟化技术的演变过程分为软件模拟、虚拟化层翻译、容器虚拟化三个阶段 1 软件模拟的技术方式 软件模拟是通过软件完全模拟CPU、网卡、芯片组、磁盘等计算机硬件&#xff0c;因为是软件模拟&#xff0c;所以理论上可以模拟任何硬件&#xff0c;甚至不存在的硬件。但是由于是软…...

Juniper PPPOE双线路冗余RPM配置

------------------ 浮动静态路由 set routing-options static route 0.0.0.0/0 next-hop pp0.0 qualified-next-hop pp0.1 preference 10 ----------------- RPM测试的内容,包括从哪个接口发起测试,测试ping等等 #指定探针类型用ICMP请求 #探测的目标地址 #探测间隔 #探测阈…...

原生JS实现视频截图

视频截图效果预览 利用Canvas进行截图 要用原生js实现视频截图&#xff0c;可以利用canvas的绘图功能 ctx.drawImage&#xff0c;只需要获取到视频标签&#xff0c;就可以通过drawImage把视频当前帧图像绘制在canvas画布上。 const video document.querySelector(video) con…...

前端Rust二进制/wasm全平台构建流程简述

前言 开门见山&#xff0c;现代前端 Rust 构建基本分三大类&#xff0c;即 构建 .wasm 、构建 .node 二进制 、构建 swc 插件。 入门详见 《 前端Rust开发WebAssembly与Swc插件快速入门 》 。 对于单独开发某一类的流程&#xff0c;在上述参考文章中已有介绍&#xff0c;但对于…...

加解密算法相关技术详解

文章目录 简介工作机制加解密对称密钥算法非对称密钥算法 数字信封数字签名数字证书技术对比 推荐阅读 简介 随着网络技术的飞速发展&#xff0c;网络安全问题日益重要&#xff0c;加解密技术是网络安全技术中的核心技术&#xff0c;是最常用的安全保密手段。 加密&#xff1…...

Clickhouse学习笔记(13)—— Materialize MySQL引擎

该引擎用于监听 binlog 事件&#xff0c;类似于canal、Maxwell等组件 ClickHouse 20.8.2.3 版本新增加了 MaterializeMySQL 的 database 引擎&#xff0c;该 database 能映射到 MySQL中的某个database &#xff0c;并自动在ClickHouse中创建对应ReplacingMergeTree。 ClickHous…...

《QT从基础到进阶·二十四》按钮组QButtonGroup,单选框QRadioButton和多选框QCheckBox

1、按钮组QButtonGroup 如果有多个单选按钮&#xff0c;可以统一放进一个按钮组。 图中有三个单选按钮放进了一个QGroupBox,并且设置了水平布局&#xff0c;现在要将这三个单选按钮放进一个按钮组&#xff0c;之前的想法是先把三个按钮加入按钮组&#xff0c;再把按钮组放进QG…...

Ansible--playbook剧本

目录 一、playbook&#xff1a; playbook的组成&#xff1a; palybook的编写注意事项 二、playbook的编写格式&#xff08;示例&#xff09; 2.1 编写yaml文件 2.2 定义、引用变量 2.3 指定远程主机sudo切换用户 2.4 when条件判断 2.5 迭代 2.6 Templates 模块 2.7 tags 模…...

MacOS下VMware Fusion配置静态IP

前言 在虚拟机安装系统后&#xff0c;默认是通过DHCP动态分配的IP&#xff0c;这会导致每次重启虚拟机ip都可能会改变&#xff0c;使用起来会有很多不便。 配置静态IP 查看主机网关地址 cat /Library/Preferences/VMware\ Fusion/vmnet8/nat.conf 查看主机DNS&#xff0c;m…...

三、机器学习基础知识:Python常用机器学习库(中文文本分析相关库)

文章目录 1、Jieba库1.1 主要函数1.2 词性标注1.3 关键词提取 2、WordCloud库2.1 常见参数2.2 词云绘制 文本分析是指对文本的表示及其特征的提取&#xff0c;它把从文本中提取出来的特征词进行量化来表示文本信息&#xff0c;经常被应用到文本挖掘以及信息检索的过程当中。 1、…...

Nginx 使用笔记大全(唯一入口)

Linux服务器因为Nginx日志access.log文件过大项目无法访问 项目处于运行状态下无法访问&#xff0c;第一步查看磁盘状态 1、查看磁盘状态 df -h 2、查找100M以上的文件 find / -size 100M |xargs ls -lh 3、删除文件 rm -rf /usr/local/nginx/logs/access.log 4、配置nginx.…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示&#xff0c;全球市场规模预计在 2031 年达到 9848 万美元&#xff0c;2025 - 2031 年期间年复合增长率&#xff08;CAGR&#xff09;为 3.7%。在竞争格局上&#xff0c;市场集中度较高&#xff0c;2024 年全球前十强厂商占据约 74.0% 的市场…...

麒麟系统使用-进行.NET开发

文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的&#xff0c;如果需要进行.NET开发&#xff0c;则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET&#xff0c;所以要进…...