K8S的统一访问入口-Service

 💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

推荐:Linux运维老纪的首页,持续学习,不断总结,共同进步,活到老学到老
导航剑指大厂系列:全面总结 运维核心技术:系统基础、数据库、网路技术、系统安全、自动化运维、容器技术、监控工具、脚本编程、云服务等。
常用运维工具系列:常用的运维开发工具, zabbix、nagios、docker、k8s、puppet、ansible等
数据库系列:详细总结了常用数据库 mysql、Redis、MongoDB、oracle 技术点,以及工作中遇到的 mysql 问题等
懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

一篇文章精通K8S的统一访问入口-Service

1、Service是什么?

  • 背景:每个Pod具有IP地址,当使用Deployment控制器时,Pod的IP地址往往动态变化。

  • 解决方法:通过Service可以获得稳定的IP地址,且在Service的生命周期有效,与Pod的IP地址变化与否无关。

  • 实质:Service本质就是一个LB负载均衡器

2.Service存在的意义

3.Pod与Service的关系

4.Service定义和创建

5.创建Nginx

[root@k8s-master ~]# vim deployment.yaml apiVersion: apps/v1kind: Deploymentmetadata:  name: nginx-deployment  labels:    app: nginxspec:  replicas: 3  selector:    matchLabels:      app: nginx  template:    metadata:      labels:        app: nginx    spec:      containers:      - name: nginx        image: nginx:1.14.2        ports:        - containerPort: 80

查看刚刚部署的Nginx服务标签

[root@k8s-master ~]# kubectl get pods --show-labelsNAME                       READY   STATUS    RESTARTS     AGE   LABELSnginx-6799fc88d8-s5rnz           1/1    Running   0          24d   app=nginx,pod-template-hash=6799fc88d8nginx-deployment-66b6c48dd5-hxv7h   1/1     Running   0          70s   app=nginx,pod-template-hash=66b6c48dd5nginx-deployment-66b6c48dd5-jjkk4   1/1     Running   0          70s   app=nginx,pod-template-hash=66b6c48dd5nginx-deployment-66b6c48dd5-tsgvb   1/1     Running   0          70s   app=nginx,pod-template-hash=66b6c48dd5

查看当前namespace(default)下有哪些svc

[root@k8s-master ~]# kubectl get svcNAME         TYPE      CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGEkubernetes   ClusterIP     10.96.0.1     <none>        443/TCP        24dnginx        NodePort    10.108.41.4   <none>        80:31434/TCP    24d

定义并创建Service

[root@k8s-node2 ~]# vim service.yamlapiVersion: v1kind: Servicemetadata:  name: web  namespace: defaultspec:  ports:  - port: 80        # Service端口    protocol: TCP    # 协议    targetPort: 80   # 容器端口(程序启动端口,比如django默认是8000端口)  selector:     app: nginx      # 指定关联Pod的标签(上面已经查到了,app=nginx)  type: ClusterIP      # 服务类型

创建svc

[root@k8s-master ~]# kubectl apply -f service.yaml

通过Service访问Nginx集群

[root@k8s-master ~]# kubectl get svcNAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGEkubernetes    ClusterIP    10.96.0.1       <none>      443/TCP        24dnginx        NodePort    10.108.41.4      <none>      80:31434/TCP    24dweb         ClusterIP    10.105.53.183     <none>       80/TCP       2m40s[root@k8s-master ~]# curl 10.105.53.183        # 可以通过web的地址访问后面三个nginx集群 [root@k8s-master ~]# kubectl delete svc web2     # 可以删除其中一个Service三种常用类型
  • ClusterIP:集群内部使用

  • NodePort:对外暴露应用(集群外)

  • LoadBalancer:对外暴露应用,适用公有云

ClusterIP(VIP)

NodePort

图片

部署并测试

[root@k8s-master ~]# vim deployment.yaml apiVersion: apps/v1kind: Deploymentmetadata:  name: nginx-deployment  labels:    app: nginxspec:  replicas: 3  selector:    matchLabels:      app: nginx  template:    metadata:      labels:        app: nginx    spec:      containers:      - name: nginx        image: nginx:1.14.2        ports:        - containerPort: 80

查看nginx服务的标签

[root@k8s-master ~]# kubectl get pods --show-labelsNAME                       READY   STATUS    RESTARTS     AGE   LABELSnginx-6799fc88d8-s5rnz           1/1    Running   0          24d   app=nginx,pod-template-hash=6799fc88d8nginx-deployment-66b6c48dd5-hxv7h   1/1     Running   0          70s   app=nginx,pod-template-hash=66b6c48dd5nginx-deployment-66b6c48dd5-jjkk4   1/1     Running   0          70s   app=nginx,pod-template-hash=66b6c48dd5nginx-deployment-66b6c48dd5-tsgvb   1/1     Running   0          70s   app=nginx,pod-template-hash=66b6c48dd5

使用NodePort创建svc

[root@k8s-node2 ~]# vim service-nodeport.yamlapiVersion: v1kind: Servicemetadata:  name: web-nodeport  namespace: defaultspec:  ports:  - port: 80        # Service端口    protocol: TCP    # 协议    targetPort: 80    # 容器端口(程序启动端口,比如django默认是8000端口)    nodePort: 30706   # 指定NodePort监听的外网端口  selector:     app: nginx      # 指定关联Pod的标签(上面已经查到了,app=nginx)  type: NodePort      # 服务类型(只需要把服务类型修改成NodePort即可)

创建svc

[root@k8s-master ~]# kubectl apply -f service-nodeport.yaml

访问

  • 访问地址:<任意NodeIP>:NodePort

  • 端口范围:30000-32767

图片

NodePort弊端

LoadBalancer

LB说明

  • 负责均衡器有哪些:nginx、LVS、haproxy

  • 私有云:SLB、ELB

配置LB

  • 直接找一个nginx配置反向代理即可

stream {    log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';    access_log  /var/log/nginx/django-access.log  main;    upstream django-apiserver {                server 192.168.56.62:30706;                server 192.168.56.63:30706;            }       server {       listen 88;       proxy_pass django-apiserver;    }}

注意:生产最好使用云厂商的ELB或者SLB

Service二种特殊类型

  • ExternalName:引用集群外的服务

  • Headless:允许Pod通过其主机名被访问

    ExternalName Service

ExternalName Service说明:

ExternalName Service 是一种特殊类型的 Service,它不分配 ClusterIP,也不选择 Pods。相反,它允许你通过 Kubernetes Service 来引用外部的服务,比如一个托管在集群外的数据库或任何其他服务。

使用场景:

  • 引用集群外的服务。

  • 简化对外部服务的引用,不需要修改应用程序配置。

操作步骤:

  1. 创建一个 ExternalName 类型的 Service YAML 文件,指定 type: ExternalName 和 externalName 字段。

  2. 应用该 YAML 文件来创建 Service。

apiVersion: v1kind: Servicemetadata:  name: external-db-servicespec:  type: ExternalName  externalName: my.database.com  ports:  - port: 5432

实现效果:

  • 当你创建了上述 Service 后,Kubernetes 会创建一个 DNS 记录,使得external-db-service.default.svc.cluster.local解析到 my.database.com

  • 集群内的 Pod 可以通过这个 DNS 名称和端口号 5432 来访问外部的数据库服务。

ExternalName Service 优缺点:

优点:

  1. 简化外部服务引用:不需要修改应用程序的配置即可引用外部服务。

  2. 集成外部服务:可以无缝地将外部服务集成到Kubernetes集群的服务发现机制中。

  3. 灵活性:可以引用任何可通过DNS解析的服务,不限于特定的服务类型或协议。

缺点:

  1. 依赖外部服务:如果外部服务不可用,那么通过ExternalName Service 访问它也会失败。

  2. 没有负载均衡:不提供内置的负载均衡功能,所有流量直接转发到外部服务。

  3. 安全性:如果外部服务需要特定的安全措施,可能需要额外的配置。

Headless Service

Headless Service说明:

Headless Service 是一种不分配 ClusterIP 的 Service,它允许每个 Pod 通过其主机名直接被访问。

使用场景:

  • 当你不需要 Kubernetes 来管理负载均衡和路由时。

  • 当你想要直接控制 Pod 的访问方式时。

操作步骤:

  1. 创建一个 Service YAML 文件,不要指定 clusterIP: None(默认就是 None)。

  2. 应用该 YAML 文件来创建 Service。

apiVersion: v1kind: Servicemetadata:  name: headless-servicespec:  # 注意这里不指定 clusterIP  selector:    app: my-app  ports:  - name: http    port: 80    targetPort: 8080

实现效果:

  • 创建 Service 后,Kubernetes 会为每个匹配的 Pod 创建一个 DNS 记录。

  • Pod 可以通过 <pod-name>.headless-service.default.svc.cluster.local 来访问同一 Service 下的其他 Pod。

  • 这种方式不提供负载均衡,直接通过 DNS 解析到具体的 Pod。

Headless Service 优缺点:

优点:

  1. 直接访问:允许直接通过Pod的主机名访问,无需通过负载均衡器。

  2. 简单性:不需要Kubernetes进行流量管理和负载均衡,简化了网络架构。

  3. 适用于无状态服务:对于不需要负载均衡的无状态服务,Headless Service是一个轻量级的选择。

缺点:

  1. 没有负载均衡:不提供负载均衡,可能导致某些Pod过载而其他Pod空闲。

  2. 管理复杂性:需要手动管理Pod的访问和负载分配,增加了运维的复杂性。

  3. 扩展性问题:当服务需要水平扩展时,手动管理Pod的访问可能会变得不切实际。

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

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

相关文章

金山云Q2调整后EBITDA率提升至3.2% 高质量发展驱动经营质效双增

8月20日&#xff0c;金山云公布了2024年第二季度业绩。 季度内&#xff0c;金山云整体业绩延续向好态势&#xff0c;实现收入规模、盈利能力、经营现金流的联动共赢。财报显示&#xff0c;金山云Q2营收18.9亿元&#xff0c;公有云实现收入12.3亿元&#xff0c;行业云实现收入6…

GATK ReadLikelihoodCalculationEngine接口介绍

ReadLikelihoodCalculationEngine 是 GATK&#xff08;Genome Analysis Toolkit&#xff09;中的一个接口&#xff0c;用于计算不同等位基因&#xff08;haplotypes 或 alleles&#xff09;下的测序读数的似然值。这些似然值在变异检测过程中起着关键作用&#xff0c;帮助确定哪…

【C++ 第十四章】红黑树

前言&#xff1a; 学习本章&#xff0c;需要先学习 AVL树的 旋转&#xff0c;因为 红黑树也需要旋转调整来平衡&#xff0c;下面讲解将不赘述 旋转的原理和操作 红黑树的旋转 和 AVL树的旋转 唯一不同的是&#xff1a;旋转的判断使用逻辑 AVL树的旋转 可以通过 平衡因子 判断…

第3章处理机调度与死锁

一、处理机调度的层次和调度算法的目标 调度的实质是一种资源分配&#xff0c;处理机调度是对处理机资源进行分配。 1. 处理机调度的层次 (1)高级调度(作业调度)。 (2)中级调度(内存调度)。 (3)低级调度(进程调度)。 2. 处理机调度算法的目标 (1)资源利用率。 (2)公平性。 (3)平…

csrf漏洞(三)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言&#xff1a; 本文依靠phpstudy以及dvwa靶场进行操作&#xff0c;具体搭建流程参考&#xff1a;xss漏洞&#xff08;二&#xff0c;xss靶场搭建以及简单利用&#xff09; 前篇…

ArcGIS10.8 安装教程

目录 一、环境及安装包准备 二、安装流程 1、解压安装包ArcGIS_108.rar 2、安装 三、汉化 四、激活 五、自定义菜单&#xff08;可选&#xff09; 六、打开软件按查看 七、安装过程中出现的报错 八、其他 一、环境及安装包准备 安装环境&#xff1a;win7 安装包下载…

集团数字化转型方(五)

集团数字化转型方案通过全面整合人工智能&#xff08;AI&#xff09;、大数据分析、云计算和物联网&#xff08;IoT&#xff09;等前沿技术&#xff0c;构建了一个高度智能化的业务平台&#xff0c;从而实现业务流程的自动化、数据驱动的决策支持、精准的市场预测、以及个性化的…

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(一)---UnrealCV获取深度+分割图像

前言 本系列教程旨在使用UE5配置一个具备激光雷达深度摄像机的仿真小车&#xff0c;并使用通过跨平台的方式进行ROS2和UE5仿真的通讯&#xff0c;达到小车自主导航的目的。本教程使用的环境&#xff1a; ubuntu 22.04 ros2 humblewindows11 UE5.4.3python8 本系列教程将涉及以…

Leetcode JAVA刷刷站(58)最后一个单词的长度

一、题目概述 二、思路方向 要解决这个问题&#xff0c;你可以通过遍历字符串 s 并从后往前计数的方式来实现。但更简洁且易于理解的方法是&#xff0c;首先去除字符串尾部的空格&#xff08;如果有的话&#xff09;&#xff0c;然后找到最后一个单词的起始位置&#xff0c;并计…

XSS反射型和DOM型+DOM破坏

目录 第一关 源码分析 payload 第二关 源码分析 payload 第三关 源码分析 payload 第四关 源码分析 payload 第五关 源码分析 payload 第六关 源码分析 第七关 源码分析 方法一&#xff1a;构造函数 方法二&#xff1a;parseInt 方法三&#xff1a;locat…

【C语言】冒泡排序保姆级教学

C语言冒泡排序保姆级教学 直奔主题&#xff1a; 拿排升序举例子 第一步&#xff1a; 将想要排序的数组中数值最大的那个数排到该数组的最后 具体实现如下图&#xff1a; 第一步代码实现 for (int i 1; i < n ; i)//n为数组大小此处为4 {if (a[i - 1] > a[i])//注意越…

【java基础】IDEA 的断点调试(Debug)

目录 1.为什么需要 Debug 2.Debug的步骤 2.1添加断点 2.2单步调试工具介绍 2.2.1 Step Over 2.2.2 Step Into 2.2.3 Force Step Into 2.2.4 Step Out 2.2.5 Run To Cursor 2.2.6 Show Execution Poiint 2.2.7 Resume Program 3.多种 Debug 情况介绍 3.1行断点 3.2方…

[数据集][目标检测]锤子检测数据集VOC+YOLO格式1510张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1510 标注数量(xml文件个数)&#xff1a;1510 标注数量(txt文件个数)&#xff1a;1510 标注…

美团外卖新版 web mtgsig 1.2 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、 敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业 用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像或私信联…

Pcie学习笔记(24)

Ordering and Receive Buffer Flow Control 流量控制(FC)用于防止接收端缓冲区溢出&#xff0c;并使其符合定义的排序规则。请注意&#xff0c;请求者使用流量控制机制来跟踪代理中可用的队列/缓冲区空间&#xff0c;如图2-48所示。也就是说&#xff0c;流控制是点对点的(跨一…

集团数字化转型方案(六)

集团数字化转型方案旨在通过引入前沿技术&#xff0c;如人工智能&#xff08;AI&#xff09;、大数据分析、云计算和物联网&#xff08;IoT&#xff09;&#xff0c;全面提升业务运营效率和市场竞争力。该方案首先实现业务流程的自动化&#xff0c;减少人工干预&#xff0c;通过…

学习C语言 第十八天

第一项 C 强制类型转换 强制类型转换是把变量从一种类型转换为另一种数据类型。可以使用强制类型转换运算符来把值显式地从一种类型转换为另一种类型 (type_name) expression 一个整数变量除以另一个整数变量&#xff0c;得到一个浮点数&#xff1a; eg: #include <st…

AI在线免费数学工具:Qwen2-Math

1、Qwen2-Math https://huggingface.co/spaces/Qwen/Qwen2-Math-Demo

Python爬虫——简单网页抓取(实战案例)小白篇

Python 爬虫是一种强大的工具&#xff0c;用于从网页中提取数据。这里&#xff0c;我将通过一个简单的实战案例来展示如何使用 Python 和一些流行的库&#xff08;如 requests 和 BeautifulSoup&#xff09;来抓取网页数据。 实战案例&#xff1a;抓取一个新闻网站的头条新闻标…

【Qt】 常用控件QLCDNumber

常用控件QLCDNumber QLCDNumber是一个专门用来显示数字的控件&#xff0c;类似于“老式计算机”的效果。 QLCDNumber的属性 属性说明 intValue QLCDNumber 显⽰的数字值(int). value QLCDNumber 显⽰的数字值(double). 和 intValue 是联动的. 例如给 value 设为 1.5, i…