循序渐进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.简介 这个系列的第一篇以猜拳小游戏开始,这是源于我们生活的灵感,在忙碌的时代中,我们每个人都在为自己的生活各自忙碌着,奔赴着自己所走向的那条路上,即使遍体鳞伤。 但是,生活虽然很苦,也不…...

软件工程 概述
软件 不仅仅是一个程序代码。程序是一个可执行的代码,它提供了一些计算的目的。 软件被认为是集合可执行的程序代码,相关库和文档的软件。当满足一个特定的要求,就被称为软件产品。 工程 是所有有关开发的产品,使用良好定义的&…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...