详解k8s集群内外的访问方式

文章目录

    • 1、集群内访问
    • 2、集群外访问
      • 2.1、Ingress转发外网请求
      • 2.2、LoadBanlancer接入外网请求
      • 2.3、NodePort接入外网请求
    • 3、总结和对比
      • 3.1、Ingress、NodePort和LoadBalancer总结
      • 3.2、Ingress和网关的区别

1、集群内访问

在k8s中创建的微服务,大部分都是在集群内部互相调用,这时候,使用DNS就可以很方便访问。

比如:服务名是 my-service,端口号是8080,命名空间是yifan,那么就可以通过域名+端口 “my-service.yifan.svc.cluster.local:8080” 在集群内访问。

当然,也可以直接用服务的ClusterIP+服务的端口号,只是这么使用的较少。

DNS解析到的IP也就是这个服务的ClusterIP,只是咱们不需要记住ClusterIP,记住服务名对应的域名更加容易。

在这里插入图片描述

如上图所示,就是k8s集群内的服务访问流程。

客户端通过DNS服务的域名解析 my-service.yifan.svc.cluster.local 返回这个服务的ClusterIP。

然后创建TCP连接到这个ClusterIP+端口号上。

网络请求经过Iptables/ipvs规则处理,经过负载均衡策略,把这个ClusterIP重定向到服务的后端实例,也就是这个服务的某一个Pod得PodIP。

这样TCP连接成功创建,客户端也就建立了与服务的后端实例的连接,也就可以进行后续的请求了。

下面是Cluster类型的service的yaml文件示例:

apiVersion: v1kind: Servicemetadata:name: my-servicespec:type: ClusterIP  selector:app: my-app  ports:- name: http      port: 80targetPort: 8080

YAML说明:

  • apiVersion: 指定Kubernetes API的版本。

  • kind: 指定要创建的对象类型,此处为Service。

  • metadata.name: 指定Service的名称,此处为“my-service”。

  • spec.type: 指定Service的类型,此处为“ClusterIP”。

  • spec.selector: 指定要为Service选择的Pod或副本集的标签选择器。在这个例子中,标签选择器是“app=my-app”。

  • spec.ports: 指定要公开的端口及其配置信息。在这个例子中,将公开端口80,名称为“http”,将流量转发到Pod中的端口8080。

要使用此YAML文件创建Service,请使用以下命令:

kubectl apply -f service.yaml

2、集群外访问

k8s集群的外网访问方式有3种:

  • Ingress
  • NodePort
  • LoadBanlancer。

其中Ingress是k8s的一个抽象层,有很多的IngressController和服务可以来实现这个Ingress服务,然后由这个Ingress服务把外网的请求转发到集群内的服务。

NodePort和LoadBanlancer是k8s中service的类型。上面讲到的集群内访问,ClusterIP也是service的一种类型。

而LoadBanlancer类型需要各个云厂商自己来实现的CloudControllerManager,所以,采用不同的云厂商,它们的LoadBanlancer也就会有一些区别,它们的功能以及使用方法也就不一样了。

2.1、Ingress转发外网请求

先来看下Ingress配置的yaml文件:

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: my-ingressspec:rules:- host: yifan-online.com    http:paths:- path: /app1        pathType: Prefix        backend:service:name: app1-service            port:name: http      - path: /app2        pathType: Prefix        backend:service:name: app2-service            port:name: http

此文件指定了一个名为“my-ingress”的Ingress,将传入的请求路由到两个不同的服务,其中一个服务名称为“app1-service”,另一个服务名称为“app2-service”。

请注意,此文件的规范部分中指定了两个规则,每个规则都包含一个主机名和一组路径规则。每个路径规则都指定了如何将传入请求路由到服务。

如要支持gRPC协议,配置的yaml文件如下:

apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: grpc-ingress  annotations:kubernetes.io/ingress.class: "nginx"nginx.ingress.kubernetes.io/backend-protocol: "GRPC"spec:rules:- host: yifan-online.com    http:paths:- path: /grpc        backend:serviceName: grpc-service          servicePort: 9000

在这个示例中,我们指定了Ingress类为nginx,并使用了nginx负载均衡器来支持gRPC协议。然后,我们定义了一个名为“grpc-service”的gRPC服务,它将运行在端口9000上。

接下来,我们定义了一个Ingress规则,它将传入的请求路由到主机“yifan-online.com”的“/grpc”路径。这个规则使用了我们先前定义的gRPC服务,并将所有请求转发到端口9000上的gRPC服务。

请注意,在此示例中,我们还使用了一个特殊的注释“nginx.ingress.kubernetes.io/backend-protocol: “GRPC””,它指定了gRPC作为后端协议。这个注释将告诉nginx负载均衡器将请求路由到gRPC服务。

上面的yaml文件,咱们知道如何通过Ingress服务来做请求转发,是通过host和path来识别请求,然后转发到backend的servieName和servicePort。

那么,外网的客户端,要怎么请求到这个Ingress呢?

这时候,还是需要有一个外网可访问LoadBanlancer来把外网请求接入进来,转发到Ingess上。

而上面的Ingress配置,只是一个配置转发的规则,还需要有一个真实存在的Ingress服务才可以实现上面的转发逻辑。

这时候,就需要例如:NginxIngress服务。

所以,还需要部署一个NginxIngress服务,当然也有很多其他类型的Ingress服务。

综上,我们再来看下Ingress方式的外网请求,是怎样的一个处理流程吧。
图片
上面的LoadBanlancer是云厂商提供的一个服务,所以也是要单独收费的。

Ingress服务需要在集群内部署一个Nginx服务(其他的Ingress服务也是类似)。

host+path是Ingress的转发规则,所有实现了IngressController的服务都是可以支持的。

那么再来看下LoadBanlancer吧。

2.2、LoadBanlancer接入外网请求

要配置Kubernetes中的LoadBalancer,可以编写一个LoadBalancer的Service YAML文件,其中包含有关如何将Kubernetes Service公开到外部的信息。

以下是一个基本的LoadBalancer Service YAML文件示例:

apiVersion: v1kind: Servicemetadata:name: my-loadbalancer-service  annotations:service.beta.kubernetes.io/aws-load-balancer-type: nlbspec:type: LoadBalancer  selector:app: my-app  ports:- name: http    port: 80targetPort: 8080protocol: TCP

在这个示例中,我们定义了一个名为“my-loadbalancer-service”的Service,它将使用LoadBalancer来公开Kubernetes集群中的应用程序。其中的“type: LoadBalancer”声明将告诉Kubernetes将此服务配置为使用LoadBalancer。

接下来,我们定义了一个选择器,它将选择具有标签“app: my-app”的Pod作为后端。我们还指定了一个端口“80”,它将用于将传入请求路由到Pod的端口“8080”。

请注意,这个示例还包含一个名为“service.beta.kubernetes.io/aws-load-balancer-type”的注释,它指定了LoadBalancer的类型。在这个示例中,我们使用了Amazon Web Services(AWS)的Network Load Balancer(NLB)类型。如果您使用的是其他云提供商或自己的LoadBalancer,您可以根据需要更改此注释。

完成了这个配置文件并且Service已经创建时,Kubernetes将为您创建一个LoadBalancer,并为您的应用程序分配一个唯一的IP地址。您可以使用此IP地址来访问您的应用程序。请注意,不同的云提供商可能会有不同的方式来访问LoadBalancer的IP地址。

很多云厂商在实现LoadBanlancer的时候,还会用到NodePort服务类型,比如:腾讯云的CLB。

再来看下LoadBanlancer的处理流程。

图片

最后,咱们再来看下NodePort这种外网访问方式吧。

2.3、NodePort接入外网请求

要配置一个Kubernetes的NodePort,您可以编写一个NodePort的Service YAML文件,其中包含有关如何暴露Kubernetes Service的信息。

以下是一个基本的NodePort Service YAML文件示例:

apiVersion: v1kind: Servicemetadata:name: my-nodeport-servicespec:type: NodePort  selector:app: my-app  ports:- name: http    port: 80targetPort: 8080protocol: TCP    nodePort: 30000

在这个示例中,我们定义了一个名为“my-nodeport-service”的Service,它将会使用NodePort来暴露Kubernetes集群内的应用程序。其中的“type: NodePort”声明将告诉Kubernetes将此服务配置为使用NodePort。

接下来,我们定义了一个选择器,它将选择具有标签“app: my-app”的Pod作为后端。我们还指定了一个端口“80”,它将用于将传入请求路由到Pod的端口“8080”。

此外,我们还指定了一个NodePort“30000”,这将是我们将用来从集群外访问Service的端口。Kubernetes将在集群节点上随机选择此端口。

请注意,您可以通过将“nodePort”字段留空来让Kubernetes自动选择端口。但是,为了避免端口冲突,建议指定一个特定的端口号。

当您完成了这个配置文件并且Service已经创建时,您可以使用集群节点的IP地址和NodePort来访问Service。例如,在这个示例中,您可以使用节点的IP地址和端口“30000”来访问应用程序。

K8S集群中的工作节点有外网IP,就可以通过这些外网IP+NodePort暴露的端口号来访问到K8S集群内部的服务了。

在 Kubernetes 中,NodePort 的端口号范围默认是从 30000 到 32767。这个范围可以通过 kube-apiserver 的 --service-node-port-range 参数进行配置。

在实际使用中,需要注意端口号的冲突问题,也要避免滥用NodePort暴露了外网端口引发的安全问题。

那我们再来看下NodePort的数据处理流程。

图片

创建一个 NodePort 类型的 Service 时,Kubernetes 会在集群中的每个节点上开放一个指定的端口号,例如 30000。每个节点上的 kube-proxy 组件会监听该端口号,并将所有流量转发到后端 Pod 的相应端口上。

具体来说,kube-proxy 会在每个节点上启动一个代理服务器(即 iptables 或者 IPVS),并为每个 Service 分配一个唯一的虚拟 IP 地址(即 ClusterIP)。当有请求到达 NodePort 时,kube-proxy 会根据负载均衡策略将请求转发到某个节点上,并使用该节点上的代理服务器将请求转发到相应的后端 Pod 上。后端 Pod 的响应将通过同样的方式返回给客户端。

看到这里,大家知道如何配置和使用这些服务了吗?

现在,你能完整的把一个外网请求,从LoadBanlancer到NodePort,再到Ingress,最后到服务实例的全部过程了吗?

3、总结和对比

3.1、Ingress、NodePort和LoadBalancer总结

Ingress、NodePort和LoadBalancer都是Kubernetes中用于将Service公开到外部的方法,但它们之间有一些区别和适用场景。以下是一些选择的建议:

  • Ingress:如果需要在同一IP地址和端口上公开多个服务,并根据请求路径或主机名进行路由,则可以使用Ingress。Ingress是Kubernetes中的一个抽象层,它可以将多个Service公开到同一个IP地址和端口上,并根据请求路径或主机名进行路由,非常适合用于Web应用程序。

  • NodePort:如果您需要将一个Service公开到集群外部,但又不想使用负载均衡器,则可以使用NodePort。NodePort将Service公开到所有节点的IP地址上,并将随机端口映射到目标端口。如果您只需要将一个Service公开到外部,并且您有一个静态IP地址或DNS名称来访问它,则NodePort可能是一个不错的选择。

  • LoadBalancer:如果您需要将一个Service公开到外部,并且需要一个负载均衡器来处理流量,则可以使用LoadBalancer。LoadBalancer可以将流量负载均衡到多个Pod之间,从而提高应用程序的可用性和可伸缩性。如果您正在运行在公共云环境中,例如AWS、Azure或GCP,那么您可以使用云提供商的负载均衡器服务,否则您可以使用Kubernetes自带的负载均衡器。

在云厂商的服务中,如果要使用Ingress暴露k8s集群内的服务到外网,实际上也会用到LoadBanlancer和NodePort类型,只是大家不必关心它的内部实现细节而已。

3.2、Ingress和网关的区别

Ingress是Kubernetes中的一个抽象层,它允许您公开多个服务到同一IP地址和端口,并根据请求路径或主机名进行路由。Ingress通常用于HTTP/HTTPS流量,并且可以支持TLS endpoint、基于路径的路由和负载均衡等功能。可以使用Kubernetes Ingress Controller实现Ingress功能,例如Nginx Ingress Controller、Traefik Ingress Controller和Istio Ingress Gateway。

网关(Gateway)通常是一个独立的组件,用于提供对应用程序的访问控制、身份验证、安全性、流量管理和监视等功能。网关通常可以支持多个协议和传输层,并且可以部署在Kubernetes集群之外,例如API网关、网络应用防火墙(WAF)和服务网格(Service Mesh)等。流量可以通过不同的方式路由到网关,例如DNS名、IP地址、负载均衡器和Ingress等。

简而言之,Ingress是Kubernetes中的一个抽象层,用于将多个服务公开到同一IP地址和端口,并根据请求路径或主机名进行路由,而网关则是提供对应用程序的访问控制、身份验证、安全性、流量管理和监视等功能的组件,它可以与Kubernetes集群一起使用,但也可以独立于Kubernetes集群之外部署。

在这里插入图片描述


在你停下来的时候,不要忘记别人还在后面奔跑,在你放弃的时候,不要忘记别人就在你的前面,只差一步而已。


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

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

相关文章

验证码demo(简单实现)

前言 我们注意到我们登录网站的时候经常会用到网络验证码,今天我们就简单实现一个验证码的前后端交互问题,做一个小demo 准备 我们这里并不需要依靠原生的java来实现,而是只需要引入一个maven依赖,使用现成的封装好的即可,这是我使用的是hutool工具包 网址:Hutool🍬…

17、GateWay和Sentinel继承实现服务限流

注:本篇文章主要参考周阳老师讲解的cloud进行整理的! 1、需求说明 cloudalibaba-sentinel-gateway9528 保护 cloudalibaba-provider-payment9001 2、启动nacos服务器8848 startup.cmd -m standalone 3、启动sentinel服务器8080 java -jar sentinel-dash…

Spring面试常见问题

目录 1、为什么要用Spring框架?2、有了spring为什么又出现了 springboot?3、springboot出现后为什么又出现了spring cloud?4、SpringBoot自动配置(重点)5、SpringBoot启动流程(重点)6、简单谈一…

美易官方:盘前道指期货涨0.02%,小非农超预期

在盘前交易中,道指期货微涨0.02%,市场气氛相对平稳。而与此同时,被市场称为“小非农”的美国ADP就业数据却超预期,显示出美国就业市场的强劲表现。这两个消息交织在一起,为今天的股市交易定下了基调。 美股股指期货周三…

Wireshark抓包分析TCP协议:三次握手和四次挥手

01、前言 面试中我们经常会被问到TCP协议的三次握手和四次挥手的过程,为什么总喜欢问这个问题呢? 其实我们平时使用的很多协议都是应用层协议,比如HTTP协议,https协议,DNS协议,FTP协议等;而应…

情感视频素材在哪找?8个视频素材大全网站

在追求创意表达的道路上,每一位视频创作者都是一名勇敢的探险家,不断寻找那些能够点亮作品、让故事生动起来的珍贵资源。无论你的目标是打动人心、传达信息,还是简单地分享生活,以下八个视频素材网站将为你的每一个项目提供无尽的…

定时器与晶振时钟、中断系统、定时中断

定时器 简介: C51中的定时器和计数器是同一个硬件电路支持的,通过寄存器配置不同,就可以将他当做定时器 或者计数器使用。 确切的说,定时器和计数器区别是致使他们背后的计数存储器加1的信号不同。当配置为定时器使用时&#xff0…

计算机视觉之三维重建(5)---双目立体视觉

文章目录 一、平行视图1.1 示意图1.2 平行视图的基础矩阵1.3 平行视图的极几何1.4 平行视图的三角测量 二、图像校正三、对应点问题3.1 相关匹配法3.2 归一化相关匹配法3.3 窗口问题3.4 相关法存在的问题3.5 约束问题 一、平行视图 1.1 示意图 如下图即是一个平行视图。特点&a…

视觉检测系统,外观细节无可挑剔

在传统行业中,利用人工检测来检测产品外观缺陷依然是主流,但由于竞争的加剧,对企业生产效率的要求也越来越高。传统的检测产品外观缺陷问题的方法就是透过人工目检,或者工人采用游标卡尺等工具检测,此种方式检测速度慢…

如何优化嵌入式系统的实时性能

大家好,今天给大家介绍如何优化嵌入式系统的实时性能,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。 优化嵌入式系统的实时性能是一个综合性的任务,涉及到…

【介绍什么是DDOS】

🌈个人主页:程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

C语言 | Leetcode C语言题解之第6题Z字形变换

题目&#xff1a; 题解&#xff1a; char * convert(char * s, int numRows){int n strlen(s), r numRows;if (r 1 || r > n) {return s;}int t r * 2 - 2;char * ans (char *)malloc(sizeof(char) * (n 1));int pos 0;for (int i 0; i < r; i) { // 枚举矩阵的…

wps没保存关闭了恢复数据教程

有时候我们因为电脑问题会忘记保存就关闭wps导致数据丢失&#xff0c;不知道wps没保存关闭了怎么恢复数据&#xff0c;其实数据是无法恢复的。 wps没保存关闭了怎么恢复数据 1、wps没有数据恢复功能&#xff0c;不过可以开启自动备份。 2、我们可以先点击wps左上角的“文件”…

tcpdump + wireshark 服务器抓包分析

tcpdump wireshark 服务器抓包分析 1.tcpdump安装2.tcpdump使用3.安装wireshark4.使用wireshark 本文用以总结使用tcpdump进行抓包&#xff0c;然后使用wireshark工具打开抓包出来的pacp文件进行分析。通过tcpdump可以实时监控到linux服务器中tcp和http、https等通讯的内容和信…

【C++进阶】二叉搜索树(来自二叉树的复仇)

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 总有光环在陨落&#xff0c;总有新星在闪烁 [本节目标] 1. 二叉搜索树…

软件架构风格_2.调用/返回体系结构风格

调用/返回风格是指在系统中采用了调用与返回机制。利用调用-返回实际上是一种分而治之的策略&#xff0c;其主要思想是将一个复杂的大系统分解为若干子系统&#xff0c;以便降低复杂度&#xff0c;并且增加可修改性。程序从其执行起点开始执行该构件的代码&#xff0c;程序执行…

使用 Docker 部署 Puter 云桌面系统

1&#xff09;Puter 介绍 :::info GitHub&#xff1a;https://github.com/HeyPuter/puter ::: Puter 是一个先进的开源桌面环境&#xff0c;运行在浏览器中&#xff0c;旨在具备丰富的功能、异常快速和高度可扩展性。它可以用于构建远程桌面环境&#xff0c;也可以作为云存储服…

基于单片机PM2.5监测系统仿真设计

**单片机设计介绍&#xff0c;基于单片机PM2.5监测系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机PM2.5监测系统仿真设计概要主要涉及通过单片机实现对PM2.5浓度的实时监测与显示&#xff0c;并通过仿真工…

Python快速入门系列-8(Python数据分析与可视化)

第八章:Python数据分析与可视化 8.1 数据处理与清洗8.1.1 数据加载与查看8.1.2 数据清洗与处理8.1.3 数据转换与整理8.2 数据可视化工具介绍8.2.1 Matplotlib8.2.2 Seaborn8.2.3 Plotly8.3 数据挖掘与机器学习简介8.3.1 Scikit-learn8.3.2 TensorFlow总结在本章中,我们将探讨…

hive词频统计---文件始终上传不来

目录 准备工作&#xff1a; 文件内容&#xff1a; 创建数据库及表 将文件上传到&#xff1a;上传到/user/hive/warehouse/db1.db/t_word目录下 hive里面查询&#xff0c;始终报错&#xff1a;&#xff08;直接查询也是不行&#xff09; 解决方案&#xff1a; 准备工作&am…