k8s学习笔记8——Service

news/2025/9/19 15:33:09/文章来源:https://www.cnblogs.com/karl-python/p/19100947

k8s学习笔记8——Service

容器带来的问题

  • 自动调度: 在Pod创建之前,用户无法预知Pod所在节点以及Pod的IP地址
  • 一个已经存在的Pod在运行过程中,出现故障,Pod也会在新的节点使用新的IP进行部署
  • 应用程序访问服务时,地址是不能经常转变的
  • 多个相同的Pod如何访问他们上面的服务

service服务原理

  • 自动感知: 服务会创建一个clusterIP,对应资源地址,不管Pod如何变化,服务总能找到对应的Pod,且clusterIP保持不变
  • 负载均衡: 若服务器后端对应多个Pod,则会通过IPTables/LVS规则 访问请求最终映射到Pod容器内部,自动实现多个容器的负载均衡
  • 自动发现: 服务创建时会自动在内部dns上注册域名
  • 域名: <service-name>.<namespace>.svc.cluster.local

 

Service可以看作是一组同类Pod对外的访问接口。

 

Service有4种类型:

  1. ClusterIP :默认值,系统自动分配的虚拟IP,只能在集群内部访问  
  2. NodePort :将Service通过指定Node上的端口暴露给外部,可在集群外部访问服务
  3. LoadBalancer :使用外部负载均衡器完成到服务的负载分发,此类型需要外部云环境
  4. ExternalName :把集群外部的服务引入集群内部,直接使用
  • 区别总结:
    • 访问范围:ClusterIP仅限集群内;NodePort需节点IP+端口;LoadBalancer/ExternalName可公网访问
    • 部署场景:ClusterIP适合内部通信;NodePort/LoadBalancer用于服务暴露;ExternalName用于映射外部资源

 

一. ClusterIP

image

 默认的ServiceType,通过集群内部IP暴露服务,该服务只能在集群内部访问

  • 默认类型: 实现Pod的自动感知与负载均衡,是最核心的服务类型,但ClusterIP不能对外发布服务,相对外发布服务只能使用NodePort或lngress
  • 工作原理: kube-proxy 是在所有节点上运行的代理,可以实现简单的数据转发,设置更新IPTables/LVS规则,服务创建时,还提供服务地址DNS自动注册与服务发现功能
  • 查看DNS IP: kubectl -n kube-system get service kube-dns
  • 解析域名的软件包: bind-utils
  • 创建service资源文件模板: kubectl create service clusterip mysvc --tcp=80:80 --dry-run=client -o yaml
 1 [root@master ~]# vim mysvc.yaml
 2 ---
 3 kind: Service       # 资源对象类型
 4 apiVersion: v1      # 版本
 5 metadata:           # 元数据
 6   name: mysvc       # 资源对象名称
 7 spec:               # 详细信息
 8   type: ClusterIP   # 服务类型
 9   clusterIP: 10.245.1.80 # 可以设置ClusterIP
10   selector:         # 选择算符
11     app: web        # Pod标签
12   ports:            # 端口
13   - protocol: TCP   # 协议
14     port: 80        # 监听的端口,service端口
15     targetPort: 80  # 后端服务器端口,pod端口

 1 ## 创建Service
 2 
 3 [root@master ~]# kubectl apply -f mysvc.yaml
 4 service/mysvc created
 5 [root@master ~]# kubectl get service
 6 NAME        TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S) AGE
 7 kubernetes  ClusterIP  10.245.0.1     <none>       443/TCP 9d
 8 mysvc       ClusterIP  10.245.186.38  <none>       80/TCP 8s
 9 
10 11 ## 域名解析 12 # 安装工具软件包 13 [root@master ~]# dnf -y install bind-utils 14 15 # 查看 DNS 服务地址 16 [root@master ~]# kubectl -n kube-system get service kube-dns 17 NAME TYPE LUSTER-IP EXTERNAL-IP PORT(S) AGE 18 kube-dns ClusterIP 10.245.0.10 <none> 53/UDP,53/TCP,9153/TCP 9d 19 20 # 域名解析测试 21 [root@master ~]# host mysvc.default.svc.cluster.local 10.245.0.10 22 Using domain server: 23 Name: 10.245.0.10 24 Address: 10.245.0.10#53 25 Aliases: 26 mysvc.default.svc.cluster.local has address 10.245.186.38

 

二. NodePort

[root@master ~]# vim mysvc1.yaml
---
kind: Service
apiVersion: v1
metadata:name: mysvc1
spec:type: NodePort # 服务类型selector:app: webports:- protocol: TCPport: 80nodePort: 30080 # 映射端口号targetPort: myhttp
[root@master ~]# kubectl apply -f mysvc1.yaml
service/mysvc1 created
[root@master ~]# kubectl get service
NAME       TYPE      CLUSTER-IP     EXTERNAL-IP PORT(S)      AGE
kubernetes ClusterIP 10.245.0.1     <none>      443/TCP      3h53m
mysvc      ClusterIP 10.245.1.80    <none>      80/TCP       3h35m
mysvc1     NodePort  10.245.235.255 <none>      80:30080/TCP 15s

 

三. iptables & IPVS

  • Service的原理是基于iptables和IPVS实现的。
  • 当创建一个Service对象时,Kubernetes会为该Service创建一个虚拟IP地址,并将该地址绑定到一个iptables规则中。
  • 当Pods需要与该Service通信时,它们会向该虚拟IP地址发送请求,请求会被iptables规则捕获并转发到正确的Pods上。
  • 对于大规模生产环境,Kubernetes还支持使用IPVS来实现负载均衡和服务发现

IPVS和iptables规则有何区别?

IPVS和iptables规则都是Linux内核提供的功能,用于实现网络中的流量控制和路由。它们的主要区别在于它们的应用场景和实现方式。

iptables :

  iptables是Linux内核中的一个模块,提供了一个基于规则的防火墙和流量控制功能。iptables规则可以基于源IP地址、目标IP地址、端口号和协议等条件来过滤和转发流量。

  在Kubernetes中,iptables规则通常用于实现Service的负载均衡和服务发现功能

IPVS:

  IPVS是Linux内核中的另一个模块,提供了一个高效的负载均衡和服务发现功能。它使用一组IPVS规则来将流量路由到后端服务器上,并支持多种负载均衡算法。

  在Kubernetes中,IPVS可以用于替代iptables规则来实现更高效的负载均衡和服务发现功能

使用场景:

  • IPVS:负载均衡和服务发现功能更加高效和灵活,特别是在大规模生产环境中。但是,它需要更多的配置和管理工作,也需要系统管理员具备更深入的网络知识。
  • iptables:规则则更加简单易用,适合小规模和简单的网络环境。

 

四. NodePort & Ingress

ClusterIP不能对外发布服务,如果想对外发布服务可以使用NodePort 或Ingress

  • NodePort: 使用基于端口映射(默认值: 30000-32767)的方式对外发布服务,可以任意发布服务(四层)
  • Ingress: 使用Ingress控制器(一般由Nginx或HAProxy构成),用来发布http,https服务(七层,只能发布这俩个服务)
  • 7层负载均衡比4层负载均衡更加智能
  • 4层负载均衡比7层负载均衡更加简洁高效

1)获取Ingress

 1 # 创建文件夹
 2 [root@master ~]# mkdir ingress-controller
 3 [root@master ~]# cd ingress-controller/
 4  
 5 # 获取ingress-nginx,本次案例使用的是0.30版本
 6 [root@master ingress-controller]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
 7 [root@master ingress-controller]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
 8  
 9 # 修改mandatory.yaml文件中的仓库
10 # 修改quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
11 # 为registry.aliyuncs.com/google_containers/nginx-ingress-controller:0.30.0
12 # 创建ingress-nginx
13 [root@master ingress-controller]# kubectl apply -f ./
14  
15 # 查看ingress-nginx
16 [root@master ingress-controller]# kubectl get pod -n ingress-nginx
17 NAME                                           READY   STATUS    RESTARTS   AGE
18 pod/nginx-ingress-controller-fbf967dd5-4qpbp   1/1     Running   0          12h
19  
20 # 查看service
21 [root@master ingress-controller]# kubectl get svc -n ingress-nginx
22 NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
23 ingress-nginx   NodePort   10.98.75.163   <none>        80:32240/TCP,443:31335/TCP   11h

2)创建Ingress

 1 [root@master ingress]# vim mying.yaml
 2 ---
 3 kind: Ingress              # 资源对象类型
 4 apiVersion: networking.k8s.io/v1 # 资源对象版本
 5 metadata:                  # 元数据
 6   name: mying              # 资源对象名称
 7 spec:                      # 资源对象定义
 8   ingressClassName: nginx  # 使用的类名称
 9   rules:                   # ingress规则定义
10   - host: nsd.tedu.cn      # 域名定义,没有可以不写
11     http:                  # 协议
12       paths:               # 访问的路径定义
13       - path: /            # 访问的url路径
14         pathType: Prefix   # 路径类型:Exact、Prefix
15         backend:           # 后端服务
16           service:         # 服务声明
17             name: mysvc    # 服务名称
18             port:          # 端口号声明
19               number: 80   # 访问服务的端口号
20  
21 [root@master ingress]# kubectl apply -f mying.yaml
22 ingress.networking.k8s.io/mying created
23 [root@master ingress]# kubectl get ingress
24 NAME   CLASS HOSTS       ADDRESS      PORTS AGE
25 mying  nginx nsd.tedu.cn 192.168.1.51 80    10s
26 [root@master ingress]# curl -H "Host: nsd.tedu.cn" http://192.168.1.51
27 Welcome to The Apache.

 

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

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

相关文章

逆向分析之if语句与循环语句的分析

前言 本次我们要介绍if语句,for循环编译后的反汇编内容,以C/C++编写的可执行程序为例进行分析 一只Demo 首先是一只Demo,是我们本次分析对象的源码 #include <stdio.h>void if_demo(int v) {if (v > 5)pri…

读书笔记:索引组织表(IOT):让数据库查询飞起来的黑科技

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。本文为个人学…

AI 自动化智能体训练营

课程背景与解决的问题 你是否也有这样的困扰? 每天被大量重复劳动占据时间? 报表、PPT、文案写得慢,效率低? 想用 AI 提高效率,却不知道从哪入手? 想做副业/创业,但缺乏技术与工具? 👉 这门训练营,将带你从…

ROMA-iOS适配深色模式总结

一、背景深色模式在低光环境下(如夜间使用)可以显著减少屏幕发出的蓝光,降低眼睛疲劳,减轻视觉压力。深色背景配合浅色文字能提供更好的对比度和可读性,减少眩光,让内容更易于阅读。深色模式还可以显著节省电量,…

本地(或自下载)浏览器插件 安装指南

1 首先准备好安装包 通过不用渠道下载所要安装插件的压缩包 2 安装流程 第一步 解压 解压压缩包至文件夹中,请确保您的电脑上已安装解压工具,否则会解压失败 1)mac系统中,双击压缩包即可完成解压。 2)win系统解压…

Docker是什么?最全Docker使用教程(小白到高手) - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

408学习之c语言(结构体) - 教程

408学习之c语言(结构体) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…

路由查看命令

路由查看命令多网卡,软路由设置route print //查看当前路由表route print -4 //查看当前IPv4路由表网络目标,网络掩码,网关,跃点数route print //查看当前路由表route print -4 //查看当前IPv4路由表route delete …

Linux 基础命令01

一、线上查询及帮助命令 1.1 man root@ubuntu2204:~/test 14:28:16 # man ls1.2 help root@ubuntu2204:~/test 14:30:00 # ls --help1.3 info root@ubuntu2204:~/test 14:30:47 # info ls二、文件和目录操作命令 2.1 l…

Git 指令笔记 - 详解

Git 指令笔记 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "…

Syntax Error: TypeError: eslint.CLIEngine is not a constructor 解决方案

Syntax Error: TypeError: eslint.CLIEngine is not a constructor 解决方案 删除 package-lock.json 然后 删除 node_modules 从新 npm install 然后再revert package-lock.json (别动项目文件)(如果按新包了,再区…

TDMQ CKafka 版客户端实战指南系列之一:生产最佳实践

TDMQ CKafka 版客户端实战指南系列之一:生产最佳实践导语 在当今数字化时代,数据的产生和流动呈爆发式增长,消息队列作为一种高效的数据传输和处理工具,在各种应用场景中发挥着关键作用。TDMQ CKafka 版作为一款分…

【ACM出版】2025年人工智能、虚拟现实与交互设计国际学术会议(AIVRID 2025)

2025年人工智能、虚拟现实与交互设计国际学术会议(AIVRID 2025)将于2025年10月17-19日在中国广东省东莞市召开。【ACM出版社出版-高录用,快检索-最快见刊后1个月EI & Scopus检索】 【海内外高校、IEEE Fellow等…

《sklearn机器学习——特征提取》 - 指南

《sklearn机器学习——特征提取》 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

Windows 10 11 Boot Fix

修復啟動程式碼Bootrec.exe 例如主開機記錄、開機設定資料儲存 (BCD) 和開機磁區。 更新主開機記錄和開機磁區程式碼來修復問題。修復引導程式碼 步驟1.按「Windows + S」開啟搜尋框。然後,在其中鍵入cmd 或命令提示符…

ubuntu 安装 milvus

docker 是 引擎,是底层的基础工具。它用于管理单个容器(Container)的生命周期(构建、运行、停止、删除)。 docker-compose 是 编排工具,是上层的操作界面。它用于定义和运行由多个容器组成的、相互关联的整套应用…

完整教程:MySQL并发问题解析

完整教程:MySQL并发问题解析2025-09-19 15:02 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important…

面向多模态检索的向量数据库对比分析和技术选型:Elasticsearch、Milvus、Pinecone、FAISS、Chroma、PGVector、Weaviate、Qdrant

目录1.向量数据库1.1 Elasticsearch 1.2 Milvus 1.3 Pinecone 1.4 FAISS 1.5 Chroma 1.6 PGVector 1.7 Weaviate 1.8 Qdrant2.向量数据库对比分析 3.多模态大规模图文检索选型3.1需求分析 3.2推荐方案 3.3实施建议 1.…

SI/PI学习笔记1 -20250911

SI/PI学习笔记1 -20250911作为硬件测试工程师,随着信号传输速度的迭代升级,分析信号和电源完整性将成为一个必然的趋势。SI全称为Signal Integrity 信号完整性,PI全称为Power Integrity 电源完整性。 从测试方面来…

Web开发工具一套式部署Maven/Nvm/Mysql/Redis - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …