K8S 面试题:service 到底能不能 ping 通
面试中被问了这道题,其实是在考察你对 k8s service 的使用和底层原理的理解,答案显然没有那么简单。
实验环境搭建
使用 kind (k8s.io) 可以很方便的在本地搭建实验环境,修改配置即可创建 kubeProxyMode 为 iptables 或 ipvs。
实验涉及的 config 和 yaml 可以在我的 github repo 找到: win5do/k8s-svc-test (github.com)
网络调试工具可以通过创建 netshoot 容器 attach 到目标 network namespace:nicolaka/netshoot: a Docker + Kubernetes network trouble-shooting swiss-army container (github.com)
ClusterIP/NodePort
这类 svc 都会分配 ClusterIP,这个 IP 地址是 VIP(虚拟 IP),是在所有 node 上添加一些 netfilter 规则,主要有 iptables 和 ipvs 两种方案,能不能 ping 通要看具体实现。
- iptables:clusterIP 只是 iptables 中的规则,只会处理 ip:port 四层数据包,reject 了 icmp。不能 ping 通。
- IPVS:clusterIP 会绑定到虚拟网卡 kube-ipvs0,配置了 route 路由到回环网卡,icmp 包是 lo 网卡回复的。可以 ping 通。
Headless: ClusterIP=None
Headless svc 不会分配 clusterIP,而是返回对应 DNS 的 A 记录,如果 svc 后端有3个 pod 则返回 3 个 pod IP。访问 svc 时会随机选择一个 IP,所以 headless svc 是可以 ping 通的。
Loadbalancer
Loadbalancer 类型 svc 也要看云厂商的具体实现。
- 普通模式:基于 NodePort,LB -> node:nodePort -> pod。ping 的结果跟 NodePort 一致。
- 直连模式:LB 和 pod 处于同一个 VPC 子网,LB -> pod。ping 的结果跟 Headless 一致。
ExternalName
ExternalName 对应 DNS 的 CNAME,如果配置的域名可以 ping 通则 svc 可以 ping 通。
Reference:
无风的内存空间
[ k8s-operator 系列 ] 自动生成 webhook 证书并在过期时自动刷新
无风赞 1阅读 3.9k
Kubernetes v1.26 新特性一览
张晋涛赞 2阅读 648评论 1
深入剖析容器网络和 iptables
张晋涛赞 3阅读 1.3k
使用kubeasz部署高可用kubernetes集群
李朝阳赞 2阅读 456
Kubernetes 证书管理系列(一)
张晋涛赞 2阅读 841
CodeGalaxy 推出轻量集群,可在云主机上一键搭建 K8s
韩天峰赞 2阅读 434
vivo 云原生容器探索和落地实践
vivo互联网技术赞 2阅读 677
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。