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会变的问题了

希望对大家的学习有帮助

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于卷积神经网络和客源注意力机制的OD客流预测模型

文章信息 论文题目为《An origin–destination passenger flow prediction system based on convolutional neural network and passenger source-based attention mechanism》&#xff0c;该文于2023年发表于Expert Systems With Applications期刊上。文章提出一种基于乘客源注…

xss学习笔记

跨站脚本攻击 掌握XSS 的原理 掌握XSS 的场景 掌握XSS 的危害 掌握XSS 漏洞验证 掌握XSS 的分类跨站脚本攻击 漏洞概述 ​ 跨站点脚本&#xff08;Cross Site Scripting&#xff0c; XSS&#xff09;是指客户端代码注入攻击&#xff0c;攻击者可以在合法网站或Web 应用程…

Linux可以投屏到电视吗?用网页浏览器就能投屏到电视!

Linux系统的电脑如果要投屏到安卓电视屏幕上&#xff0c;可以使用投屏工具AirDroid Cast的网页版和TV版一起实现。 首先&#xff0c;在Linux系统的电脑里用chrome浏览器或edge浏览器打开webcast.airdroid.com。这就是AirDroid Cast的网页版。你可以看到中间白色框框的右上角有个…

使用Jmeter进行http接口性能测试

在进行网页或应用程序后台接口开发时&#xff0c;一般要及时测试开发的接口能否正确接收和返回数据&#xff0c;对于单次测试&#xff0c;Postman插件是个不错的Http请求模拟工具。 但是Postman只能模拟单客户端的单次请求&#xff0c;而对于模拟多用户并发等性能测试&#xf…

asp.net core mvc之 RAZOR共享指令和标签助手 TagHelpers

一、RAZOR共享指令 RAZOR共享指令&#xff1a;在视图中导入命名空间&#xff0c;执行依赖注入。 RAZOR共享指令是写在 Views目录下的 _ViewImports.cshtml 文件 支持指令如下&#xff1a; addTagHelper 增加标签助手 removeTagHelper 移除标签助手 tagHelperPrefix 标签助手…

es性能强悍的推演过程

前言 es底层复用的Lucene的能力&#xff0c;Lucene在以前的文章中有所讲解&#xff0c;感兴趣可查看 https://blog.csdn.net/u013978512/article/details/125474873?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169771769916777224433628%2522%252C%2522scm%2522…

模拟接口数据之使用Fetch方法实现

文章目录 前言一、package.json配置mock执行脚本二、封装接口&#xff0c;区分走ajax还是fetch三、创建mock目录&#xff0c;及相关接口文件四、定义接口五、使用mock数据使用模拟数据优化fetch返回数据 六、不使用模拟数据七、对比其他需要使用依赖相关配置如有启发&#xff0…

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

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

Linux常用命令——bzip2命令

在线Linux命令查询工具 bzip2 将文件压缩成bz2格式 补充说明 bzip2命令用于创建和管理&#xff08;包括解压缩&#xff09;“.bz2”格式的压缩包。我们遇见Linux压缩打包方法有很多种&#xff0c;以下讲解了Linux压缩打包方法中的Linux bzip2命令的多种范例供大家查看&…

Mac 本地部署thinkphp8【部署环境以及下载thinkphp】

PHP的安装以及环境变量配置 1 PHP安装&#xff1a;在终端输入brew install php 这里是PHP下载的最新的 如果提示‘brew’找不到&#xff0c;自己搜索安装吧&#xff0c; 不是特别难 2 环境变量配置 终端输入vim ~/.bash_profile 输入export PATH"/usr/local/Cellar/php/8.…

C++阶段复习‘‘‘‘总结?【4w字。。。】

文章目录 前言类和对象C类定义和对象定义类成员函数C 类访问修饰符公有&#xff08;public&#xff09;成员私有&#xff08;private&#xff09;成员受保护&#xff08;protected&#xff09;成员 继承中的特点类的构造函数和析构函数 友元函数内联函数this指针指向类的指针类…

集成Line、Facebook、Twitter、Google、微信、QQ、微博、支付宝的三方登录sdk

下载地址&#xff1a; https://githubfast.com/anerg2046/sns_auth 安装方式建议使用composer进行安装 如果linux执行composer不方便的话&#xff0c;可以在本地新建个文件夹&#xff0c;然后执行上面的composer命令&#xff0c;把代码sdk和composer文件一起上传到项目适当位…