Gitlab CI/CD 实践四:Golang 项目 CI/CD 流水线配置

2024-07-14 13:34:28 浏览数 (2)

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 的一些自带的一些资源,我要修改它,怎么保证进程安全。
    1. K8 它自己有这个安全性的保证相关的逻辑吗? 乐观锁,通过 resourceVersion
  • K8s 的不同版本之间有什么区别?更新的时候有什么注意事项你有了解过吗? 稳定版、beta、alpha 版本针对弃用 api 的区别
    1. GA API 版本可以被标记为已弃用,但不得在 Kubernetes 的主要版本中删除
    2. Beta API 版本在引入后不超过 9 个月或 3 个次要版本(以较长者为准)将被弃用, 并且在弃用后 9 个月或 3 个次要版本(以较长者为准)不再提供服务
    3. Alpha API 版本可能会在任何版本中被删除,不另行通知

    更新的注意事项

    1. 阅读发布说明,如果有弃用的 api,通常会保留几个版本,然后
    2. 先在测试环境验证
    3. 备份数据
    4. 参考升级说明进行升级
    5. 滚动升级,Kubernetes 允许你逐个升级控制平面的组件和工作节点,这样可以在升级过程中保持集群的可用性。
    6. 验证
  • client-go 在用的时候有什么注意事项你知道吗?
  • k8s 的 request limit,哪一块会对应到 cgroup 里面去?
  • 容器网络方面的排查
  • 容器的网络方面你了解吗?比如说那些。就两个 Pod 之间,他那个网络是怎么通信。
  • indexer 的实现
  • workerqueue的实现
  • informer 这种就是比如说像你自定义的一些 CR,然后你比如说你也想做一些cache,因为这样来说可能够他只会去缓存一些 core source,就是你想做一些 CR 的一些 resource 的一些扩展,这个我们要怎么做?
    1. 我问的是如何去扩展它的 Informer 里面的资源,而不是说你自己cache。
    2. 你自己去缓存,那如果更新了,你怎么去同步?
    3. 在你本地缓存如何去扩展
    4. core resource 会缓存,但是那个 CR 会吗?

容器

  • docker两个容器之间如何通信?

  1. 使用docker 网络
    1. 先创建一个网络(docker network create my-bridge-network)后,其他容器加入该网络。
    2. 创建容器时加入其他容器的网络
    3. 创建两个容器,默认加入bridge网络,通过容器 ip 可通信
  2. 使用 docker compose,会创建一个默认网络,可通过服务名访问
  3. 使用主机网络,A 容器映射端口到主机,B 容器通过访问主机的该端口进行通信
  • 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 下,是通过哪个文件指定的

Post Views: 12

0 人点赞