李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 系列文章
  • AI工具集
  • 论坛
  • 左邻右舍
    • 左邻右舍
    • 朋友圈
    • 游客中心
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • Now
    • 每日心情
    • 网站地图
    • 网站统计
    • 赞助
  • 星球穿梭
  • 🚇开往
白雪成红
惟坚韧者始能遂其志
  1. 首页
  2. 转载
  3. 技术
  4. 正文

Kubernetes(K8s)的Service运行原理

2019年10月23日 约 902 字4 分钟 220 0 0
本文最后更新于 2019年10月23日,距今已 2545 天,其中的信息可能已经发生变化,请注意甄别。

一、为什么Servcie能定位到Pod

因为Pod的IP是不固定的,所以Kubernetes需要Service,除此之外它还可以在多个Pod间负载均衡
Service的访问入口,其实是宿主机的kube-proxy生成的iptables规则 ,及kube-dns生成的DNS记录

Service通过label标签选中Pod,被选中的的Pod称为Service的Endpoints
示例如下

# kubectl get ep hostnames
NAME ENDPOINTS AGE
hostnames 10.244.0.241:9376,10.244.0.242:9376,10.244.0.243:9376 20m

可以看到,当我们访问hostnames这个service时,会被定位到10.244.0.241:9376,10.244.0.242:9376,10.244.0.243:9376
注意:只有处于Running状态,且readlinessProbe检查通过的Pod,才会出现在Endpoints列表里

我们再查看servcie

# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hostnames ClusterIP 10.111.15.33 <none> 80/TCP 23m

service列表的VIP(ClusterIP),是设置了一个固定的入口地址,并没有真正的网络设备,ping是没有响应的
通过访问10.111.15.33,就可以访问到它所代理的Pod了
Service的实现原理是由kube-proxy组件,加上iptables来共同实现的,当提交service后,会创建这样一条iptables规则

-A KUBE-SERVICES -d 10.111.15.33/32 -p tcp -m comment --comment "default/hostnames: cluster IP" -m tcp --dport 80 -j KUBE-SVC-NWV5X2332I4OT4T3

iptables规则 的含义是:凡是上的地址是10.111.15.33、目的端口是80的IP包,都会跳转到KUBE-SVC-NWV5X2332I4OT4T3的iptables链处理
KUBE-SVC-NWV5X2332I4OT4T3是一组集合,如下

-A KUBE-SVC-NWV5X2332I4OT4T3 -m comment --comment "default/hostnames:" -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-WNBA2IHDGP2BOBGZ
-A KUBE-SVC-NWV5X2332I4OT4T3 -m comment --comment "default/hostnames:" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-X3P2623AGDH6CDF3
-A KUBE-SVC-NWV5X2332I4OT4T3 -m comment --comment "default/hostnames:" -j KUBE-SEP-57KPRZ3JQVENLNBR

这是一组随机模式的iptables链,这三条链是DNAT规则,三条链指向的最终目的地是Service代理的三个Pod
iptables规则的匹配是从上到下逐条进行的,为了让每条概率都相同,probability分别被设置成了1/3、1/2和1

当访问Service的VIP的IP包经过上述iptables处理后,就变成了访问具体某一个后端Pod的IP包了,这些Endpoints对应的规则,是kube-proxy通过监听Pod的变化事件,在宿主机上生成并的维护

二、Servcie在外部访问的三种方式

1. nodePort模式

示例yaml

apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  type: NodePort
  ports:
  - nodePort: 8080
    targetPort: 80
    protocol: TCP
    name: http
  - nodePort: 443
    protocol: TCP
    name: https
  selector:
    run: my-nginx

访问方式:<任何一台宿主机的IP地址>:8080

宿主机上没有任何一个代理的Pod存在,不能直接访问通过IP访问Pod,只能由宿主机转发

2.LoadBalancer

示例yaml

kind: Service
apiVersion: v1
metadata:
  name: example-service
spec:
  ports:
  - port: 8765
    targetPort: 9376
  selector:
    app: example
  type: LoadBalancer

K8S使用了一个CloudProvier转接层,跟公有云api对拉,当LoadBalancer的Service被提交后,
K8S会在公有云创建一个负载均衡服务,把代理的Pod地址代理给负载均衡后端

3.ExternalName

示例yaml

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  type: ExternalName
  externalName: my.database.example.com

不需要label选择,相当于在kube-dns里添加了一条CNAME记录
访问my-servcie.default.svc.cluster.locl和访问my.database.example.com一样

另外,还允许配置公有IP地址

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 9376
  externalIPs:
  - 80.11.12.10

三、解决问题思路

1.DNS无法访问Service

在一个 Pod 里执行nslookup排查

$ nslookup kubernetes.default
Server:    10.0.0.10
Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes.default
Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local

2. Service无法通过ClusterIP访问时

检查这个Service的Endpoints

kubectl get endpoints hostnames
NAME        ENDPOINTS
hostnames   10.244.0.5:9376,10.244.0.6:9376,10.244.0.7:9376

如果Pod的readniessProbe没通过,不会出现在Endpoints列表
如果Endpoints正常,再确认kube-proxy和宿主机的iptables是否正常

 

原文链接:https://www.cnblogs.com/chenqionghe/p/11720679.html

参考链接

1
  1. 1www.cnblogs.comwww.cnblogs.com
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

Kubernetes(K8s)的Service运行原理

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: Kubernetes
最后更新:2019年10月23日

岁月同一天 10 月 12 日

回望过去的今天,你在写什么

  • 5 年前 2021年10月12日
    新买的笔记本发货啦……

    国庆节期间狠狠心咬咬牙,贡献了点儿GDP,买了个MBP,我都快要忘记这事儿的时候,突然收到短信提醒说是发货了……哎妈呀,…

  • 7 年前 2019年10月12日
    Spring Boot发展史(Spring Boot介绍)

    Spring 历史 说起 Spring Boot 我们不得不先了解一下 Spring 这个企业,不仅因为 Spring …

  • 7 年前 2019年10月12日
    【漫画】戏说外行对程序员的误会有多深

    程序员如今已经发展成社会的主流职业,以至于街头的王大妈李大爷都能说出一二来,据说他们认为的程序员是这样子的: 1.程序员…

  • 7 年前 2019年10月12日
    JAVA之从线程安全说到锁

    什么是线程安全? 线程安全是指保证多线程环境下共享的、可修改的状态的正确性。 线程安全需要保证几个基本特性 原子性:相关…

相关文章
  • 什么是Helm?2025年6月4日
  • 从零开始入门 K8s | Kubernetes 网络概念及策略控制2019年10月17日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

还没有评论,快来抢沙发吧~

九年没联系的女友突然问我借钱,我开口道:四十万行么?不够了再说话。”前女友很是高兴地回复说:“够用,还是我男朋友有办法啊,你放心,我日后一定还给你,九年多没见了你现在干啥呢,这么有钱?”我呵呵一笑:“没事,不够用您尽管说话,俺现在改做抵押贷款了。”

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
讨论下XXL-JOB GLUE模式的安全问题 心气没了,干什么都不得劲 Kratos-plus v1.1.26版本更新说明 我觉得是时候公布我的导航网站了 代码是 AI 写的,生产事故谁背锅? 给主题增加了游客中心功能
给主题增加了游客中心功能我觉得是时候公布我的导航网站了游本昌去世关于主题加载速度优化的一点儿小演进心气没了,干什么都不得劲给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能
Gemini 3.0与Antigravity:AI编程重构开发范式,开发者如何破局新生? 什么是RESTful?RESTful详解 @Valid 和 @Validated 的区别 你好,2023 图数据库选型:Neo4j、Janus、HugeGraph 玩博客的人是不是越来越少了?
最近评论
彬红茶 发布于 1 天前(10月11日) 硬盘现在都好贵呀,估计还得过渡几年,AI算力不够了
老张博客 发布于 2 天前(10月10日) NAS现在就不要搞了吧,除非你手里有内存和硬盘。
李锋镝 发布于 2 天前(10月10日) 确实,很多不必要的东西,买了回来也是吃灰……
林羽凡 发布于 2 天前(10月10日) 一个是不想折腾了,另一个有些觉得没必要的折腾或购买,想想就会算了。
李锋镝 发布于 2 天前(10月10日) 少年老成吧大概是 :21:
标签聚合
ElasticSearch JVM 分布式 Claude 数据库 Redis 日常 K8s Theme AI SpringBoot 多线程 SQL IDEA 架构 Spring WordPress JAVA AI编程 MySQL
友情链接
  • 志文工作室
  • 韩小韩博客
  • 皮皮社
  • Serendipity
  • 懋和道人
  • sssr7844的博客
  • 老张博客
  • Mr.Sun的博客
  • 知向前端
  • Honesty
  • 哥斯拉
  • 瓦匠个人小站
  • 搬砖日记
  • 韩情脉脉
  • lijie blog
  • 九仞之行
  • 林羽凡
  • 彬红茶日记

COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

lifengdi.com 十年之约虫洞

Domain age badge for lifengdi.com

Theme Kratos-plus By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号