K8s
-
如何通过 kubeproxy 保证两个 Pod 之间的相互通信?
kubeproxy 会监听 pod 的变化,在 node 上配置 iptables规则,将访问的 service ip,做 DNAT,转到 service 负载均衡的endpoint ip。但是 iptables 查找负载均衡的 endpoint 是 O(n)复杂度,当集群 pod 数量庞大时,性能低下。而 ipvs 实现方案,可以实现 O(1)复杂度查找,性能更好。
iptables 实现方案还有个缺点,无法额外配置自定义的 nat 规则。因为在nat表里面对数据包进行dnat操作过后,数据包就不在执行nat表里面的其它规则
-
K8S环境之下,从 service 进来的一个流量,它经过很多层,例如kubeproxy,iptable规则,然后完了之后它又要 net 到容器里面去。那有些容器可能还是 overlay 的。K8S 内的网络问题的话有什么手段?
-
比如说他有些在 overlay 的网络,比如说 vxlan ,或者是 GRE 或者 IPIP 类似于这种,那你 TCPdump 的时候你是不知道。因为你的 pod 的 IP 是包在里面的。
-
有哪些工作负载的资源?
-
无状态工作负载
- Deployment、ReplicaSet
-
有状态工作负载
- StatefulSet
-
守护进程工作负载,保证每个节点上运行着这样一个守护进程
- DaemonSet
-
批处理工作负载,适用于一次性的任务
- Job、CronJob
-
-
K8S 的这个权限体系
-
有基于 K8S 的那个 Ingress 来做路由吗?
-
operator 的原理
-
你是订阅了事件以后,然后自己又塞到队列里面吗?还是用K8s那个informer 他自己带的那个队列?
-
那你有没有考虑过操作失败的一个兜底方案。
-
K8s 的一些自带的一些资源,我要修改它,怎么保证进程安全。
-
K8 它自己有这个安全性的保证相关的逻辑吗?
乐观锁,通过 resourceVersion
-
-
K8s 的不同版本之间有什么区别?更新的时候有什么注意事项你有了解过吗?
稳定版、beta、alpha 版本针对弃用 api 的区别
-
GA API 版本可以被标记为已弃用,但不得在 Kubernetes 的主要版本中删除
-
Beta API 版本在引入后不超过 9 个月或 3 个次要版本(以较长者为准)将被弃用, 并且在弃用后 9 个月或 3 个次要版本(以较长者为准)不再提供服务
-
Alpha API 版本可能会在任何版本中被删除,不另行通知
更新的注意事项
- 阅读发布说明,如果有弃用的 api,通常会保留几个版本,然后
- 先在测试环境验证
- 备份数据
- 参考升级说明进行升级
- 滚动升级,Kubernetes 允许你逐个升级控制平面的组件和工作节点,这样可以在升级过程中保持集群的可用性。
- 验证
-
-
client-go 在用的时候有什么注意事项你知道吗?
-
k8s 的 request limit,哪一块会对应到 cgroup 里面去?
-
容器网络方面的排查
-
容器的网络方面你了解吗?比如说那些。就两个 Pod 之间,他那个网络是怎么通信。
-
indexer 的实现
-
workerqueue的实现
-
informer 这种就是比如说像你自定义的一些 CR,然后你比如说你也想做一些cache,因为这样来说可能够他只会去缓存一些 core source,就是你想做一些 CR 的一些 resource 的一些扩展,这个我们要怎么做?
- 我问的是如何去扩展它的 Informer 里面的资源,而不是说你自己cache。
- 你自己去缓存,那如果更新了,你怎么去同步?
- 在你本地缓存如何去扩展
- core resource 会缓存,但是那个 CR 会吗?
容器
-
docker两个容器之间如何通信?
- 使用docker 网络
- 先创建一个网络(docker network create my-bridge-network)后,其他容器加入该网络。
- 创建容器时加入其他容器的网络
- 创建两个容器,默认加入bridge网络,通过容器 ip 可通信
- 使用 docker compose,会创建一个默认网络,可通过服务名访问
- 使用主机网络,A 容器映射端口到主机,B 容器通过访问主机的该端口进行通信
- 使用docker 网络
-
host 网络模式是通过什么样的技术手段实现?
使用宿主机的 network namespace,包括网络设备、路由表、防火墙规则、协议栈,可通过 lo 网络设备和宿主机通信。
-
网络的 namespace 里面大概有哪些是隔离呢?比如说协议站隔离,然后路由表,然后 ARP 或者是那个 ARP 的nearby,那个 nearby 系统这些地方它都隔离吗?还有包括Netfilter、 IP tables 这些。
协议栈、路由表、网络设备、防火墙规则、网络状态
-
那比如说容器内和容器外,它是使用什么样的一个方式来做联通?
虚拟网卡对
-
如果比如说我不使用 iptables 的话,那么这个容器里面的 IP 能够直接通我宿主机的 IP 吗?我宿主机 IP 肯定是挂在宿主机的网卡,不管是物理的还是虚拟的其他网卡。嗯,这个场景它是直接通吗?如果不去设置任何 iptables 的话。
可以。通过虚拟网卡对-》docker 网桥-》ip 路由表-》宿主机网卡
-
如比如说我不借助任何 NAT,那么仅靠 IP forward,我把 IP forward 设置成一,那么他去容器内去ping我宿主机一个网卡上的一个IP,这个能 ping 通吗?
-
我容器是确实看不到,但是你不是已经在 bridge 上了吗?已经到bridge,比如说做的有能力,比如说 IP 经过 IP forward 能够通一个物理网卡上的i,一个 IP 同一个宿主机情况下。
可以。通过虚拟网卡对-》docker 网桥-》ip 路由表-》宿主机网卡
-
如果能 ping 本机的物理网卡通的话,那么ping那个跨物理机,比如跨节点之间的,那么它能通吗?
不可以。宿主机网卡出去时,需要做 iptables SNAT,否则回不来。
-
不需要改原 IP 或者什么的吗?
-
IPtables 它的四表 5 链
-
你们现在那个容器的版本和内核版本是多少?那个 Linux 的内核版本
-
你在用 cgroups 去限制内存或者限制 CPU 的时候有遇到一些问题吗?
-
有时候去排查,比如说要进到容器的 namespace 里面去,有时候可能会用一些,比如说像 nsenter 或者一些其他的系统调用。那比如说像 nsenter 这种类似它的原理是什么呢?
-
比如说我们容器里面发出了一些威胁的流量,那从系统的角度来说,我怎么去关联这个流量和我的PID?然后我 pid 又怎么关联上容器呢?那关联到我的 Pod 呢?
-
namespace、cgroup 这方面你有哪些了解?
-
内存 limit 在 memory cgroup 下,是通过哪个文件指定的