8.k8s中网络资源service
目录
一、service资源概述
二、service资源类型
1.ClusterIP类型
2.service的nodeport类型
3.service的loadbalancer类型(了解即可)
4.service的externalname类型(了解即可)
三、nodeport的端口范围设置和svc的endpoint列表
1.修改apiservice的宿主机映射端口范围
2.创建service和pod测试端口
四、service小结(重点)
1.service资源的四种类型:
2.修改svc的NodePort类型中宿主机映射端口的范围
3.svc的endpoint列表
五、service资源中endpoint列表关联外部服务
1.创建一个svc资源并查看
1.1编辑资源清单
1.2.查看svc资源
2.svc资源与endpoint资源关联
2.1k8s集群外部拉取一个mysql服务容器
六、案例:wordpress博客案例
1.创建wordpress的pod和svc资源
2.浏览器访问测试
一、service资源概述
每当我们企业的业务pod迭代功能的时候,都会修改pod,修改后重新启动pod,ip就会变化,那么在生产环境当中,从用户到宿主机、从宿主机到pod,这一个访问流程,都是事先写好的,一旦pod修改后,ip产生变化,就需要重新配置,因此,k8s提供了service资源用于解决这一问题;
- Service将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。
- Service为一组 Pod 提供相同的 DNS 名,并且在它们之间进行负载均衡。
- Kubernetes 为 Pod 提供分配了IP 地址,但IP地址可能会发生变化。集群内的容器可以通过service名称访问服务,而不需要担心Pod的IP发生变化。
二、service资源类型
- ClusterIP:将服务公开在集群内部。kubernetes会给服务分配一个集群内部的 IP,集群内的所有主机都可以通过这个Cluster-IP访问服务。集群内部的Pod可以通过service名称访问服务。
- NodePort:通过每个节点的主机IP 和静态端口(NodePort)暴露服务。 集群的外部主机可以使用节点IP和NodePort访问服务。
- ExternalName:将集群外部的网络引入集群内部。
- LoadBalancer:使用云提供商的负载均衡器向外部暴露服务。
1.ClusterIP类型

# 编写pod资源清单[root@k8s1 service]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:name: p1-svclabels:k8s: oslee
spec:containers:- name: c1image: nginx:1.20.1-alpineports:- containerPort: 80
# 编写service资源清单[root@k8s1 service]# cat 01-service-clusterip.yaml
apiVersion: v1
kind: Service
metadata:name: svc-01
spec:#声明clusterip类型,不指定默认也是这个类型;type: ClusterIP#指定pod的标签selector: k8s: oslee#指定service的ip地址clusterIP: 10.200.100.100#用户访问service时,访问哪个端口?ports:#指定访问协议,若不指定协议,默认也是TCP- protocol: TCP#service的端口port: 80#pod的容器端口(目标端口)targetPort: 80# 创建资源
[root@k8s1 service]# kubectl apply -f .
service/svc-01 created
pod/p1-svc created
[root@k8s1 service]# kubectl get all -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/p1-svc 1/1 Running 0 4m1s 10.100.1.36 k8s2 <none> <none>
pod/pod1-svc 1/1 Running 0 13s 10.100.1.38 k8s2 <none> <none>NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.200.0.1 <none> 443/TCP 2d11h <none>
service/svc-01 ClusterIP 10.200.100.100 <none> 80/TCP 4m1s k8s=oslee
[root@k8s1 service]# curl -I 10.200.100.100
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Fri, 03 May 2024 02:55:15 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 25 May 2021 13:41:16 GMT
Connection: keep-alive
ETag: "60acfe7c-264"
Accept-Ranges: bytes
2.service的nodeport类型
nodeport类型,就是clusterip类型的升级版,它可以使用宿主机的端口,映射到service开放的端口上,从而,使得用户访问宿主机,宿主机转发到service资源,进而访问到pod资源;

[root@k8s1 service]# cat 02-service-nodeport.yaml
apiVersion: v1
kind: Service
metadata:name: svc-02
spec:#声明nodePort类型;type: NodePort#指定pod的标签selector: k8s: oslee#指定service的ip地址(在nodeport类型中可以不设置,会随机生成)clusterIP: 10.200.100.101#用户访问service时,访问哪个端口?ports:#指定访问协议,若不指定协议,默认也是TCP- protocol: TCP#service的端口port: 80#pod的容器端口(目标端口)targetPort: 80#访问宿主机的哪个端口,可以转发访问到service?#注意,默认只能使用宿主机的30000-32767区间的端口号(可以放开限制,之后再说);nodePort: 30000
- port:port字段定义了Service暴露给集群内部和外部的端口号。当你创建一个Service时,其他应用或服务可以通过该端口与Service进行通信,将请求发送到Service上。这个端口号是Service在Kubernetes集群内部和外部可见的端口。
- targetPort:targetPort字段定义了Service将流量转发到后端Pod的容器端口号。当请求进入Service时,Service会根据其定义将请求转发到后端Pod的这个指定端口。通常,后端Pod中的应用程序在指定的容器端口上监听并处理请求。
- NodePort:NodePort是一种Service类型,它允许通过Kubernetes集群中的每个节点的IP地址和指定的端口号访问Service。NodePort是将外部流量导入到Service的一种方式。Kubernetes会在集群中的每个节点上打开一个高端口(默认30000-32767范围内),并将该端口映射到Service的port和targetPort上。这样,你可以通过任何节点的IP地址和NodePort来访问Service。
3.service的loadbalancer类型(了解即可)
我们使用云环境负载均衡器的时候,就将vip地址填写到这个类型之下,就可以实现云负载均衡访问svc访问pod;

[root@k8s1 service]# cat 03-service-loadbalancer.yaml
kind: Service
apiVersion: v1
metadata:name: svc-loadbalancer
spec:# 指定service类型为LoadBalancer,注意,一般用于云环境type: LoadBalancerselector:k8s: osleeports:- protocol: TCPport: 80targetPort: 80# 注意,将来这个nodeProt也对应的是云环境负载均衡的地址nodePort: 30001# 指定LoadBalancer云环境的负载均衡地址,要确保K8S集群能和负载均衡的IP地址进行通信!#用户通过vip:10.0.0.88就可以访问到svc资源了;externalIPs:- 10.0.0.88
4.service的externalname类型(了解即可)
域名转发功能,就是做了一个跳转,将来用户访问svc就会直接访问到我们设置的地址上,写上“百度”,就跳转到“百度”。
[root@k8s1 service]# cat 06-svc-ex.yaml
apiVersion: v1
kind: Service
metadata:name: svc-externalname
spec:# svc类型type: ExternalName# 指定跳转到外部的域名地址externalName: www.baidu.com---apiVersion: v1
kind: Pod
metadata:name: p1
spec:containers:- name: c1image: nginx:1.20.1-alpine
[root@k8s1 service]# kubectl exec p1 -it -- sh
/ # cat /etc/resolv.conf
nameserver 10.200.0.10
search default.svc.oslee.com svc.oslee.com oslee.com
options ndots:5
# yum安装dig
[root@k8s1 service]# yum -y install bind-utils# 从指定的 DNS 服务器上查询
[root@k8s1 service]# dig @10.200.0.10 svc-externalname.default.svc.oslee.com +short
www.baidu.com.
www.a.shifen.com.
183.2.172.185
183.2.172.42
三、nodeport的端口范围设置和svc的endpoint列表
还记得在svc资源nodeport类型中,宿主机端口映射的范围必须在30000-32767之间,否则会报错;
但是,这个范围是可以修改的;只需要进入到静态pod目录中,找到kube-apiserver的pod资源,进入添加一条命令【--service-node-port-range=3000-50000】;
提交这个命令后,宿主机端口映射就变成了3000-50000了;
1.修改apiservice的宿主机映射端口范围
[root@k8s1 service]# vim /etc/kubernetes/manifests/kube-apiserver.yaml# 增加这条命令
- --service-node-port-range=3000-50000

2.创建service和pod测试端口


四、service小结(重点)
1.service资源的四种类型:
- ClusterIP:给svc资源一个固定的IP地址,默认的类型;
- NodePort:在ClusterIP基础上,映射到宿主机(物理机)的端口号,默认是30000-32767可修改;
- LoadBalancer:可以添加云环境的负载均衡VIP地址和负载均衡器的宿主机端口号,用户通过访问VIP+负载均衡器的端口访问到svc资源,进而访问到pod==容器==服务中;
- ExternalName:类似于HTTP请求的302/301跳转,可以将访问svc的请求转发到指定的地址上;主要是转发功能;
2.修改svc的NodePort类型中宿主机映射端口的范围
默认是30000-32767,可以通过静态pod目录下的kube-apiserver.yaml的pod资源清单中加上一条命令,来设置宿主机的映射端口范围;
3.svc的endpoint列表
用户通过访问SVC资源,进而将请求转发到endpoint列表中的pod中,endpoint列表,就是svc将请求转发到的目的地;
五、service资源中endpoint列表关联外部服务
1.创建一个svc资源并查看
1.1编辑资源清单
[root@k8s1 service]# cat svc-out.yaml
apiVersion: v1
kind: Service
metadata:name: svc-out
spec:ports:- port: 30002
[root@k8s1 service]# kubectl apply -f svc-out.yaml
service/svc-out created
1.2.查看svc资源

可以看到endpoint列表中什么都没有,也就是说,现在访问svc资源,什么都访问不到;我们还记得上面说的,svc资源是通过“标签选择”来将pod提那家到svc的endpoint列表中的,那么我们如何将k8s集群外部的容器添加到endpoint列表中呢?
举例:在生产环境中,我们的数据库服务,都是常年运行的历史性业务服务,当企业的应用上k8s时,数据库的迁移工作非常的繁琐,所以,如果能将外部的SQL服务,提那家到svc资源的endpoint列表中,就节省了数据库迁移k8s的繁杂工作;
2.svc资源与endpoint资源关联
endpoint本质上也是一个单独的资源,只是在我们创建svc资源的时候,系统自动给我们创建的
svc资源与endpoint资源是通过元数据(metadata中的)名称,进行关联的,只要endpoint资源的名称与svc资源的名称相同,则,endpoint资源的服务IP就会出现在svc资源的endpoint列表中,即关联成功;
2.1k8s集群外部拉取一个mysql服务容器
找一个k8s集群之外的虚拟机,docker安装mysql
docker run --name=oslee-mysql \-p 13306:3306 -d \-e MYSQL_ALLOW_EMPTY_PASSWORD=yes \-e MYSQL_DATABASE=wordpress \-e MYSQL_USER=admin \-e MYSQL_PASSWORD=admin123 \--restart always \mysql:8.0 \--default-authentication-plugin=mysql_native_password \--character-set-server=utf8 \--collation-server=utf8_bin
测试登录mysql
[root@node1 data]# docker exec -it oslee-mysql mysql -u admin -padmin123mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| wordpress |
+--------------------+
2 rows in set (0.00 sec)
k8s集群中创建endpoint资源
[root@k8s1 service]# cat endpoint.yaml
apiVersion: v1
kind: Endpoints
metadata:name: svc-out
subsets:
#指定外部endpoints的宿主机ip
- addresses:- ip: 10.128.172.46ports:- port: 13306
[root@k8s1 service]# kubectl apply -f endpoint.yaml
endpoints/svc-out created

六、案例:wordpress博客案例
上述内容中,我们已经有了mysql,那么接下来,我们就搭建一套简单的架构,用户通过访问宿主机,转发到wordpress服务pod容器中,wordpress通过svc资源,访问到k8s外部数据库服务实现数据存储于查询;
wordpress ---> svc-out ---> endpoint ---> k8s集群外的宿主机mysql
1.创建wordpress的pod和svc资源
[root@k8s1 service]# cat wp-demo.yaml
apiVersion: v1
kind: Pod
metadata:name: wp-podlabels: k8s: oslee
spec:containers:- name: wp-c1image: wordpress:latestports:- containerPort: 80env:- name: WORDPRESS_DB_HOST#外部mysql服务的svc资源名称及端口;value: svc-out:30002- name: WORDPRESS_DB_USERvalue: admin- name: WORDPRESS_DB_PASSWORDvalue: admin123
---apiVersion: v1
kind: Service
metadata:name: wp-svc
spec:type: NodePortselector:k8s: osleeports:- port: 80targetPort: 80nodePort: 30080
[root@k8s1 service]# kubectl apply -f wp-demo.yaml
pod/wp-pod created
service/wp-svc created

2.浏览器访问测试

至此,已成艺术
相关文章:
8.k8s中网络资源service
目录 一、service资源概述 二、service资源类型 1.ClusterIP类型 2.service的nodeport类型 3.service的loadbalancer类型(了解即可) 4.service的externalname类型(了解即可) 三、nodeport的端口范围设置和svc的endpoint列表 1.修…...
51单片机keil编程中遇到的问题(持续更新)
字符无法打印报错 查看特殊功能寄存器名字的时候也会报错,因为无法编译通过,导致头文件的定义内容无法查找 keil编译中 error C127: ‘xx’: invalid storage class 这种一般是在编写头文件或源文件时,在声明函数的结尾没有添加分号&…...
C++类和对象详解(一)
目录 面向过程和面向对象初步认识类的引入类的定义类的两种定义方式声明和定义全部放在类体中 声名定义分离 类的作用域成员变量命名规则建议访问限定符 类的封装类的实例化类对象模型类的对象大小的计算扩展 结构体内存对齐规则 感谢各位大佬对我的支持,如果我的文章对你有用,…...
SCI论文检索报告长什么样?怎么出具?一文了解!
1、SCI检索报告是什么 SCI数据库收录最能反映基础学科研究水平和论文质量,该检索系统收录的科技期刊比较全面,可以说它是集中各个学科高质优秀论文的精粹,评职晋升、项目申报、评奖评优等很多关键时期,都需要开具已经在SCI发表的论…...
UE4_Water插件_Buoyancy组件使用
water插件提供了一个浮力Actor蓝图类。 需要注意的几个问题: 1、StaticMesh需要替换根组件。 2、需要模拟物理设置质量。 3、需要添加浮力组件,设置浮力点,应用水中牵引力。...
OceanBase学习1:分布式数据库与集中式数据库的差异
目录 1. 传统集中式数据库 2. 数据库中间件的分库分表 3. 分布式数据库的基本特点及对比分析 4. OceanBase和传统数据库的对比 5. 小结 1. 传统集中式数据库 优点 成熟稳定:经过近40年的发展,应用到各行各业,产品技术非常成熟稳定行业适配性强:适配…...
计算机网络技术主要学什么内容,有哪些课程
计算机网络技术专业是一个涉及理论与实践紧密结合的学科,主要学习内容有计算机网络基础、网络设备技术、网络编程等内容,以下是上大学网(www.sdaxue.com)整理的计算机网络技术主要学什么内容,供大家参考! 基…...
Mac下安装ffmpeg
1、安装gedit brew install gedit2、配置环境变量,打开~/.zshrc,在末尾添加语句 export PATH$PATH:/usr/local/ffmpeg/bin3、执行语句,使环境变量生效 source ~/.zshrc 4、终端输入 ffmpeg ,看环境变量是否配置成功。 至此&a…...
自制AI:Park_01修改bug
修改了一下不能存东西,不能打开东西的bug #include<bits/stdc.h> #include<windows.h> using namespace std; double mem10737418240; map<string,string> jishiben; string mulu"朴同学给你的一封信.memo\n"; int cntnote1; void sta…...
解救应用启动危机:Spring Boot的FailureAnalyzer机制
目录 一、走进FailureAnalyzer 二、在Spring Boot中如何生效 三、为什么可能需要自定义FailureAnalyzer 四、实现自定义基本步骤 (一)完整步骤要求 (二)注册方式说明 通过Spring Boot的spring.factories文件(建…...
win11个性化锁屏界面怎么关闭?
win11个性化锁屏界面关闭方法对于win11用户来说,关闭个性化锁屏界面是一个常见问题。本文将由php小编苹果详细介绍如何执行此操作,分步指导并提供操作截图。继续阅读以了解具体步骤。 win11个性化锁屏界面关闭方法 第一步,点击底部Windows图…...
白酒:白酒香型与品质消费的关系及影响
云仓酒庄的豪迈白酒作为中国白酒的品牌,其白酒香型与品质消费的关系及影响备受关注。随着消费者对品质的重视程度不断提高,了解白酒香型与品质之间的关系对于云仓酒庄和消费者都具有重要意义。 经云仓酒庄豪迈白酒分析,白酒香型与品质消费的关…...
智能BI(后端)-- 系统优化(安全性,数据存储,限流)
文章目录 安全性todo 数据存储限流限流的几种算法限流粒度限流的实现本地限流(单机限流)Redisson实现分布式限流(多机限流) 安全性 问题引入:如果用户上传一个超大的文件怎么办?比如1000G? 预防: 只要涉及…...
探索数字社交的奇迹:解读Facebook的革命性影响
1. 社交互动的全新模式 Facebook的出现不仅仅是一个社交媒体平台的诞生,更是一种全新的社交互动模式的开启。传统的社交模式主要依赖于面对面的交流,而Facebook则将社交推向了全新的数字化平台,使得人们可以在虚拟的世界里建立和维系社交关系…...
FileCodeBox-Lite:轻量级文件分享解决方案
在数字时代,文件分享是一个常见的需求,无论是个人用户还是企业团队。FileCodeBox-Lite提供了一个简单、高效且安全的文件分享解决方案。以下是对FileCodeBox-Lite项目的详细介绍。 项目简介 FileCodeBox-Lite是一个轻量级的文件分享系统,…...
【ARM】ARM寄存器和异常处理
目录 1.指令的执行过程 2. ARM处理器概述 3.ARM指令集 4.ARM存储模型 5. ARM工作模式 6.ARM寄存器组织 (1)寄存器 (2) ARM寄存器 (3)CPSR寄存器 7. ARM异常处理 (1&am…...
数仓建模【埋点设计与管理】
埋点设计与管理 埋点的作用 分析用户转化以及留存:分析用户偏好收集市场反馈保障用户数据安全定位异常其他作用 埋点数仓设计 数据进入数仓之前我们就需要设计好数仓表,埋点表的数据有几个特点: 数据量非常大,可能是所有数据集…...
Spring Clound介绍
Spring Cloud 是一系列框架的集合,它利用 Spring Boot 的开发便利性简化了分布式系统(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话和集群状态)的开发。Spring Cloud 旨在为开发者…...
Redhat Linux忘记密码解决方案
1、重启系统 2、将光标移动到要启动的内核 3、按e编辑当前条目 4、将光标移动以Linux开头的行,此为内核命令行 5、在末尾添加人的rd.break 6、按ctrlx继续启动,如果发现输入的rd.break不能进入到伪系统,那么改为 rd.break consoletty0 (按ctr…...
对于子数组问题的动态规划
前言 先讲讲我对于这个问题的理解吧 当谈到解决子数组问题时,动态规划(DP)是一个强大的工具,它在处理各种算法挑战时发挥着重要作用。动态规划是一种思想,它通过将问题分解成更小的子问题并以一种递归的方式解决它们,然后利用这些…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
