百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

kubernetes基础知识之service的NodePort模式

zhezhongyun 2025-03-26 19:09 23 浏览

kubernetes service的工作模式包括:ClusterIP模式、NodePort模式、LoadBalancer模式、ExternalName模式。

NodePort模式的作用:主要是把集群内部的服务暴露出集群以外。

如果是集群内部的互相沟通,可以通过ClusterIP模式去使用。

原因:NodePort是一种升级版的ClusterIP,不仅可以做到ClusterIP拥有的功能,还支持在当前的物理网卡上绑定一个物理接口,以此实现外部访问。但是功能越多,相当于它消耗的代价就会越高。但是如果不需要集群外部访问,又消耗了更多的一些额外的资源,那肯定不是最理想的,所以一定要有它的功能或者需要使用它的功能,我们再开启或者升级,而不是一次给它上到最高,那可能会带来一定的资源浪费。

NodePort的架构:

①:底层通过deployment控制器创建几个pod。

②:给这些底层pod创建一个ipvs的clusterip类型的服务svc。

③:再次,创建一个deployment类型的控制器,运行一些nginx的pod。这些nginx被nodeport类型的服务所匹配和关联,再绑定到当前物理节点对应物理网卡的物理端口之上。端口范围一般是大于3万,端口范围是30000到32767号端口。

④:NodePort类型服务在物理节点对应物理网卡的物理接口范围是大于3万的,可以在kube-apiserver启动的时候去定义这个端口范围。可以启动kube-apiserver时指定--service-node-port-range=30000-32767去设置。

定义nodeport类型服务的资源清单文件service-nodeport.yaml:

apiVersion: v1

kind: Service

metadata:

name: myapp-nodeport

namespace: default

spec:

type:NodePort

selector:

app: myapp

release: stabel

svc: nodeport

ports:

- name: http

port: 80

targetPort: 80

nodePort: 30010

这是当前nodeport类型service的资源清单。这个服务service标签选择器中的标签应该是被匹配pod标签的子集。ports定义当前集群的端口,前面是横杠-表示是对象列表,端口是可以写多个的。NodePort模式可以理解成是ClusterIP模式的升级版本,targetPort代表后端真实服务器的端口号,nodePort代表当前物理网卡上绑定的物理端口号,默认是大于三万的,而且官方强烈不建议通过nodeport手动指定这个端口号,官方会自动去分配nodePort这个端口号。这是一种更理想的状态,防止端口号冲突。

K8s进入容器:

kubectl exec -it $pod_name -c $container_name -n $namespace_name -- /bin/sh

touch deployment-nodeport.yaml:

apiVersion: apps/v1

kind: Deployment

metadata:

name: myapp-nodeport-deploy

namespace: default

spec:

replicas: 3

selector:

matchLabels:

app: myapp

release: stabel

svc: nodeport

template:

metadata:

labels:

app: myapp

release: stabel

env: test

svc: nodeport

spec:

containers:

- name: myapp-container

image: nginx

imagePullPolicy: Always

ports:

- name: http

containerPort: 80

控制器期望spec里面选择器匹配3个标签组成的集合,template就是创建pod的模板。pod模板里面的标签,定义了4个,是满足标签选择器标签的集合的。

创建deployment类型的pod:

kubectl apply -f deployment-nodeport.yaml

查看创建出来的pod:

kubectl get pod --all-namespaces | grep myapp-nodeport-deploy

会查看到运行了3个副本的pod。

创建nodeport类型的service:

kubectl apply -f service-nodeport.yaml

查看创建出来的服务:

kubectl get svc --all-namespaces| grep myapp-nodeport

可以看到,访问集群的30010端口,相当于是访问物理网卡的物理端口。

80号端口就是在集群内部需要访问这个service时可以使用的一个端口,配合着CLUSTER-IP私有IP和这个集群内部端口,我们就可以使用负载均衡的方案访问到它们。80号端口表示通过后端访问集群负载调度器,负载调度器的端口号是80。

NodePort类型的服务service,可以看作是一种升级版的ClusterIP类型。

访问路径是:nodeIP:NodePort-->CLUSTER-IP:Port-->Pod_IP:targetPort

nodeport端口号表示当前物理网卡上绑定的物理的端口号。

使用vim编辑文件的时候,出现格式错乱的情况,可以输入set paste设置粘贴模式之后再粘贴。

Nodeport端口号30010代表物理网卡访问的端口。

80端口是集群内部访问服务的端口,CLUSTER-IP配合着80端口,就可以在集群内部以负载均衡的方式访问到服务。

nodePort类型服务可以理解成一种升级版的clusterip类型服务。

查看当前ipvs负载均衡的规则:

ipvsadm -Ln

可以看到负载均衡规则中的算法、后端真实服务器的IP地址。

查看后端真实服务器的地址:

kubectl get pod -o wide -n $namespace_name

NodePort类型的服务,可以通过CLUSTER-IP:Port的方式在集群内部访问到。

查看pod信息:

kubectl get pod --all-namespaces

进入容器:

kubectl exec -it $pod_name -c $container_name -n $namespace_name -- /bin/bash

wget $svc_name.$namespace_name.svc.cluster.local./hostname.html && cat hostname.html && rm -rf hostname.html

可以知道,在集群内部的容器内部通过域名解析也可以实现nodeport 类型服务的访问。

nodeport类型的服务支持clusterip类型的所有功能。额外的功能就来自于物理网卡nodeport 定义的对外端口以外的访问。

如果一个worker node节点有多块网卡的话,那么它会把当前机器的每一块可用网卡的地址都创建一个ipvs 集群。它会根据当前网卡的实际信息去编写当前的负载均衡集群。可以通过浏览器访问NodeIP:NodePort的方式去访问nodeport 类型服务的对外提供服务的端口。

从集群以外的网络通过当前机器的物理网卡可以访问到kubernetes集群内部。

Nodeport是将集群内部的服务暴露到集群以外的用户的一个非常有效的手段。

当前的每一个物理节点物理网卡的nodeport端口都可以访问,并且是负载均衡的。我们可从每一个节点上去访问到我们当前的后端pod,是没有任何问题的。只要是当前kubernetes 节点,只要创建了nodeport类型的服务,那当前的nodeport 端口每一个节点的每一个物理网卡的每一个物理有效的网卡IP都可以进行外部访问。

在真正的生产环境中,我们可能需要在外部再加一个调度器去负载到当前的每一个节点。以此保证当前的任何一个节点宕机,不会造成我们用户的访问中断。这就是nodeport类型服务的特性。

景色

鼓励的话语:海到尽头天作岸,山登绝顶我为峰。不屈的意志,会带我们杀出重围。具有坚定的信念,坚强的毅力,顽强的斗志,我们的人生终将辉煌!

相关推荐

JPA实体类注解,看这篇就全会了

基本注解@Entity标注于实体类声明语句之前,指出该Java类为实体类,将映射到指定的数据库表。name(可选):实体名称。缺省为实体类的非限定名称。该名称用于引用查询中的实体。不与@Tab...

Dify教程02 - Dify+Deepseek零代码赋能,普通人也能开发AI应用

开始今天的教程之前,先解决昨天遇到的一个问题,docker安装Dify的时候有个报错,进入Dify面板的时候会出现“InternalServerError”的提示,log日志报错:S3_USE_A...

用离散标记重塑人体姿态:VQ-VAE实现关键点组合关系编码

在人体姿态估计领域,传统方法通常将关键点作为基本处理单元,这些关键点在人体骨架结构上代表关节位置(如肘部、膝盖和头部)的空间坐标。现有模型对这些关键点的预测主要采用两种范式:直接通过坐标回归或间接通过...

B 客户端流RPC (clientstream Client Stream)

客户端编写一系列消息并将其发送到服务器,同样使用提供的流。一旦客户端写完消息,它就等待服务器读取消息并返回响应gRPC再次保证了单个RPC调用中的消息排序在客户端流RPC模式中,客户端会发送多个请...

我的模型我做主02——训练自己的大模型:简易入门指南

模型训练往往需要较高的配置,为了满足友友们的好奇心,这里我们不要内存,不要gpu,用最简单的方式,让大家感受一下什么是模型训练。基于你的硬件配置,我们可以设计一个完全在CPU上运行的简易模型训练方案。...

开源项目MessageNest打造个性化消息推送平台多种通知方式

今天介绍一个开源项目,MessageNest-可以打造个性化消息推送平台,整合邮件、钉钉、企业微信等多种通知方式。定制你的消息,让通知方式更灵活多样。开源地址:https://github.c...

使用投机规则API加快页面加载速度

当今的网络用户要求快速导航,从一个页面移动到另一个页面时应尽量减少延迟。投机规则应用程序接口(SpeculationRulesAPI)的出现改变了网络应用程序接口(WebAPI)领域的游戏规则。...

JSONP安全攻防技术

关于JSONPJSONP全称是JSONwithPadding,是基于JSON格式的为解决跨域请求资源而产生的解决方案。它的基本原理是利用HTML的元素标签,远程调用JSON文件来实现数据传递。如果...

大数据Doris(六):编译 Doris遇到的问题

编译Doris遇到的问题一、js_generator.cc:(.text+0xfc3c):undefinedreferenceto`well_known_types_js’查找Doris...

网页内嵌PDF获取的办法

最近女王大人为了通过某认证考试,交了2000RMB,官方居然没有给线下教材资料,直接给的是在线教材,教材是PDF的但是是内嵌在网页内,可惜却没有给具体的PDF地址,无法下载,看到女王大人一点点的截图保...

印度女孩被邻居家客人性骚扰,父亲上门警告,反被围殴致死

微信的规则进行了调整希望大家看完故事多点“在看”,喜欢的话也点个分享和赞这样事儿君的推送才能继续出现在你的订阅列表里才能继续跟大家分享每个开怀大笑或拍案惊奇的好故事啦~话说只要稍微关注新闻的人,应该...

下周重要财经数据日程一览 (1229-0103)

下周焦点全球制造业PMI美国消费者信心指数美国首申失业救济人数值得注意的是,下周一希腊还将举行第三轮总统选举需要谷歌日历同步及部分智能手机(安卓,iPhone)同步日历功能的朋友请点击此链接,数据公布...

PyTorch 深度学习实战(38):注意力机制全面解析

在上一篇文章中,我们探讨了分布式训练实战。本文将深入解析注意力机制的完整发展历程,从最初的Seq2Seq模型到革命性的Transformer架构。我们将使用PyTorch实现2个关键阶段的注意力机制变...

聊聊Spring AI的EmbeddingModel

序本文主要研究一下SpringAI的EmbeddingModelEmbeddingModelspring-ai-core/src/main/java/org/springframework/ai/e...

前端分享-少年了解过iframe么

iframe就像是HTML的「内嵌画布」,允许在页面中加载独立网页,如同在画布上叠加另一幅动态画卷。核心特性包括:独立上下文:每个iframe都拥有独立的DOM/CSS/JS环境(类似浏...