k8s进阶面试
docker与k8s的区别,分别适用于什么场景?
docker只负责生成容器,没有其他功能,但部署简单,方便测试等,k8s附带的有各种功能:探针、污点、资源限制、高可用等,如果生产中的服务达到一定规模且需保证全链路监控及高可用,k8s是最佳选择
docker的底层实现原理?如何运行一个容器?
六种命名空间的共享与限制,镜像的写时复制原则,资源限制(参考:https://www.cnblogs.com/lijin543/p/15635844.html)
容器负载相较虚机要低,如何实现?
镜像体积较小,只安装需要的依赖;Cgroup资源限制
k8s都有哪些核心组件?ETCD能不能换成redis?
在微服务架构中,etcd用于服务的注册和发现,利用了其租约特性,而Redis是通用的分布式内存缓存系统,通常用于通过缓存内存中的数据和对象来加速动态数据库驱动的网站
虽然Redis和etcd都是键值存储,但是它们有不同的设计目标和适用场景。以下是一些原因,说明为什么Redis不能替代etcd:
一致性:etcd是一个强一致性的分布式键值存储,它提供了一种可靠的方式来存储需要被分布式系统或机器集群访问的数据,而Redis是一个分布式缓存系统,它的一致性模型是最终一致性,不能保证数据的强一致性
高可用性:etcd被设计为高可用性,即使其中一些节点失败,它也可以继续运行。而Redis的高可用性需要通过主从复制和哨兵机制来实现,这些机制需要额外的配置和管理
数据类型:etcd只用于存储Kubernetes对象,而Redis和其他键值存储有数据类型的灵活性,可以存储各种类型的数据
查询和索引:etcd只保证了高可用性,但并没有给你提供快速查询和索引。所有的nosql键值存储都是以快速查询和搜索为目标建立的
api-server为什么不能直接生成控制器,而是由控制器管理器发出生成控制器指令?
职责不同,api-server负责与各个组件交互,提供准入控制功能(证书通过后才能访问localhost:6443/8080),集成安全机制(RBAC),而关于资源状态这一块它负责将期望的资源状态以键值对数据形式持久存储在ETCD中,一旦发生变化,控制器在api-server提供的当前状态基础上做出相应调整,以达到期望状态
kubectl apply -f deployment的yaml文件背后都做了什么?
用户提交创建Pod的请求,可以通过API Server的REST API ,也可用Kubectl命令行工具,支持Json和Yaml两种格式;
API Server 处理用户请求,存储Pod数据到Etcd;
Scheduler通过和 API Server的watch机制,查看到新的pod,尝试为Pod绑定Node;
过滤主机:调度器用一组规则过滤掉不符合要求的主机,比如Pod指定了所需要的资源,那么就要过滤掉资源不够的主机;
主机打分:对第一步筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把一个Replication Controller的副本分布到不同的主机上,使用最低负载的主机等;
选择主机:选择打分最高的主机,进行binding操作,结果存储到Etcd中;
kubelet根据调度结果执行Pod创建操作: 绑定成功后,会启动container, docker run, scheduler会调用API Server的API在etcd中创建一个bound pod对象,描述在一个工作节点上绑定运行的所有pod信息。运行在每个工作节点上的kubelet也会定期与etcd同步bound pod信息,一旦发现应该在该工作节点上运行的bound pod对象没有更新,则调用Docker API创建并启动pod内的容器。
简单谈下calico网络,calico中同节点间pod通信、跨节点通信都是怎么实现的?
calico有3种模式,bgp、ip-in-ip、vxlan模式
bgp可以纯路由的方式实现pod通信,但无法打通跨网段路由,需要借助覆盖网络,即ip-in-ip、vxlan模式,前者开销较小,可优先考虑用该方式实现跨网段间pod通信,如果是flannel网络的vxlan模式向calico迁移,可以使用vxlan模式
在bgp模式中,
同节点pod间通信过程:各pod与169.254.1.1这个逻辑设备形成veth pair,pod将请求数据包转给169.254.1.1后,由于该设备位于内核网络空间并开启了代理转发功能,他会查询当前路由表也就是宿主机路由表,按照相关路由规则转给相应pod
跨界点通信过程:直接通过bgp路由协议转给另一节点的pod
在这个过程中,路由规则由felix容器统计pod IP地址和路由规则并生成路由规则,这些信息只能同步给相邻节点,rr(route reflecctor)容器负责将相关信息同步给其他自治域,这样路由规则实现这个集群的同步,其上两个容器位于calico-node-哈希字符串这个pod中,该pod以daemon-set方式运行在每个节点