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资源用于解决这一问题;

  1. Service将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。
  2. Service为一组 Pod 提供相同的 DNS 名,并且在它们之间进行负载均衡。
  3. Kubernetes 为 Pod 提供分配了IP 地址,但IP地址可能会发生变化。集群内的容器可以通过service名称访问服务,而不需要担心Pod的IP发生变化。

二、service资源类型

  1. ClusterIP:将服务公开在集群内部。kubernetes会给服务分配一个集群内部的 IP,集群内的所有主机都可以通过这个Cluster-IP访问服务。集群内部的Pod可以通过service名称访问服务。
  2. NodePort:通过每个节点的主机IP 和静态端口(NodePort)暴露服务。 集群的外部主机可以使用节点IP和NodePort访问服务。
  3. ExternalName:将集群外部的网络引入集群内部。
  4. 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
  1. port:port字段定义了Service暴露给集群内部和外部的端口号。当你创建一个Service时,其他应用或服务可以通过该端口与Service进行通信,将请求发送到Service上。这个端口号是Service在Kubernetes集群内部和外部可见的端口。
  2. targetPort:targetPort字段定义了Service将流量转发到后端Pod的容器端口号。当请求进入Service时,Service会根据其定义将请求转发到后端Pod的这个指定端口。通常,后端Pod中的应用程序在指定的容器端口上监听并处理请求。
  3. 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资源的四种类型:

  1. ClusterIP:给svc资源一个固定的IP地址,默认的类型;
  2. NodePort:在ClusterIP基础上,映射到宿主机(物理机)的端口号,默认是30000-32767可修改;
  3. LoadBalancer:可以添加云环境的负载均衡VIP地址和负载均衡器的宿主机端口号,用户通过访问VIP+负载均衡器的端口访问到svc资源,进而访问到pod==容器==服务中;
  4. 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.浏览器访问测试

至此,已成艺术

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

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

相关文章

AJAX概述和基本使用

01 【AJAX概述和基本使用】 1.AJAX简介 AJAX 全称为Asynchronous JavaScript And XML&#xff0c;就是异步的JS 和XML 通过AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据 AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准…

刷代码随想录有感(53):合并二叉树

题干&#xff1a; 代码&#xff08;递归实现&#xff09;&#xff1a; TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {//前序好理解&#xff0c;直接将树覆盖到另一个上面if(root1 NULL)return root2;//当前遍历节点为空的话就让另一个的值覆盖过来if(root2 NUL…

对命令模式的理解

目录 一、场景1、文本编辑器并不是一个好的例子&#xff0c;设备控制器才是2、设备控制器的demo 二、不用命令模式1、代码2、问题 三、使用命令模式1、代码2、当需求变化时2.1 新增代码2.2 优点 四、进一步思考1、省略对Command的建模可以吗&#xff1f;2、命令模式的价值 一、…

GDPU unity游戏开发 碰撞器与触发器

砰砰叫&#xff0c;谁动了她的奶酪让你的小鹿乱撞了。基于此&#xff0c;亦即碰撞与触发的过程。 碰撞器与触发器的区别 通俗点讲&#xff0c;碰撞器检测碰撞&#xff0c;触发器检测触发&#xff0c;讲了跟没讲似的。碰撞器是用来检测碰撞事件的&#xff0c;在unity中&#xff…

gateway中对返回的数据进行处理

gateway中对返回的数据进行处理 背景1.项目层次 背景 最近公司有个需求是对返回数据进行处理&#xff0c;比如进行数据脱敏。最后在gateway中进行处理。 1.项目层次 根据项目的结构&#xff0c;原本在菜单功能处有对于权限设计的url判断&#xff0c;所以在url后面加了一个正…

CGAL 网格测地线距离计算

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 网格测地线距离是指在三维网格模型中计算两点之间的最短路径距离,考虑了网格的拓扑结构和几何形状。与传统的欧几里德距离不同,测地线距离考虑了网格的曲面形状,因此更适用于描述三维空间中的距离。 二、实现代码…

docker常用容器启动命令

docker常用容器启动命令 mysql启动redis启动nginx配置文件&启动 mysql启动 docker run -itd --name mysql-test --restartalways -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 mysqlredis启动 docker run -itd --name redis-test --restartalways -p 6379:6379 redisnginx…

蓝桥杯练习系统(算法训练)ALGO-949 勇士和地雷阵

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 勇士们不小心进入了敌人的地雷阵&#xff08;用n行n列的矩阵表示&#xff0c;*表示某个位置埋有地雷&#xff0c;-表示某个…

yolov5-pytorch-Ultralytics训练+预测+报错处理记录

一、前言 玩一段时间大模型&#xff0c;也该回归一下图像识别。本项目用于记录使用基于Ultralytics的yolov5进行目标检测测试。为什么用Ultralytics呢&#xff1f;答案有3 1、其良好的生态&#xff0c;方便我们部署到其它语言和设备上。因此本次测试结论&#xff1a;大坑没有&…

技术周总结 2024.04.29-05.05

一、python的数据表处理 """ 删除 Doris库中某些表中无效的数据 """ import mysql.connector import socket import socks import pandas as pd import pymysql from sqlalchemy import create_engine, text import csv from datetime import da…

UE5 蓝图入门

基础节点创建&#xff1a; 常量&#xff1a; 按住 1 &#xff0c;点击鼠标左键&#xff0c;创建常量 二维向量&#xff1a; 按住 2 &#xff0c;点击鼠标左键&#xff0c;创建二维向量 三维向量&#xff1a; 按住 3 &#xff0c;点击鼠标左键 乘法&#xff1a; 按住 m 键…

基于node.js+css+html+mysql博客系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、Php、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

【C++风云录】图形和动作捕捉库全面解析:从OpenPose到OpenCV

深入浅出&#xff1a;六大计算机视觉和动作捕捉库的教程和比较 前言 本文将为读者详细介绍六种在计算机视觉领域广泛使用的开源软件和SDK&#xff0c;包括OpenPose、Vicon SDK、Intel RealSense SDK、Microsoft Kinect SDK、PCL (Point Cloud Library)和OpenCV。我们会一一解…

Vue进阶之Vue项目实战(一)

Vue项目实战 项目搭建初始化eslint版本约束版本约束eslint配置 stylelintcspellcz-githusky给拦截举个例子 zx 项目搭建 node版本&#xff1a;20.11.1 pnpm版本&#xff1a;9.0.4 初始化 vue3最新的脚手架 pnpm create vite byelide-demo --template vue-ts pnpm i pnpm dev…

MIPS32 指令架构

指令格式 R 类型 说明&#xff1a; 用于寄存器和寄存器操作 参数说明: Op: 指令操作码Rs: 第一个源操作数寄存器号&#xff0c;参与运算使用Rd: 目的操作数寄存器号&#xff0c;保存结果使用Shamt: 位偏移量&#xff0c;仅在位移指令使用&#xff0c;在此直接置0Func: 指令函…

区块链 | IPFS:IPNS(入门版)

&#x1f98a;原文&#xff1a;IPFS 与 IPNS 啥关系&#xff1f; &#x1f98a;写在前面&#xff1a;本文属于搬运博客&#xff0c;自己留存学习。这篇文章讲得太入门了&#xff0c;不涉及任何底层原理。 正文 随着 2019 年 12 月 12 日 Filecoin 测试网的上线&#xff0c;IPF…

深入 Django 模型层:数据库设计与 ORM 实践指南

title: 深入 Django 模型层&#xff1a;数据库设计与 ORM 实践指南 date: 2024/5/3 18:25:33 updated: 2024/5/3 18:25:33 categories: 后端开发 tags: Django ORM模型设计数据库关系性能优化数据安全查询操作模型继承 第一章&#xff1a;引言 Django是一个基于Python的开源…

安卓手机APP开发__媒体开发部分__分享声音的输入

安卓手机APP开发__媒体开发部分__分享声音的输入 目录 概述 安卓10之前的版本的行为 安卓10的行为 共享场景 小助手普通的APP 有可读取权的服务 普通的APP 两个普通的APP 语音电话 普通的APP 概述 声音的输入通常来自于内嵌的麦克风,还有外置的麦克网,或者是一个…

【C++】深入剖析C++11中右值引用和左值引用

目录 一、左值引用 && 右值引用 二、左值引用于右值引用的比较 三、 右值引用使用场景和意义 1、函数返回值 ①移动赋值 ②移动构造 2、STL容器插入接口 ​3、完美转发 一、左值引用 && 右值引用 传统的C语法中就有引用的语法&#xff0c;而C11中新增了…

【简单介绍下Lisp的学习历程】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…