循序渐进kubenetes Service(Cluster ip、Nodeport、Loadbalancer)
文章目录
- 部署一个web服务
- Kubernetes Port Forward
- Kubernetes Services
- ClusterIP Service
- NodePort Service
- LoadBalancer Service
部署一个web服务
准备 Kubernetes 集群后,创建一个名为 web 的新 namespace,然后在该 namespace 中部署一个简单的 web 应用。
cat <<EOF | kubectl apply -n web -f -
apiVersion: apps/v1
kind: Deployment
metadata:name: webserver
spec:replicas: 1selector:matchLabels:app: webservertemplate:metadata:labels:app: webserverspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80volumeMounts:- name: web-contentmountPath: /usr/share/nginx/htmlvolumes:- name: web-contentconfigMap:name: webserver-config
---
apiVersion: v1
kind: ConfigMap
metadata:name: webserver-config
data:index.html: |<html><head><title>Hello World</title></head><body><h1>Hello, world!</h1></body></html>
EOF
通过执行 kubectl get po -n web 检查 web 服务器是否部署成功。该命令列出 web namespace 中的部署,输出结果应类似于提供的示例。
❯ kubectl get po -n web
NAME READY STATUS RESTARTS AGE
webserver-7823kj2ka-32k23 1/1 Running 0 22s
Kubernetes 完成 Web 服务的部署流程:Deployment 创建副本(Replica),再生成 Pod,最终通过 Pod 提供 ConfigMap 定义的“Hello, World”页面内容。

Kubernetes Port Forward
使用 kubectl port-forward 命令,可以快速验证已部署的 Web 服务是否正常提供内容。
❯ kubectl port-forward pod/<POD_NAME> 8080:80 -n web
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
将 <POD_NAME> 替换为实际的 Pod 名称后,您可以通过 kubectl port-forward 命令在本地访问 Web 服务器,可以使用 curl 或网页浏览器等工具进行访问。
curl 127.0.0.1:8080
<html>
<head><title>Hello World</title></head>
<body>
<h1>Hello, world!</h1>
</body>
</html>
虽然 port-forward 提供了对 Web 服务器的即时访问,但它并不是一个永久性的解决方案。当您终止该命令时,端口转发会停止,而且这种方法仅在本地环境中有效,其他人无法通过此方法访问 Web 服务器。
Kubernetes Services
在 Kubernetes 中,Service 用于提供稳定的网络连接,定义如何访问一组逻辑上的 Pod。它通过分配一致的 IP 地址和可选的 DNS 名称,确保即使 Pod 更新或扩展后仍然可以被访问。
- 检查服务:运行 kubectl get svc 查看当前服务列表。
- 多种服务类型:Kubernetes 提供不同类型的服务以满足多样化需求,后续将详细说明每种类型的用途及适用场景。
ClusterIP Service
ClusterIP 类型的 Service 允许内部网络与 Pod 之间的通信。如果您想设置一个能让外部访问您的应用的服务,这并不是合适的选择。

执行 YAML 配置文件以创建一个 ClusterIP 类型的服务。
cat <<EOF | kubectl apply -n web -f -
apiVersion: v1
kind: Service
metadata:name: webserver-servicenamespace: web
spec:type: ClusterIPselector:app: webserverports:- port: 80targetPort: 80
EOF
设置完成后,我们验证 ClusterIP 类型服务是否正常,方法是在集群内启动一个临时容器,并使用它来尝试连接 Web 服务器。
kubectl run curlpod --image=radial/busyboxplus:curl -i --tty --rm --namespace web
驗證內部對我們 Web 服務器的訪問
[ root@curlpod:/ ]$ wget -O- http://webserver-service:80
Connecting to webserver-service:80 (10.97.170.117:80)
<html>
<head><title>Hello World</title></head>
<body>
<h1>Hello, world!</h1>
</body>
</html>
- 100% |*******************************| 93 0:00:00 ETA
测试成功,但要记住 ClusterIP 的局限性:它仅提供内部网络的访问。使用这种设置,无法实现对服务的外部访问。
NodePort Service
NodePort 服务为集群和 Web 应用程序提供了一个外部访问的网关。它通过在 Kubernetes 集群的节点级别上暴露一个特定端口来运行。到达该节点端口的流量会被转发到相应的服务,而服务会进一步将流量路由到你的 Web 应用程序。
以下是一张图表,展示了 NodePort 服务在 Kubernetes 集群中的工作原理。

首先,使用以下命令删除现有的服务:
kubectl delete svc webserver-service -n web
接下来,将创建一个 NodePort 类型的服务。将以下内容复制粘贴到终端中执行。
cat <<EOF | kubectl apply -n web -f -
apiVersion: v1
kind: Service
metadata:name: webserver-nodeportnamespace: web
spec:type: NodePortselector:app: webserverports:- port: 80targetPort: 80nodePort: 30007
EOF
通过运行命令,可以验证 NodePort 服务的正确配置,特别是检查分配的节点端口是否符合预期。
kubectl get service webserver-nodeport -n web -o=jsonpath='{.spec.ports[0].nodePort}'
要测试对我们 Web 服务器的外部访问,我们需要获取节点的 IP 地址。可以使用以下命令获取:
kubectl get nodes -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
webserver-nodeport NodePort 10.99.77.25 172.19.6.5 80:30007/TCP 56m
external ip返回為空,Kubernetes 集群是纯内部网络环境,未设置外部访问,也就是默认未启用externalIPs,现在给它patch上
kubectl patch svc webserver-nodeport -n web -p '{"spec":{"externalIPs":["172.19.6.5"]}}'
service/webserver-nodeport patched
kubectl get svc -n web
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
webserver-nodeport NodePort 10.99.77.25 172.19.6.5 80:30007/TCP 58m
结合节点 IP 和 NodePort,验证 NodePort 服务的外部访问是否正常。
curl http://172.19.6.5:30007
<html>
<head><title>Hello World</title></head>
<body>
<h1>Hello, world!</h1>
</body>
</html>
kubeuser@k8smaster:~/yaml$ curl http://172.19.6.5:30007
<html>
<head><title>Hello World</title></head>
<body>
<h1>Hello, world!</h1>
</body>
</html>
看到“Hello, World”。代表连接成功,如果无法连接,请检查网络的防火墙规则,确保端口 30007 的入站流量被允许。
注意:
由于我的环境使用的是cilium cni插件,默认enable-node-port: “false”,需要使用如下命令设置enable-node-port: “true”
kubectl edit configmap cilium-config -n kube-system
NodePort 提供了快速的外部访问,但通常不会在生产环境中使用,因为它暴露的范围较广且缺乏负载均衡功能。它会在所有集群节点上暴露相同的端口,这可能导致流量集中于某个节点,从而造成潜在的瓶颈。因此,NodePort 更适合用于开发和测试场景,优先解决快速便捷的外部访问需求。
LoadBalancer Service
ClusterIP 仅支持内部通信的局限性,以及 NodePort 在生产环境中存在缺点缺点(如缺乏流量均衡)
而LoadBalancer 服务利用云提供商的负载均衡器为 Kubernetes 提供高效的外部流量管理。它结合了云基础设施的能力,适合需要稳定、高效流量分发的生产环境,弥补了 ClusterIP 和 NodePort 的不足之处。

LoadBalancer 服务 通过分配公网 IP 或 DNS 名称,简化了从外部访问服务的过程。它将流量路由到服务的端口,并最终分发到目标 Pod,是生产环境中常用的解决方案。配置步骤包括先移除 NodePort 服务,然后定义新的 LoadBalancer 服务配置文件并应用。
kubectl delete svc webserver-nodeport --namespace=web
创建loadbalancer
kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:name: webserver-loadbalancernamespace: web
spec:type: LoadBalancerselector:app: webserverports:- protocol: TCPport: 80targetPort: 80
EOF
创建 LoadBalancer 服务时,Kubernetes 会与云提供商交互,自动配置外部负载均衡器。在负载均衡器完成部署之前,您可能会看到 EXTERNAL-IP 的状态为“pending”,需等待一段时间以完成整个流程。
kubectl get svc -n web
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
webserver-loadbalancer LoadBalancer 10.99.54.59 <pending> 80:32391/TCP 7s
当负载均衡器启动后,其 IP 地址(在 kubectl get svc 输出中的 EXTERNAL-IP 列下显示)将允许您从外部访问您的 Web 服务器。尝试使用以下命令进行访问:
curl http://32.151.191.41:80 <html>
<head><title>Hello World</title></head>
<body>
<h1>Hello, world!</h1>
</body>
</html>
删除 LoadBalancer 服务会连同云提供商创建的负载均衡器一并移除。尽管 LoadBalancer 提供了外部访问能力,但生产环境中更推荐使用 Ingress,因其更灵活且适合复杂流量管理需求。
删除loadbalancer
kubectl delete svc webserver-loadbalancer -n web
#总结
Kubernetes 服务的三种常用类型:ClusterIP、NodePort 和 LoadBalancer。ClusterIP 用于内部通信,NodePort 提供外部访问但有局限性,而 LoadBalancer 则与云服务结合,提供更高效的流量管理。每种类型都有其特定的使用场景和限制,理解这些有助于为更复杂的网络解
相关文章:
循序渐进kubenetes Service(Cluster ip、Nodeport、Loadbalancer)
文章目录 部署一个web服务Kubernetes Port ForwardKubernetes ServicesClusterIP ServiceNodePort ServiceLoadBalancer Service 部署一个web服务 准备 Kubernetes 集群后,创建一个名为 web 的新 namespace,然后在该 namespace 中部署一个简单的 web 应…...
深入理解 Apache Shiro:安全框架全解析
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在…...
mac 安装CosyVoice (cpu版本)
CosyVoice 介绍 CosyVoice 是阿里研发的一个tts大模型 官方项目地址:https://github.com/FunAudioLLM/CosyVoice.git 下载项目(非官方) git clone --recursive https://github.com/v3ucn/CosyVoice_for_MacOs.git 进入项目 cd CosyVoic…...
币安移除铭文市场的深度解读:背后原因及其对区块链行业的影响
引言: 就在昨天,2024年12月10号,币安宣布将移除铭文市场(Inscriptions Market)。这一消息引发了全球加密货币社区的广泛关注,尤其是在比特币NFT和数字收藏品市场快速发展的背景下。铭文市场自诞生以来迅速…...
深度学习实战野生动物识别
本文采用YOLOv11作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv11以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对野生动物数据集进行训练和优化,该数据集包含丰富的野生动物图像样…...
windows安装使用conda
在Windows系统上安装和使用Conda的详细步骤如下: 一、下载Conda安装包 访问Conda的官方网站Anaconda | The Operating System for AI,点击“Downloads”按钮。在下载页面,选择适合您系统的安装包。通常,对于Windows系统…...
手机租赁系统开发全流程解析与实用指南
内容概要 在如今快速发展的科技时代,手机租赁系统已经成为一种新兴的商业模式,非常符合当下市场需求。那么,在开发这样一个系统的时候,首先要从需求分析和市场调研开始。在这一阶段,你需要了解用户需要什么࿰…...
SpringBoot 开发—— YAML文件深度分析
文章目录 一、YAML概述二、数据表示三、YAML 的语法四、YAML 的应用五、YAML 与其他格式的比较1、YAML vs .properties文件可读性和结构数据类型支持扩展性和灵活性使用场景性能和支持2、YAML vs. JSON3、YAML vs. XML六、使用 YAML 的注意事项七、总结YAML 是非常流行的一种配…...
复合机器人整体解决方案
复合机器人是一种集成移动机器人和协作机器人两项功能为一身的新型机器人,更符合人们想象中“脑、眼、手、脚”融合的机器人终极形态。复合机器人的整体解决方案通常涉及多个方面,包括机器人本体、控制系统、感知系统、执行系统以及周边配套设备等。以下…...
【Oracle11g SQL详解】日期和时间函数:SYSDATE、TO_DATE、TO_CHAR 等
日期和时间函数:SYSDATE、TO_DATE、TO_CHAR 等 在 Oracle 数据库中,日期和时间函数用于处理日期和时间数据。它们在记录创建时间、分析时间间隔、格式化输出等场景中非常重要。本文将详细讲解常用的日期和时间函数及其应用。 一、SYSDATE:获…...
VSCode设置字体
参考文章:【面向小白】vscode最佳实践(2)—— 字体设置(fira code更纱黑体),这篇文章末尾给了安装字体的链接。 配置的字体还是很好看的。 ‘Fira Code Retina’, ‘Sarasa Mono Sc’ 需要注意的一个点&am…...
shell编程入门之提取字符并设置rtc时间
awk用法 awk是一款文本处理工具,通常在Unix和Linux操作系统中使用,用于以行为单位对文本进行处理和操作。它可以读取输入文本,对其进行处理,生成报表、统计信息等,并将结果输出到标准输出设备中。 它主要有以下特点&…...
react 不可变数据更新(Immutable Update)合并对象 类似与Java 的BeanUtils.copyProperties
{ ...state, // 保留原有的 state 的其他部分data: { ...state.data, // 保留 state.data 中的其他字段...action.payload // 使用 action.payload 覆盖 state.data 中需要更新的字段} }这段代码是 Redux 中常见的一种状态更…...
Linux GCC基础用法⑦
在 CentOS 7 系统中使用 GCC 与编写 99 乘法表 一、GCC 简介 GCC(GNU Compiler Collection)是一套功能强大的编程语言编译器,在 CentOS 7 系统中广泛用于编译 C、C等多种编程语言的程序。它能够将源代码转换为可执行文件,让计算…...
PyTorch 切片运算 (Slice Operator)
PyTorch 切片运算 {Slice Operator} 1. [:, -1, :]2. [:, [-1], :]References 1. [:, -1, :] https://github.com/karpathy/llama2.c/blob/master/model.py import torchlogits torch.arange(1, 16) print("logits.shape:", logits.shape) print("logits:\n&…...
SpringSecurity Oauth2 -账号密码实现多因子身份认证
1. 密码策略问题 CREATE TABLE t_storage (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 自增主键,nameSpace varchar(64) NOT NULL COMMENT 隔离字段,groupId varchar(128) NOT NULL COMMENT 分组,比如不同app,dataId varchar(64) NOT NULL COMMENT 数据存储id…...
【CSS in Depth 2 精译_071】11.4 思考字体颜色的对比效果 + 11.5 本章小结
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 11.1.1 模式的建立11.1.2 还原设计稿 11.2 颜色的定义 11.2.1 色域与色彩空间11.2.2 CSS 颜色表示法 11.2.2.1 RGB…...
Y3编辑器文档4:触发器1(对话、装备、特效、行为树、排行榜、不同步问题)
文章目录 一、触发器简介1.1 触发器界面1.2 ECA语句编辑及快捷键1.3 参数设置1.4 变量设置1.5 实体触发器1.6 函数库与触发器复用 二、触发器的多层结构2.1 子触发器(在游戏内对新的事件进行注册)2.2 触发器变量作用域2.3 复合条件2.4 循环2.5 计时器2.6…...
趣味编程:猜拳小游戏
1.简介 这个系列的第一篇以猜拳小游戏开始,这是源于我们生活的灵感,在忙碌的时代中,我们每个人都在为自己的生活各自忙碌着,奔赴着自己所走向的那条路上,即使遍体鳞伤。 但是,生活虽然很苦,也不…...
软件工程 概述
软件 不仅仅是一个程序代码。程序是一个可执行的代码,它提供了一些计算的目的。 软件被认为是集合可执行的程序代码,相关库和文档的软件。当满足一个特定的要求,就被称为软件产品。 工程 是所有有关开发的产品,使用良好定义的&…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
验证redis数据结构
一、功能验证 1.验证redis的数据结构(如字符串、列表、哈希、集合、有序集合等)是否按照预期工作。 2、常见的数据结构验证方法: ①字符串(string) 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...
二叉树-144.二叉树的前序遍历-力扣(LeetCode)
一、题目解析 对于递归方法的前序遍历十分简单,但对于一位合格的程序猿而言,需要掌握将递归转化为非递归的能力,毕竟递归调用的时候会调用大量的栈帧,存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧,而非…...
Vue3学习(接口,泛型,自定义类型,v-for,props)
一,前言 继续学习 二,TS接口泛型自定义类型 1.接口 TypeScript 接口(Interface)是一种定义对象形状的强大工具,它可以描述对象必须包含的属性、方法和它们的类型。接口不会被编译成 JavaScript 代码,仅…...
AI书签管理工具开发全记录(十八):书签导入导出
文章目录 AI书签管理工具开发全记录(十八):书签导入导出1.前言 📝2.书签结构分析 📖3.书签示例 📑4.书签文件结构定义描述 🔣4.1. 整体文档结构4.2. 核心元素类型4.3. 层级关系4.…...
