李锋镝的博客 - LiFengdi.Com

  • 首页
  • 时间轴
  • 留言
  • 左邻右舍
  • 我的日常
  • 关于我
青衿之志 履践致远
霁月光风 不萦于怀
  1. 首页
  2. 转载
  3. 技术
  4. 正文

Kubernetes(K8s)的Service运行原理

2019年10月23日 12297点热度 0人点赞 0条评论

一、为什么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

除非注明,否则均为李锋镝的博客 - LiFengdi.Com原创文章,转载必须以链接形式标明本文链接
本文链接:https://www.lifengdi.com/archives/transport/1361
标签: Kubernetes
最后更新:2019年10月23日

李锋镝

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

打赏 点赞
< 上一篇
下一篇 >
guest
您的姓名(必填)
您的邮箱(必填)
您的站点
guest
您的姓名(必填)
您的邮箱(必填)
您的站点
0 评论
Inline Feedbacks
查看所有评论
文章目录
  • 一、为什么Servcie能定位到Pod
  • 二、Servcie在外部访问的三种方式
    • 1. nodePort模式
    • 2.LoadBalancer
    • 3.ExternalName
  • 三、解决问题思路
    • 1.DNS无法访问Service
    • 2. Service无法通过ClusterIP访问时
网站统计
  • 文章总数:264 篇
  • 评论总数:421 篇
  • 标签数量:218 个
  • 最后更新:2022年06月28日
  • 建站日期:2016年6月6

爆竹声中一岁除,春风送暖入屠苏。
千门万户曈曈日,总把新桃换旧符。

最新 热点 随机
最新 热点 随机
MybatisCodeHelperPro激活 @Resource 和 @Autowired 的区别 使用RocketMQ时,服务启动过程中,Consumer在服务未启动时消费消息问题处理 祝大家六一儿童节快乐~~~ 网易云什么时候能有杰伦的歌…… jsdelivr的CDN加速好像不行了……
居家办公了~办理居住证困难重重啊!WordPress的自动更新好烦啊醒醒~补个税了居住证签注...十一节后开工头一天,修了个耳机……
Docker打包部署示例 WordPress评论框增加自定义表情 PHP版本怎么更新啊…… 分布式锁-Zookeeper实现分布式锁 Chrome等浏览器下出现net::ERR_BLOCKED_BY_CLIENT的解决办法 SpringBoot启动概述(SpringBoot2.1.7)
最近评论
张三 发布于 1 个月前(05月20日) 收到,谢谢博主啊
张三 发布于 1 个月前(05月20日) 请问是哪些插件啊,我想用一下试试
zenmexiugai 发布于 1 个月前(05月20日) 改成一样的还是报错,怎么回事呢
张三 发布于 1 个月前(05月19日) 我不会css,作者的前端是怎么写的啊?包括这些评论啊什么的
张三 发布于 1 个月前(05月19日) 很棒的博客 作者加油啊
有情链接
  • 志文工作室
  • 临窗旋墨
  • 旧时繁华
  • 城南旧事
  • 强仔博客
  • 林三随笔
  • 徐艺扬的博客
  • 猫鼬的星球计划
  • 云辰博客
  • 韩小韩博客
  • 知向前端
  • 阿誉的博客
  • 林羽凡
  • 情侣头像
  • 哥斯拉
  • Xym's blog

COPYRIGHT © 2022 lifengdi.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

豫ICP备16004681号-2