深入剖析 Kubernetes
张磊
Kubernetes 社区资深成员与项目维护者
116708 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
再谈开源与社区 (1讲)
结束语 (1讲)
深入剖析 Kubernetes
15
15
1.0x
00:00/00:00
登录|注册

38 | 从外界连通Service与Service调试“三板斧”

检查kubelet的hairpin-mode设置
为Service分配公有IP地址
通过Service的DNS名字访问
Kubernetes 1.7后支持的新特性
CloudProvider的转接层
适用于公有云上的Kubernetes服务
SNAT操作的原理
kube-proxy生成的iptables规则
通过NodePort方式访问Service
Kubernetes要求externalIPs必须是至少能够路由到一个Kubernetes的节点的原因
Service和DNS机制不具备强多租户能力
Service是Kubernetes为Pod分配的访问入口
Pod没办法通过Service访问
Service没办法通过ClusterIP访问
Service没办法通过DNS访问
ExternalName
LoadBalancer
NodePort
思考题
总结
问题定位方法
三种外部访问Service的方式
Service的访问信息在Kubernetes集群之外无效
从外界连通Service与Service调试“三板斧”

该思维导图由 AI 生成,仅供参考

你好,我是张磊。今天我和你分享的主题是:从外界连通 Service 与 Service 调试“三板斧”。
在上一篇文章中,我为你介绍了 Service 机制的工作原理。通过这些讲解,你应该能够明白这样一个事实:Service 的访问信息在 Kubernetes 集群之外,其实是无效的。
这其实也容易理解:所谓 Service 的访问入口,其实就是每台宿主机上由 kube-proxy 生成的 iptables 规则,以及 kube-dns 生成的 DNS 记录。而一旦离开了这个集群,这些信息对用户来说,也就自然没有作用了。
所以,在使用 Kubernetes 的 Service 时,一个必须要面对和解决的问题就是:如何从外部(Kubernetes 集群之外),访问到 Kubernetes 里创建的 Service?
这里最常用的一种方式就是:NodePort我来为你举个例子。
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
在这个 Service 的定义里,我们声明它的类型是,type=NodePort。然后,我在 ports 字段里声明了 Service 的 8080 端口代理 Pod 的 80 端口,Service 的 443 端口代理 Pod 的 443 端口。
当然,如果你不显式地声明 nodePort 字段,Kubernetes 就会为你分配随机的可用端口来设置代理。这个端口的范围默认是 30000-32767,你可以通过 kube-apiserver 的–service-node-port-range 参数来修改它。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了在Kubernetes集群中如何从外部访问Service以及Service调试的“三板斧”,包括NodePort、LoadBalancer和ExternalName类型的Service访问方式,以及对应的实现原理和调试方法。文章详细讲解了每种访问方式的工作原理,并提供了针对Service出现故障时的问题定位思路。通过分析Service在宿主机上对应的iptables规则,读者可以轻松解决与Service相关的问题。此外,文章还探讨了Kubernetes中的Service和DNS机制的多租户能力,以及对kube-proxy和kube-dns的定制化实现。总之,本文为读者提供了全面的Kubernetes Service访问方式和调试方法,以及对Kubernetes中Service和DNS机制的深入理解。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入剖析 Kubernetes》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(43)

  • 最新
  • 精选
  • 王天明
    终于算是清楚了,在nodePort模式下,关于端口的有三个参数,port, nodePort, targetPort。 如果如下定义,(请张老师指出是否有理解偏差) spec: type: NodePort ports: - name: http port: 8080 nodePort: 30080 targetPort: 80 protocol: TCP 则svc信息如下,(注意下面无targetPort信息,只是ClustorPort与NodePort,注意后者为Nodeport) ingress-nginx ingress-nginx NodePort 10.105.192.34 <none> 8080:30080/TCP,8443:30443/TCP 28m 则可访问的组合为 1. clusterIP + port: 10.105.192.34:8080 2. 内网IP/公网ip + nodePort: 172.31.14.16:30080。(172.31.14.16我的aws局域网ip.) 30080为nodePort也可以在iptables-save中映证。 还有,就是port参数是必要指定的,nodePort即使是显式指定,也必须是在指定范围内。 (在三板斧中也问过张老师如何使用nodePort打通外网的问题,一并谢谢了)

    作者回复: 对

    2018-11-24
    6
    26
  • Flying
    老师,你好,使用NodePort类型的Service,会创建 -A KUBE-NODEPORTS 类的 iptables规则及 SNAT规则,如果kube-proxy使用的是 ipvs模式,也同样会创建这两个规则吗

    作者回复: 对的

    2019-04-13
    2
    2
  • 王天明
    张老师,我在使用NodePort暴露外网访问一直不成功,无论是公网IP还是局域网IP但不成功,只能使用ClusterIP+NodePort访问。查看events也都正常,只几节课里使用NodePort都有类似的问题。是我理解哪里存在偏差吗?

    作者回复: 你这主机是不是有防火墙?

    2018-11-23
    3
  • 我来也
    课后思考题: 为什么 Kubernetes 要求 externalIPs 必须是至少能够路由到一个 Kubernetes 的节点? 因为k8s只是在集群中的每个节点上创建了一个 externalIPs 与kube-ipvs0网卡的绑定关系. 若流量都无法路由到任意的一个k8s节点,那自然无法将流量转给具体的service. -------------------------------- 最近在这个externalIPs上面踩了一个坑. 在阿里云上提交了工单.第二天,应该是换了第3个售后工程师,才解决的. 给你们分享一下,哈哈! 事情是这样的: 我的k8s集群中有3个节点,假设分别是: A: 192.168.1.1 B: 192.168.1.2 C: 192.168.1.3 症状是: 我在节点B/C上,ssh 192.168.1.1, 最终都是登录到了本机,并未成功登录节点A. 但是节点A登录节点B/C, 节点B和节点C互相登录都正常. 只有节点B和节点C上,登录节点A不成功. 就是因为我的某一个service服务就配置了 externalIPs, 配置的IP就是 192.168.1.1(A) -------------------------------- 那个售后工程师发现在节点B和C上有这么一条记录 $ ip addr inet 192.168.1.1/32 brd 192.168.1.1 scope global kube-ipvs0 那么在节点B和节点C上,访问192.168.1.1的流量,全都转到了kube-ipvs0. 最终这个流量都转到本机了,并未真的发送到远端真实的IP:192.168.1.1 我立马就意识到,我的service绑定了节点的IP.可能是这个导致的. 后来把externalIPs移除掉节点的IP后,该规则就不见了,节点B和节点C也可以正常访问节点A了. -------------------------------- 这个 externalIPs 其实可以填多个,且不要求本机就有对应的IP. 比如你可以填集群中根本就不存在的IP 172.17.0.1, 那么在k8s所有节点上,你都可以通过netstat -ant | grep 172.17.0.1 查看到,有监听该IP的端口.
    2020-04-11
    9
    103
  • swordholder
    对ExternalName的作用没太理解。 访问my-service.default.svc.cluster.local被替换为my.database.example.com,这和我从外部访问到 Kubernetes 里的服务有什么关系? 感觉这更像是从Kubernetes内访问外部资源的方法。
    2018-11-19
    8
    28
  • 虎虎❤️
    思考题 pod的external ip 应该是通过iptables进行配置。可能是一个虚拟ip,在网络中没有对应的设备。所以,必须有路由规则支持。否则客户端可能没办法找到该ip的路径,得到目的网络不可达的回复。
    2018-11-21
    1
    8
  • nodePort下必须要指定Service的port,我用的v1.14,可能检查的更严格了。
    2019-11-06
    5
  • LEON
    在我们通过 kubeadm 部署的集群里,你应该看到 kube-proxy 输出的日志如下所示:—输出日志的命令是什么?
    2018-11-19
    1
    4
  • Geek_5baa01
    我一直再想 LoadBalancer 的问题,如果他是负载到 k8s node 上,那么我应该选择那些 node 做它的负载端点呢?这里被负载的 node 需要额外承担更多的网络流程,这对这些 node 带宽容量评估是个问题,另外还需要考虑 HA 问题,肯定要选择多个 node 作为负载端点,要怎么选择呢?
    2021-07-02
    3
  • Len
    因为 kubernetes 维护着 externalIPs IP + PORT 到具体服务的 endpoints 路由规则。
    2018-11-21
    1
    3
收起评论
显示
设置
留言
43
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部