【服务发现--service】

news2025/1/17 4:00:24

在这里插入图片描述

1、service的定义

  • "Service"简写"svc”。Pod不能直接提供给外网访问,而是应该使用service。Service就是把Pod暴露出来提供服务,Service才是真正的“服务”,它的中文名就叫“服务”。
  • 可以说Service是一个应用服务的抽象,定义了Pod逻辑集合和访问这个Pod集合的策路。Service代理Pod集合,对外表现为一个访问入口,访问该入口的请求将经过负载均衡,转发到后端Pod中的容器。

2、service和pod之间的网络是如何打通的

  • service和pod之间的网络布局如下图所示
    在这里插入图片描述

2.1 service与endpoints的关系

在这里插入图片描述

2.2 endpoints和pod的关系

在这里插入图片描述

2.3 查看创建service的配置文件和pod的关联信息

在这里插入图片描述

2.4 service和pod通信过程

  • 1、创建service的时候会同时创建一个endpoints,创建service的时候会带有一个选择器,通过这个标签可以找到对应的pod,同时service也会生成ip地址,提供集群内访问。
  • 2、endpoints中包含了pod的ip和端口信息,通过iptables转发数据给node上的kube-proxy,node上的kube-proxy把数据转发给pod中的根容器。

3、service的配置文件解析

apiVersion: v1
kind: Service  # 资源类型为 Service
metadata:
  name: nginx-svc  # service 名字
  labels:
    app: nginx   # service 的标签
spec:
  selector:  # 选择器,匹配那些pod会被该service 代理
    app: nginx-deploy   # 所有匹配到这个标签的pod 都可以通过该 service 进行访问
  ports:  # 端口樱色
  - port: 80    # service自己的端口哦,在使用内网ip访问时使用
    targetPort: 80  # 目标 pod的端口
    name: web   # 为service端口起一个名字
# 随机启动一个端口(30000-32767),映射到ports中的端口,该端口是直接绑定在node上的,且集群中的每一个node都会绑定这个端口
# 也可以用于将服务器暴露给外部访问,但是这种方式实际生产环境不推荐,效率低,而且service是四层负载    
  type: NodePort  

4、service的代理集群内的资源

4.1 创建service

kubectl  create -f  nginx-svc.yaml

4.2 查看service 信息

[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.1.0.1       <none>        443/TCP        5d4h
nginx-svc    NodePort    10.1.224.211   <none>        80:31231/TCP   4h16m```
## 4.3 查看service的描述信息

```c
[root@k8s-master ~]# kubectl describe svc nginx-svc
Name:                     nginx-svc
Namespace:                default
Labels:                   app=nginx
Annotations:              <none>
Selector:                 app=nginx-deploy
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.1.224.211
IPs:                      10.1.224.211
Port:                     web  80/TCP
TargetPort:               80/TCP
NodePort:                 web  31231/TCP
Endpoints:                10.2.1.55:80,10.2.2.31:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

4.4 进入其他Pod后通过 service name 进行访问

[root@k8s-master ~]# kubectl exec -it dns-test -- sh
/ # wget http://nginx-svc
Connecting to nginx-svc (10.1.224.211:80)
index.html           100% |*************************************************************************************************************************************************************|   612   0:00:00 ETA
/ # cat  index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

4.5 service默认是命名空间级,跨namespace如何访问?

  • 默认在当前namespace中访问,如果需要跨namespace访问pod,则在service name的后面加上 . 即可
  • eg: curl http://nginx-svc.default

5、Pod通过service访问外部资源方式

  • 实现方式如下:
  • 编写service配置文件时,不指定selector属性的时候,就不会创建endpoints
  • 自己创建endpoints

5.1 service代理k8s的外部服务(通过IP地址访问)

5.1.1 创建一个service的配置文件

apiVersion: v1
kind: Service  # 资源类型为 Service
metadata:
  name: nginx-svc-external   # service 名字
  labels:
    app: nginx   # service 的标签
spec:
  ports:  # 端口映射
  - port: 80    # service自己的端口哦,在使用内网ip访问时使用
    targetPort: 80  # 目标 pod的端口
    name: web   # 为service端口起一个名字  
  type: ClusterIP  # 只能在集群内部使用

5.1.2 创建一个endpoints的配置文件

apiVersion: v1
kind: Endpoints
metadata:
  labels:
    name: nginx # 与service保持一致
  name:  nginx-svc-external   # 与service一致
  namespace: default  # 与 service 一致
subsets:
- addresses:
  - ip: 47.110.152.250  # pod需要访问的目标ip地址
  ports:        # 与service保持一致
  - name: web
    port: 80
    # protocol: TCP

5.1.3 创建service资源

[root@k8s-master ~]# kubectl create -f nginx-svc-external.yaml
service/nginx-svc-external created

[root@k8s-master ~]# kubectl get svc
NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes           ClusterIP   10.1.0.1       <none>        443/TCP        5d4h
nginx-svc            NodePort    10.1.224.211   <none>        80:31231/TCP   4h21m
nginx-svc-external   ClusterIP   10.1.63.181    <none>  80/TCP         35s

5.1.4 创建endpoints资源

[root@k8s-master ~]# kubectl create -f nginx-ed-external.yaml
endpoints/nginx-svc-external created


[root@k8s-master ~]# kubectl get ep
NAME                 ENDPOINTS                   AGE
kubernetes           10.10.10.100:6443           5d4h
nginx-svc            10.2.1.55:80,10.2.2.31:80   4h22m
nginx-svc-external   47.110.152.250:80           20s

5.1.5 查看endpoints和service描述信息

[root@k8s-master ~]# kubectl describe ep  nginx-svc-external
Name:         nginx-svc-external
Namespace:    default
Labels:       app=nginx
Annotations:  <none>
Subsets:
  Addresses:          47.110.152.250
  NotReadyAddresses:  <none>
  Ports:
    Name  Port  Protocol
    ----  ----  --------
    web   80    TCP

Events:  <none>


[root@k8s-master ~]# kubectl describe  svc nginx-svc-external
Name:              nginx-svc-external
Namespace:         default
Labels:            app=nginx
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.1.63.181
IPs:               10.1.63.181
Port:              web  80/TCP
TargetPort:        80/TCP
Endpoints:         47.110.152.250:80
Session Affinity:  None
Events:            <none>

5.1.6 通过busybox容器测试 ????

[root@k8s-master ~]# kubectl get pod
NAME                           READY   STATUS    RESTARTS      AGE
dns-test                       1/1     Running   1 (23h ago)   24h
fluentd-59k8k                  1/1     Running   0             6h29m
fluentd-hhtls                  1/1     Running   0             6h25m
nginx-deploy-fdd948cf4-69b85   1/1     Running   0             135m
nginx-deploy-fdd948cf4-r8ktj   1/1     Running   0             5h43m


[root@k8s-master ~]# kubectl exec -it dns-test -- sh
/ # wget http://nginx-svc-external
Connecting to nginx-svc (47.110.152.250:80)
index.html           100% |*************************************************************************************************************************************************************|   612   0:00:00 ETA
/ # cat  index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

5.1.7 k8s集群中的pod访问外部服务的流程

在这里插入图片描述

5.2 service反向代理外部域名(通过域名访问 )

5.2.1 创建service的配置文件

apiVersion: v1
kind: Service  # 资源类型为 Service
metadata:
  name: test-svc-external-domian   # service 名字
  labels:
    app: test-svc-external-domian   # service 的标签
spec:
  type: ExternalName
  externalName: www.lan-he.com.cn

5.2.2 创建service

[root@k8s-master ~]# kubectl create -f test-svc-external-domian.yaml

service/test-svc-external-domian created

5.2.3 查看service信息

service/csdn-svc-external-domian edited
[root@k8s-master ~]# kubectl get svc
NAME                       TYPE           CLUSTER-IP     EXTERNAL-IP         PORT(S)        AGE
test-svc-external-domian   ExternalName   <none>         www.lan-he.com.cn   <none>         100s
kubernetes                 ClusterIP      10.1.0.1       <none>              443/TCP        5d15h
nginx-svc                  NodePort       10.1.224.211   <none>              80:31231/TCP   14h
nginx-svc-external         ClusterIP      10.1.63.181    <none>              80/TCP         10h

5.2.4 通过busybox容器测试

[root@k8s-master ~]# kubectl exec -it dns-test -- sh
/ # wget http://www.lan-he.com.cn
Connecting to www.lan-he.com.cn (47.110.152.250:80)
index.html           100% |*************************************************************************************************************************************************************|   612   0:00:00 ETA
/ # cat index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

6、service中spec中的type常用类型

  • ClusterIP: 只能在集群内部使用,不配置类型的话默认就是ClusterlP
  • ExternalName:返回定义的CNAME别名,可以配置为域名
  • NodePort:
    • 会在所有安装了kube-proxy的节点都绑定一个端口,此端口可以代理至对应的Pod,集群外部可以使用任意节点ip+NodePort的端口号访问到集群中对应Pod中的服务。
    • 当类型设置为NodePort后,可以在ports配置中增加nodePort配置指定端口,需要在下方的端口范围内,如果不指定会随机指定端口。
    • 端口范围:30000~32767
    • 端口范围配置在/usr/lib/systemd/system/kube-apiserver.service文件中
  • LoadBalance: 使用云服务商(阿里云、腾讯云等)提供的负载均衡器服务

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

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

相关文章

【软考中级】系统集成项目管理工程师—导学

软考中级——系统集成项目管理工程师 原视频链接&#xff1a;2024年05月【持续更新】最新系统集成项目管理工程师培训课程-网络课程-软考中级培训 考试介绍 基础介绍 软考全称又叫计算机技术与软件专业技师资格水平考试。 软考是国家人力资源和社会保障部、工业和信息化部…

基于SpringBoot实现的医院药品管理系统

一、系统架构 前端&#xff1a;html | layui | js | css 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.6 | mysql | maven 二、代码及数据库 三、功能介绍 01. 登录页 02. 药品库存管理-登记出入口信息 03. 药品库存管理-问题药品信息 …

【机器学习科学库】全md文档笔记:Jupyter Notebook和Matplotlib使用(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论人工智能相关知识。主要内容包括&#xff0c;了解机器学习定义以及应用场景&#xff0c;掌握机器学习基础环境的安装和使用&#xff0c;掌握利用常用的科学计算库对数据进行展示、分析&#xff0c;学会使用jupyter note…

字符串(算法竞赛)--Manacher(马拉车)算法

1、B站视频链接&#xff1a;F05 Manacher(马拉车)_哔哩哔哩_bilibili 题目链接&#xff1a;【模板】manacher - 洛谷 ​ #include <bits/stdc.h> using namespace std; const int N3e7; char a[N],s[N]; int d[N];//回文半径函数void get_d(char*s,int n){d[1]1;for(int…

SpringBoot:数据访问-整合 Druid 配置数据源监控

点击查看数据访问demo&#xff1a;LearnSpringBoot06DataJdbc 点击查看更多的SpringBoot教程 简介 Druid Spring Boot Starter 用于帮助你在Spring Boot项目中轻松集成Druid数据库连接池和监控。 一、添加druid-spring-boot-starter依赖 点击查询最新版 <dependency&g…

猜字谜|构建生成式 AI 应用实践(一)

在 2023 亚马逊云科技 re:Invent 之后&#xff0c;细心的开发者们也许已经发现有一个很有趣的动手实验&#xff1a;开发一款可部署的基于大语言模型的字谜游戏&#xff1a; 该款游戏使用了文生图模型为玩家提供一个未知的提示词&#xff0c;玩家需要根据模型生成的图像来猜测该…

【基于Ubuntu20.04的Autoware.universe安装过程】方案二:双系统 | 详细记录 | 全过程图文 by.Akaxi

目录 一、Autoware.universe背景 Part-1&#xff1a;安装双系统教程 二、查看Windows引导方式 三、制作安装盘 四、设置电脑配置 1.关闭bitlocker 2.压缩硬盘分区 3.关闭Secure Boot 4.关闭intel RST 5.BIOS设置U盘引导 五、安装Ubuntu20.04 1.ventoy引导 2.安装配…

代码随想录算法训练营Day27 || leetCode 93.复原IP地址 || 78.子集 || 90.子集II

93.复原IP地址 与分割回文串的代码相近&#xff0c;先写出判断函数&#xff0c;之后以判断结果为标准&#xff0c;执行回溯的代码。此题中使用点的个数来决定回溯的终止&#xff0c;需要学习一下。 class Solution { private:vector<string> result;bool isValid(const …

c语言经典测试题5

1.题1 t0; while(printf("*")) { t; if (t<3) break; }关于上述代码描述正确的是&#xff1f; A: 其中循环控制表达式与0等价 B: 其中循环控制表达式与0等价 C: 其中循环控制表达式是不合法的 D: 以上说法都不对 我们来分析一下&#xff1a;printf的返回值…

一个具有强大PDF处理能力的.Net开源项目

PDF具有跨平台、可读性强、不可修改性、无需特定阅读软件、内容安全等好处&#xff0c;在工作中经常都会用到。 所以&#xff0c;我们在项目开发中&#xff0c;经常需要生成PDF的文件&#xff0c;或者把Html、Xml等文件转化为PDF格式。 今天给大家推荐一个具有PDF处理能力的.…

消息队列-RabbitMQ:延迟队列、rabbitmq 插件方式实现延迟队列、整合SpringBoot

十六、延迟队列 1、延迟队列概念 延时队列内部是有序的&#xff0c;最重要的特性就体现在它的延时属性上&#xff0c;延时队列中的元素是希望在指定时间到了以后或之前取出和处理&#xff0c;简单来说&#xff0c;延时队列就是用来存放需要在指定时间被处理的元素的队列。 延…

20240113----重返学习-`nginx/conf/nginx.conf`的https证书配置说明

20240113----重返学习-nginx/conf/nginx.conf的https证书配置说明 文件说明 不同域名的多虚拟主机配置 server {listen 443 ssl;#在443端口上监听SSL/TLS流量;server_name localhost;#指定服务器名称&#xff0c;应该与域名匹配;ssl_certificate fangchaoduan.com.pem;#指定SS…

数据安全之路:深入了解MySQL的行锁与表锁机制

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 数据安全之路&#xff1a;深入了解MySQL的行锁与表锁机制 前言基础innodb中锁与索引的关系如何避免表锁 前言 在当今数据密集的应用中&#xff0c;数据库锁成为了确保数据一致性和并发操作的关键工具…

Java 拦截器深入了解学习

Java 拦截器深入了解学习 命运总是不如愿。 但往往是在无数的痛苦中&#xff0c;在重重的矛盾和艰难中&#xff0c;才使人成熟起来&#xff0c;坚强起来;虽然这些东西在实际感受中给人带来的并不都是欢乐。 ————路遥《平凡的世界》 什么是拦截器&#xff08;Interceptor&am…

【C++】C++对C语言的关系,拓展及命名空间的使用

文章目录 &#x1f4dd;C简述C融合了3种不同的编程方式&#xff1a;C和C语言关系是啥呢&#xff1f;C标准 &#x1f320;C应用&#x1f320;C语言优点第一个C程序 &#x1f320;命名空间&#x1f320;命名空间的使用命名空间的定义 &#x1f320;怎么使用命名空间中的内容呢&am…

强化学习入门到不想放弃-3

第三节我们主要讲一下SARSA模型 上节课的链接:强化学习入门到不想放弃-2 (qq.com) 有模型的概念:简单理解,上节课我讲的就是有模型,就是可以开上帝视角,知道全局地图 无模型的概念: 打CS,但是看不到地图的情况,全凭自己探索 今天的讲解环境还是和上节课一样,如下…

Movelt使用笔记-Movelt Setup Assistant

目录 Setup Assistant配置1 Start 加载urdf模型3 Virtual joints 虚拟关节5 Robot Poses 机器人位姿7 Passive Joints 被动关节8 Controllers 控制器9 Simulation 仿真10 3D Perception 3D感知11 Author Information 作者信息12 Configuration Files 配置文件启动MoveIt!Setup…

【Python笔记-设计模式】前端控制器模式

一、说明 常作为MVC&#xff08;Model-View-Controller&#xff09;模式的一部分&#xff0c;用来处理用户请求并将其分发给相应的处理程序&#xff08;即路由匹配&#xff09;。 (一) 解决问题 将请求的处理流程集中管理&#xff0c;统一处理所有的请求 (二) 使用场景 需…

学习或从事鸿蒙开发工作,有学历要求吗?

目前安卓有2,000万的开发者。本科及以上学历占比为35%&#xff1b;iOS有2,400万开发者&#xff0c;本科及以上学历占比为40% 绝大多数的前端开发者都是大专及以下学历&#xff0c;在2023年华为开发者大会上余承东透露华为的开发者目前有200万&#xff0c;但鸿蒙开发者统计的数据…

3.WEB渗透测试-前置基础知识-快速搭建渗透环境(上)

上一个内容&#xff1a;2.WEB渗透测试-前置基础知识-web基础知识和操作系统-CSDN博客 1.安装虚拟机系统 linux Kali官网下载地址&#xff1a; https://www.kali.org/get-kali/#kali-bare-metal Centos官网下载地址&#xff1a; https://www.centos.org/download/ Deepin官网下…