k8s中service概述(二)NodePort

news2025/3/28 6:13:27

NodePort 是 Kubernetes 中一种用于对外暴露服务的 Service 类型。它通过在集群的每个节点上开放一个静态端口(NodePort),使得外部用户可以通过节点的 IP 地址和该端口访问集群内部的服务。以下是关于 NodePort Service 的详细说明:


1. NodePort 的核心功能
  • 外部访问:NodePort 允许外部用户通过集群中任意节点的 IP 地址和指定的端口访问服务。

  • 端口映射:NodePort 会在每个节点上开放一个静态端口(默认范围是 30000-32767),并将该端口的流量转发到后端的 Pod。

  • 负载均衡:与 ClusterIP 类似,NodePort 也会自动将流量负载均衡到后端的多个 Pod。

  • 集群内部访问:NodePort Service 也会分配一个 ClusterIP,因此集群内部仍然可以通过 ClusterIP 访问服务。


2. NodePort 的工作原理

NodePort 的实现依赖于 Kubernetes 的网络模型和核心组件:

  1. Service 创建

    • 当创建一个 NodePort Service 时,Kubernetes 会为其分配一个 ClusterIP,并在每个节点上开放一个静态端口(NodePort)。

    • NodePort 的默认范围是 30000-32767,但可以手动指定。

  2. Endpoints 创建

    • 与 ClusterIP 类似,Kubernetes 会自动创建与 Service 同名的 Endpoints 对象,其中包含所有匹配 selector 的 Pod 的 IP 和端口。

  3. kube-proxy 的作用

    • 每个节点上的 kube-proxy 组件会监听 Service 和 Endpoints 的变化。

    • kube-proxy 通过以下方式实现流量转发:

      • iptables 模式:在节点上配置 iptables 规则,将流量从 NodePort 转发到后端 Pod。

      • IPVS 模式:使用更高效的 IPVS 实现流量转发。

    • 无论使用哪种模式,kube-proxy 都会确保流量被正确负载均衡到后端 Pod。

  4. 外部访问

    • 外部用户可以通过任意节点的 IP 地址和 NodePort 访问服务。

    • 例如,如果 NodePort 为 31000,节点的 IP 地址为 192.168.1.100,则外部用户可以通过 http://192.168.1.100:31000 访问服务。


3. NodePort 的配置示例

以下是一个典型的 NodePort Service 的 YAML 配置文件:

apiVersion: v1
kind: Service
metadata:
  name: my-service  # Service 名称
  namespace: default  # 命名空间,默认为 default
spec:
  type: NodePort  # Service 类型
  selector:
    app: my-app  # 选择标签为 app=my-app 的 Pod
  ports:
    - protocol: TCP  # 协议类型,支持 TCP、UDP、SCTP
      port: 80  # Service 暴露的端口
      targetPort: 9376  # 后端 Pod 的端口
      nodePort: 31000  # 手动指定的 NodePort,范围为 30000-32767
  • selector:用于选择后端 Pod,只有匹配标签的 Pod 才会被纳入 Service 的后端。

  • ports

    • port:Service 暴露的端口,集群内的其他服务通过该端口访问 Service。

    • targetPort:后端 Pod 实际监听的端口。

    • nodePort:手动指定的 NodePort,范围为 30000-32767。如果不指定,Kubernetes 会自动分配一个可用的端口。

  • type:Service 类型,这里设置为 NodePort


4. NodePort 的使用场景

NodePort 适用于以下场景:

  1. 开发和测试环境

    • 在开发和测试环境中,NodePort 可以快速暴露服务,方便外部访问和调试。

  2. 小型生产环境

    • 在小型生产环境中,如果没有负载均衡器,可以使用 NodePort 暴露服务。

  3. 特殊需求

    • 某些场景下,可能需要直接通过节点的 IP 地址访问服务,例如某些网络设备或旧系统。

  4. 与 LoadBalancer 结合使用

    • 在云环境中,NodePort 通常与 LoadBalancer 结合使用,LoadBalancer 会将外部流量导入 NodePort。


5. NodePort 的优缺点

优点

  • 简单易用,快速暴露服务。

  • 不需要额外的负载均衡器,适合小型环境。

  • 可以在任意节点上访问服务,具有较高的可用性。

缺点

  • 端口范围有限(30000-32767),可能与现有服务冲突。

  • 直接暴露节点的 IP 地址,可能存在安全风险。

  • 需要手动管理节点的 IP 地址,不适合大规模生产环境。


6. NodePort 的调试和排查
  1. 查看 Service 信息

    kubectl get svc <service-name>

    输出示例:

    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    my-service   NodePort    10.96.123.45    <none>        80:31000/TCP   5m
  2. 查看 Endpoints

    kubectl get endpoints <service-name>

    输出示例:

    NAME         ENDPOINTS                         AGE
    my-service   10.244.1.2:9376,10.244.2.3:9376   5m
  3. 检查节点端口

    • 登录到节点,检查 NodePort 是否正常开放:

      netstat -tuln | grep 31000
  4. 检查 kube-proxy 和 iptables/IPVS 规则

    • 登录到节点,检查 iptables 或 IPVS 规则是否正常配置。


7. 总结

NodePort 是 Kubernetes 中用于对外暴露服务的 Service 类型,它通过在集群的每个节点上开放一个静态端口,使得外部用户可以通过节点的 IP 地址和该端口访问集群内部的服务。NodePort 简单易用,适合开发和测试环境,但在生产环境中通常需要结合 LoadBalancer 或 Ingress 使用,以提供更高的可用性和安全性。

使用 NodePort 暴露 Nginx 服务的示例

以下是一个完整的示例,展示如何在 Kubernetes 中使用 NodePort Service 暴露一个 Nginx 服务。这个示例包括:

  1. 部署一个 Nginx Pod。

  2. 创建一个 NodePort Service 来暴露 Nginx 服务。


1. 创建 Nginx 部署

首先,创建一个 Deployment 来运行 Nginx Pod。以下是一个简单的 YAML 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment  # 部署名称
  labels:
    app: nginx  # 标签,用于 Service 选择
spec:
  replicas: 3  # 副本数
  selector:
    matchLabels:
      app: nginx  # 选择器,匹配 Pod 标签
  template:
    metadata:
      labels:
        app: nginx  # Pod 标签
    spec:
      containers:
        - name: nginx  # 容器名称
          image: nginx:latest  # 使用官方 Nginx 镜像
          ports:
            - containerPort: 80  # 容器监听的端口

将上述内容保存为 nginx-deployment.yaml,然后使用以下命令创建 Deployment:

kubectl apply -f nginx-deployment.yaml

2. 创建 NodePort Service

接下来,创建一个 NodePort Service 来暴露 Nginx 服务。以下是一个简单的 YAML 文件:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service  # Service 名称
spec:
  type: NodePort  # Service 类型
  selector:
    app: nginx  # 选择标签为 app=nginx 的 Pod
  ports:
    - protocol: TCP  # 协议类型
      port: 80  # Service 暴露的端口
      targetPort: 80  # 后端 Pod 的端口
      nodePort: 30080  # 手动指定的 NodePort,范围为 30000-32767

将上述内容保存为 nginx-service.yaml,然后使用以下命令创建 Service:

kubectl apply -f nginx-service.yaml

3. 验证部署和 Service
  1. 查看 Deployment 状态

    kubectl get deployments

    输出示例:

    
    
  2. 查看 Pod 状态

    kubectl get pods
    
    
    
  3. 查看 Service 状态

    kubectl get svc nginx-service
    
    
    

4. 访问 Nginx 服务
  1. 获取节点的 IP 地址

    使用kubect get nodes -o wide获取节点信息
    • 输出示例:

      
      
    • 可以发现节点ip
    • 如果你在云环境或物理机中,可以使用节点的公网或内网 IP。

  2. 通过 NodePort 访问 Nginx

    • 打开浏览器,访问 http://<NodeIP>:30080

    • 例如,如果节点 IP 是 192.168.30.130,则访问 http://192.168.30.130:30080

    • 你应该会看到 Nginx 的默认欢迎页面。

    • 可以在外部浏览器看到ngnix的页面


5. 清理资源

完成测试后,可以删除 Deployment 和 Service:

kubectl delete -f nginx-deployment.yaml
kubectl delete -f nginx-service.yaml

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle归档配置及检查

配置归档位置到 USE_DB_RECOVERY_FILE_DEST&#xff0c;并设置存储大小 startup mount; !mkdir /db/archivelog ALTER SYSTEM SET db_recovery_file_dest_size100G SCOPEBOTH; ALTER SYSTEM SET db_recovery_file_dest/db/archivelog SCOPEBOTH; ALTER SYSTEM SET log_archive…

刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型

在刷机维修过程中 。我们会遇到一些由于客户使用adb指令来禁用手机app而导致手机无法开机进入系统的故障机型。通常此类问题机型有好几种解决方法。但如果客户需要保数据来恢复机型。其实操作也是很简单的.还有类似误删除应用导致不开机等等如何保数据。 通过博文了解💝💝�…

Vue3 实战:基于 mxGraph 与 WebSocket 的动态流程图构建

本文将详细介绍如何在 Vue3 项目中集成 mxGraph 可视化库&#xff0c;并通过 WebSocket 实现画布元素的实时更新。适合有 Vue 基础的前端开发者学习参考。 一、技术栈准备 Vue3&#xff1a;采用 Composition API 开发mxGraph&#xff1a;JavaScript 流程图库&#xff08;版本 …

Ubuntu AX200 iwlwifi-cc-46.3cfab8da.0.tgz无法下载的解决办法

文章目录 前言一、检查网卡是否被识别二、确认内核模块是否可用1.AX200 wifi 要求内核5.12.检查 iwlwifi.ko 是否存在&#xff1a;3.如果未找到&#xff0c;可能是内核模块未正确生成。尝试安装 linux-modules-extra&#xff1a;4.再次检查 iwlwifi.ko 是否存在&#xff1a;5.确…

蓝桥杯,利用 Vue.js 构建简易任务管理器

在日常开发中&#xff0c;我们经常需要处理各种任务和计划。一个简单且高效的任务管理器可以帮助我们更好地组织和安排时间。今天&#xff0c;我将向大家展示如何使用 Vue.js 构建一个简易的任务管理器。这个项目不仅能够帮助我们更好地理解 Vue.js 的基本语法和功能&#xff0…

Elasticsearch + Docker:实现容器化部署指南

Elasticsearch是一款强大的分布式搜索和分析引擎&#xff0c;广泛应用于日志分析、全文检索、实时数据分析等场景。而Docker作为一种轻量级的容器化技术&#xff0c;能够帮助开发者快速部署和管理应用。将Elasticsearch与Docker结合&#xff0c;不仅可以简化部署流程&#xff0…

win32汇编环境,网络编程入门之十一

;win32汇编环境,网络编程入门之十一 ;在上一教程里&#xff0c;我们学习了如何读取大容量的网页内容&#xff0c;在这一教程里&#xff0c;我们学习一下如何在wininet或winhttp机制中提取网页中的超链接 ;>>>>>>>>>>>>>>>>>…

穿越之程序员周树人的狂人日记Part3__人机共生纪元

穿越之程序员周树人的狂人日记Part3__人机共生纪元 代码知识点&#xff1a;协程、内存管理、版本控制 故事一【协程陷阱】择偶标准的多核运算 故事二【内存泄漏】中产幻觉的垃圾回收 故事三【版本控制】人设仓库的强制推送 故事四【容器化生存】&#xff1a;员工生存之现状 静夜…

后端——AOP异步日志

需求分析 在SpringBoot系统中&#xff0c;一般会对访问系统的请求做日志记录的需求&#xff0c;确保系统的安全维护以及查看接口的调用情况&#xff0c;可以使用AOP对controller层的接口进行增强&#xff0c;作日志记录。日志保存在数据库当中&#xff0c;为了避免影响接口的响…

循环查询指定服务器开放端口(Python)

循环查询指定服务器开放端口列表 # Time : 2025/3/22 # Author : cookie # Desc :import socket import concurrent.futures from datetime import datetime# 设置目标IP和端口范围 target_ip input("请输入目标IP地址: ") start_port int(input("请输入…

【STM32】第一个工程的创建

目录 1、获取 KEIL5 安装包2、开始安装 KEIL52.1、 激活2.2、安装DFP库 3、工程创建4、搭建框架5、开始编写代码 1、获取 KEIL5 安装包 要想获得 KEIL5 的安装包&#xff0c;在百度里面搜索“KEIL5 下载”即可找到很多网友提供的下载文件&#xff0c;或者到 KEIL 的官网下载&a…

SpringBoot+策略模式+枚举类,优雅消除if-else

需求分析 公司做物联网系统的&#xff0c;使用nettry进行设备连接&#xff0c;对设备进行数据采集&#xff0c;根据设备的协议对数据进行解析&#xff0c;解析完成之后存放数据库&#xff0c;但是不同厂家的设备协议不同。公司系统使用了使用了函数式编程的去写了一个解析类&am…

前端框架学习路径与注意事项

学习前端框架是一个系统化的过程&#xff0c;需要结合理论、实践和工具链的综合掌握。以下是学习路径的关键方面和注意事项&#xff1a; 一、学习路径的核心方面 1. 基础概念与核心思想 组件化开发&#xff1a;理解组件的作用&#xff08;复用性、隔离性&#xff09;、组件通信…

Linux驱动开发-①platform平台②MISC字符驱动框架③input框架

Linux驱动开发-①platform平台②MISC字符驱动框架③input框架 一&#xff0c;platform1.1 platform框架&#xff08;设备树下&#xff09;1.2 platform框架&#xff08;配置设备函数&#xff09; 二&#xff0c;MISC字符驱动框架三&#xff0c;input框架 一&#xff0c;platfor…

【mysql】唯一性约束unique

文章目录 唯一性约束 1. 作用2. 关键字3. 特点4. 添加唯一约束5. 关于复合唯一约束 唯一性约束 1. 作用 用来限制某个字段/某列的值不能重复。 2. 关键字 UNIQUE3. 特点 同一个表可以有多个唯一约束。唯一约束可以是某一个列的值唯一&#xff0c;也可以多个列组合的值唯…

常见中间件漏洞:Jboss篇

CVE-2015-7501 环境搭建 cd vulhub-master/jboss/JMXInvokerServlet-deserialization docker-compose up -d 过程 访问网址&#xff0c;存在页面说明接口存在且存在反序列化漏洞 http://8.130.17.222:8080/invoker/JMXInvokerServlet 2.下载 ysoserial ⼯具进⾏漏洞利⽤…

2025年优化算法:龙卷风优化算法(Tornado optimizer with Coriolis force,TOC)

龙卷风优化算法&#xff08;Tornado optimizer with Coriolis force&#xff09;是发表在中科院二区期刊“ARTIFICIAL INTELLIGENCE REVIEW”&#xff08;IF&#xff1a;11.7&#xff09;的2025年智能优化算法 01.引言 当自然界的狂暴之力&#xff0c;化身数字世界的智慧引擎&…

3.24-3 接口测试断言

一.postman 断言 1.断言再test中 #状态码是否等于200 tests["Status code is 200"] responseCode.code 200; #断言响应时间小于200ms tests["Response time is less than 200ms"] responseTime < 200; #断言响应体包含内容 tests["Body…

DeepSeek面试——模型架构和主要创新点

本文将介绍DeepSeek的模型架构多头潜在注意力&#xff08;MLA&#xff09;技术&#xff0c;混合专家&#xff08;MoE&#xff09;架构&#xff0c; 无辅助损失负载均衡技术&#xff0c;多Token 预测&#xff08;MTP&#xff09;策略。 一、模型架构 DeepSeek-R1的基本架构沿用…

Python----计算机视觉处理(Opencv:图像亮度变换)

一、图像亮度变换 亮度调整&#xff1a;图像像素强度整体变高或者变低。 对比度调整&#xff1a;图像暗处像素强度变低&#xff0c;图像亮处像素强度变高&#xff0c;从而拉大中间某个区域范围的显示精 度。 A&#xff1a;原图 …