K8S 面试题:service 到底能不能 ping 通

Posted 无风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:

  • https://kubernetes.io/zh/docs...
  • https://plantegg.github.io/20...
  • https://cloud.tencent.com/doc...

以上是关于K8S 面试题:service 到底能不能 ping 通的主要内容,如果未能解决你的问题,请参考以下文章

linux12k8s -->16 kubernetes必备面试题

MySQL 到底能不能放到 Docker 里跑

面试腾讯高级开发岗被问:k8s之Service详解-Service使用

k8s集群service外部流量策略如何优雅的处理Pod终止过程中的流量丢失问题?

k8s到底有多难?咱们白话白话1

超详细!K8s 面试题总结