K8S的统一访问入口-Service

news2024/11/25 13:36:05

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

推荐: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.coloradmin.cn/o/2058093.html

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

相关文章

windows本地kafka和zookeeper单机版

文章目录 一、安装zookeeper1.下载zookeeper:[zookeeper下载](https://www.apache.org/dyn/closer.cgi/zookeeper/)2.添加配置文件3.配置windows系统环境变量(可以百度)4.随便打开一个cmd 二、安装kafka1.下载kafka2.修改config目录下的server.properties 三&#xff0c;开始运…

队列的实现和基本操作

队列的表示和实现 <队列是仅在表尾进行插入操作&#xff0c;在表头进行删除操作的线性表&#xff1b; <表尾即an端&#xff0c;表头即a1端&#xff1b;(也称作队尾队头) <它是一种先进先出的(FIFO)线性表 <例如Q(a1,a2,a3,......,an),a1为队头&#xff0c;an…

【中介者模式】设计模式系列:解锁高效协作的秘密武器(设计实战)

文章目录 中介者模式在Java中的应用与实践1. 引言2. 中介者模式解析2.1 模式的基本概念2.2 中介者模式的角色说明2.3 模式的工作原理2.4 UML类图和时序图展示2.5 模式的优点与缺点2.6 模式的变体和扩展 3. 实现细节3.1 Java代码示例3.2 示例应用分析3.3 代码解释 4. 应用场景5.…

css中使用@property自定义属性,实现闪烁渐变背景【2024新属性】

自 2024 年 7 月起&#xff0c;此功能适用于最新的设备和浏览器版本。此功能可能无法在较旧的设备或浏览器中使用。 property 是 CSS 中一个相对较新的功能&#xff0c;主要用于定义自定义属性&#xff08;即 CSS 变量&#xff09;的类型、继承性以及初始值。它允许开发者更好地…

linux使用nginx部署springboot + vue分离项目

第一步,打包后端项目 maven打包springboot项目为jar文件,上传到服务器,然后运行此jar,具体操作参考: centos部署jar包_centos jar 静态资源文件-CSDN博客 第二步,安装nginx 具体操作自行查找,相关命令: 启动: /usr/local/nginx/sbin/nginx 重新加载配置: /usr…

[数据集][目标检测]木材缺陷检测数据集VOC+YOLO格式2383张10类别

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

PyQt5基础控件

一、按钮 (一)普通按钮QPushButton 1.创建按钮控件 QPushButton()&#xff1a;创建一个无父控件的按钮控件QPushButton(parent)&#xff1a;创建控件的同时, 设置父控件QPushButton(text, parent)&#xff1a;创建控件的同时, 设置提示文本和父控件QPushButton(icon, text, …

自定义组件上传到maven中央仓库2024实测可用最详细版

自 2024 年 3 月 12 日起&#xff0c;官方调整了发布的方式&#xff0c;所有发布都必须通过中央门户&#xff0c;以往老方式可能不适用&#xff0c;以下记录2024新版上传发布方式 注册sonatype账号 Maven中央仓库并不支持直接发布jar包&#xff0c;sonatype是其指定的第三方仓…

【Python】函数进阶(上)

本篇文章将讲解函数进阶的知识&#xff1a; &#xff08;1&#xff09;函数的补充 &#xff08;2&#xff09;函数名是什么 &#xff08;3&#xff09;返回值和print &#xff08;4&#xff09;函数的作用域 1、函数的补充 &#xff08;1&#xff09;参数内存地址相关 如何查…

【算法专题】滑动窗口类

个人主页&#xff1a;CSDN_小八哥向前冲~ 所属专栏&#xff1a;算法基础入门 目录 长度最小的子数组 无重复字符的最长子串 最大连续1的个数 将x减到0的最小操作数 水果成篮 找到字符串中所有字母异位词 最小覆盖字串 长度最小的子数组 题目&#xff1a;【LeetCode】长度…

Python生成432Hz音频

使用 numpy 来生成信号&#xff0c; 使用 matplotlib 可视化信号&#xff0c; 使用 sounddevice 播放声音。 以下生成和播放 432 Hz 的正弦波信号&#xff1a; import numpy as np import sounddevice as sd import matplotlib.pyplot as plt# 生成单音函数 def generate_to…

订单完工数量超过了最大可完工数量

本次完工将造成订单YWS-24070027产出实际完工数量达到了6093.000000000&#xff0c;超过了最大可完工数量5000.000000000 一个成品入库单被它们玩坏了。生产不知道生产了什么。PMC不知道要入库什么。鸡同鸭天天开会之后结果就是单据重复的开立&#xff0c;删除&#xff0c;开立…

C++ TinyWebServer项目总结(5. Linux网络编程基础API)

还是给我的语雀文档打个广告&#xff1a; 《5. C TinyWebServer项目总结&#xff08;5. Linux网络编程基础API&#xff09;》我的文章都是先在语雀里记录的&#xff0c;然后再同步发送到CSDN上&#xff0c;有些格式问题实在是懒得改了&#xff0c;可能会导致大家看的不舒服&…

自行车制造5G智能工厂工业物联数字孪生平台,推进制造业数字化

在当今这个日新月异的数字化时代&#xff0c;制造业正经历着前所未有的变革&#xff0c;自行车制造5G智能工厂工业物联数字孪生平台的兴起&#xff0c;无疑是这场转型浪潮中一股强劲力量。自行车制造5G智能工厂工业物联数字孪生平台的成功应用&#xff0c;不仅仅是技术上的突破…

代码随想录DAY21 - 二叉树 - 08/20

目录 修建二叉搜索树 题干 思路和代码 递归法 迭代法 将有序数组转化为平衡二叉搜索树 题干 思路和代码 递归法 递归优化 迭代法 把二叉搜索树转换为累加树 题干 思路和代码 递归法 迭代法 修建二叉搜索树 题干 题目&#xff1a;给你二叉搜索树的根节点 root …

数据结构【顺序结构二叉树:堆】(1)

​​​​​​​ &#x1f31f;个人主页&#xff1a;落叶 目录 ​ &#x1f525;树的概念与结构​​​​​​​ &#x1f525;树的表⽰ &#x1f525;孩⼦兄弟表⽰法&#xff1a; &#x1f525;树形结构实际运⽤场景 &#x1f525;⼆叉树 &#x1f525;概念与结构 &…

day4JS-数组

1. 什么是数组 数组是值的有序集合。每个值叫做一个元素。每个元素在数组中有一个位置, 以数字表示,称为索引 (有时也称为下标)。数组的元素可以是任何类型。数组索引从 0 开始,数组最大能容纳 4294967295 个元素。 2. 数组的声明与使用 2.1 使用字面量的方式声明数组 语法…

Minio web控制台实现授权管理

启动minio ./minio server /data01/aidacp/apps/minio/data --config-dir /data01/aidacp/apps/minio/conf --address 127.0.0.1:19090 --console-address 127.0.0.1:19091 &WARNING: Detected Linux kernel version older than 4.0.0 release, there are some known pote…

建设项目跟踪与展示系统

这是在翻旧文件时翻到的16年写的一个项目 建设项目跟踪与展示系统 建设方案 一、系统建设目的及意义 建设工程项目进度控制的最终目的是确保建设项目按预定的时间完成。能否在预定的时间内交付使用&#xff0c;直接影响到投资效益。为解决施工组织过程中存在问题&#xff0c;…

PyTorch深度学习实战(25)—— 使用向量化思想解决实际问题

本文将实际应用向量化思想解决深度学习中的几个经典问题,读者可以在这些示例中进一步领悟向量化思想和高级索引思想。 1. Box_IoU Box_IoU是目标检测任务中最基本的评价指标。简单来说,Box_IoU就是模型预测的检测结果框(predicted bbox)与原始标记框(ground truth)之间的…