kubernetes常见面试题
1.kubernetes是什么?
kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动化扩缩容、维护等功能。
通过kubernetes你可以快速部署应用、快速扩展应用、无缝对接新的应用功能、节省资源,优化硬件资源的使用。
2.kubernetes特点
可移植:支持公有云、私有云、混合云、多重云(multi-cloud)
可扩展:模块化、插件化、可挂载、可组合
自动化:自动部署、自动重启、自动复制、自动伸缩/扩展
3.为什么要使用容器,容器的优势有哪些?
一、容器技术的优势
1. 资源利用率高
容器技术能够实现多个应用的资源隔离,避免资源浪费和冲突。相比虚拟化技术,容器技术更轻量级,可以在同一台主机上运行多个容器实例,实现更高的资源利用率。
2. 快速部署
容器技术可以实现快速部署应用,容器化的应用可以轻松复制和分发。一旦一个容器经过测试并被认为稳定,可以很方便地在多个环境中部署。
3. 易于迁移
容器化应用可以在不同的环境中移植和迁移。当需要将应用从一台主机迁移到另一台主机时,只需要复制容器镜像和相关配置信息即可。
4. 安全性高
容器技术可以实现隔离和安全性,避免容器之间的冲突,同时也降低了应用程序中可能出现的安全漏洞。
4.kubernetes架构
kubernetes主要有以下几个核心组件组成:
etcd保存了整个集群的状态;
apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
scheduler负责资源的调度,按照预定的调度策略将pod调度到相应的节点上;
kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
除了核心组件,还有一些推荐的Add-ons:
kube-dns负责为整个集群提供DNS服务;
Ingress Controller为服务提供外网入口;
Heapster提供资源监控;
Dashboard提供GUI;
Federation提供跨可用区的集群;
Fluentd-elastersearch提供集群的日志采集、存储与查询
5.kubernetes有哪些组件?
kubectl
kube-apiserver、kube-controller-manager、kube-scheduler、etcd
kubelet、kube-proxy、container_runtime
kube-dns
kubectl是一个客户端管理工具,直接管理API server。它提供一个请求到API server,中间有一个Auth认证,判断是否有权限访问。API Server将信息存储到etcd数据库中,然后Scheduler、API Server、controller manager做各自的事情。
kubectl调用apiserver发生创建Pod的请求,scheduler收到调度任务后发送到符合要求的node节点,node节点上的kubelet和docker daemon通信创建docker容器。
控制平面组件,或者Master节点组件。
Master组件提供集群的管理控制中心。
控制平面的组件对集群做出全局决策(比如调度),以及检测和响应集群事件(例如,当不满足部署的replicas字段时,启动新的Pod)。
kube-apiserver用于暴露kubernetes API。不管是kubectl还是http调用来操作kubernetes集群各种资源,任何的资源请求/调用操作都是通过kube-apiserver提供的接口进行的。
kube-controller-manager负责整个kubernetes的管理工作,保证集群中各中资源的状态处于期望的状态,当监控到集群中某个集群状态不正常时,管理控制器会触发相应的调度操作。这些控制器包括节点控制器、任务控制器、端点控制器、服务账户和令牌控制器。
kube-scheduler负责kubernetes集群的具体调度工作,接收来自于管理控制器触发的调度操作请求,然后根据请求规格、调度约束、整体资源情况等因素进行调度计算,最后将任务发送到目标节点的kubelet组件执行。
etcd是一款用于共享配置和服务发现的高效KV存储系统,具有分布式、强一致性等特点。在kubernetes中主要用于存储所有需要持久化的数据。
etcd是兼具一致性和高可用性的键值数据库,可以作为保存kubernetes所有集群数据的后台数据库。
Node节点组件在每个节点上运行,维护运行的Pod并提供kubernetes运行时环境。
kubelet是Node节点上最重要的核心组件,负责kubernetes集群具体的计算任务,具体功能包括:
监听Scheduler组件的任务分配
挂载Pod所需的Volume
下载Pod所需的Secrets
通过与docker daemon的交互运行docker容器
定期执行容器健康检查
监控、报告Pod状态到kube-controller-manager组件
监控、报告Node状态到kube-controller-manager组件
kube-proxy是集群中每一个节点上运行的网络代理,通过在节点上维护网络规则并执行连接转发来实现kubernetes服务概念的一部分。
kube-proxy主要负责service endpoint到pod实例的请求转发以及负载均衡的规则管理。kube-proxy本身实际上并不负责请求转发和负载均衡,而是从kube-apiserver获得service和pod的状态更新,生成对应的DNAT规则到本地的iptables,最终的转发和负载均衡动作由iptables实施,所以kube-proxy即使出现问题,已经更新到iptables的转发规则依然能够生效。
container_runtime是负责运行容器的软件,kubernetes支持多种容器运行环境:docker、rkt、containerd
插件使用kubernetes资源(Daemonset、Deployment等)实现集群功能。
DNS kube-dns负责集群内的域名解析,解析服务同dnsmasq实现。
flannel是一个可以用于kubernetes的overlay网络提供者
calico是一个L3网络和网络策略驱动
6.什么是静态Pod,如何创建静态Pod,和动态Pod的区别?
静态Pod直接由特定节点上的kubelet进程来管理,不需要apiserver监管。与控制管理平面的Pod(例如Deployment)不同,它由kubelet进程自己来监控。kubelet会自动为每一个静态Pod在kubernetes的apiserver上创建一个镜像Pod,因此我们可以在apiserver查看到该Pod,但是不能通过apiserver进行控制。
创建静态Pod有两种方式:文件系统上的配置文件和HTTP上的配置文件。
静态pod是kubelet直接启动的pod k8s的系统pod就是静态pod
动态pod是apiserver控制下启动的pod
7.kubernetes中Pod的创建过程
1. 用户通过kubectl或者其他API客户端提交创建请求
2.apiserver通过对应的kubeconfig进行认证,认证通过后会将Pod信息存入etcd
3.apiserver开始反映etcd中的状态变化,所有kubernetes组件均使用“watch”机制跟踪检查apiserver上相关的变动
4.controller-manager通过apiserver的watch接口发现了pod信息的更新,执行该资源所依赖的拓扑结构整合,整合后将对应的信息交给apiserver,apiserver写到etcd,此时pod已经可以被调度了
5.scheduler同样通过apiserver的watch接口发现pod可以被调度,通过调度算法给pod分配节点,并将pod和对应节点绑定的信息交给apiserver,apiserver写到etcd,并将pod交给kubectl
6.kubelet收到pod后,调用CNI接口给Pod创建Pod网络,调用CRI接口去启动容器,调用CSI接口进行存储卷的挂载
7.网络、容器、存储创建完成后pod创建完成,等业务进程启动后,pod创建完成
8.简述etcd及其特点
etcd是coreos团队发起的开源项目,是一个管理配置信息和服务发现的项目,它的目标是构建一个高可用的分布式键值数据库,它基于Go语言实现。
特点
简单:支持rest风格的http和json API
安全:支持https方式的访问
快速:支持并发1k/s的写操作
可靠:支持分布式结构,基于Raft的一致性算法,Raft是一套通过选举主节点来实现分布式系统一致性的算法
9.简述etcd适用的场景
服务发现:服务发现主要解决在同一个分布式集群中的进程或服务,要如何才能找到对方并建立连接。本质上来说,服务发现就是想要了解集群中是否有进程在监听udp或tcp端口,并且通过名字就可以查找和连接。
消息发布订阅:在分布式系统中,最适用的一种组件间通信方式就是消息发布与订阅。即构建一个配置共享中心,数据提供者在这个配置共享中心发布消息,而消息使用者则订阅他们关心的主题,一旦主题有消息发布,就会实时通知订阅者。通过这种方式可以做到分布式系统配置的集中式管理与动态更新。应用中要到的一些配置信息放到etcd上进行配置管理。
负载均衡:在分布式系统中,为了保证服务的高可用以及数据的一致性,通过都会把数据和服务部署多份,以此达到对等服务,即使其中的某一个服务失效了,也不影响使用。etcd本身分布式架构存储的信息访问支持负载均衡。etcd集群化以后,每个etcd的核心节点都可以处理用户的请求。所以把数据量小但是访问频繁消息数据直接存储到etcd中也可以实现负载均衡的效果。
分布式通知与协调:与消息发布和订阅类似,都用到了etcd的watcher机制,通过注册与异步通知机制,实现分布式环境下不同系统之间的通知与协调,从而对数据变更做到实时处理。
分布式锁:以为etcd中使用Raft算法保证了数据的强一致性,某次操作存储到集群中的值必然是全局一致的,所以很容易实现分布式锁。锁服务有两种使用方式,一是保持独占,而是控制时序。
集群监控与Leader竞选:通过etcd来进行监控实现起来非常简单并且实时性强。
10.简述什么是kubernetes
kubernetes是一个全新的基于容器技术的分布式支撑平台。是google开源的容器集群管理系统(谷歌内部:Borg)。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提供了大规模容器集群管理的便捷性。并且具有完备的集群管理功能,多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、内建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源调度机制以及多粒度的资源配额管理能力。
11.简述kubernetes和docker的关系
docker提供容器的生命管理和docker镜像构建运行时容器。它的主要优点是将软件/应用程序所需的设置和依赖项打包到一个容器中,从而实现了可移植性等优点。
kubernetes用于关联和编排在多个主机上运行的容器。
12.VLAN和VXLAN,两者有何区别?VXLAN应用场景有哪些?
传统的VLAN(虚拟局域网)技术由于最多只能支持4096个VLAN,已经不能满足云提供商的严格要求,但是VXLAN(虚拟可扩展局域网)技术因为可以通过将第2层扩展到第3层网络来构建大型多租户数据中心而备受青睐,这种技术可以有效克服VLAN带来的扩展局限性。
VLAN 概念:是在交换机实现过程中涉及到的概念,由802.1Q标准所定义。由于交换机是工作在链路层的网络设备,连接在同一台交换机的终端处于同一个三层网中,同时也处于同一个广播域。当交换机接入较多的终端时,任意一台终端发送广播报文时(例如:ARP请求),报文都会传遍整个网络。
VLAN优点:VLAN将同一网络划分为多个逻辑上的虚拟子网,并规定当收到广播报文时,仅仅在其所在VLAN中进行广播从而防止广播报文泛滥。VLAN技术在链路层的层次中实现了广播域的隔离。
Vlan弊端:1、虚拟化技术的发展促使大数据、云计算技术公司采用单个物理设备虚拟多台虚拟机的方式来进行组网,因此对于支持VLAN的数量要求也在提升,加上VLAN技术最多支持4096个VLAN,因此已经无法满足需求。
2、公有云提供商的业务要求将实体网络租借给多个不同的用户,这些用户对于网络的要求有所不同,而不同用户租借的网络有很大的可能会出现IP地址、MAC地址的重叠,传统的VLAN仅仅解决了同一链路层网络广播域隔离的问题,而并没有涉及到网络地址重叠的问题,因此需要一种新的技术来保证在多个租户网络中存在地址重叠的情况下依旧能有效通信的技术。
3、虚拟化技术的出现增加了交换机的负担,对于大型的数据中心而言,单台交换机必须支持数十台以上主机的通信连接才足以满足应用需求,而虚拟化技术使得单台主机可以虚拟化出多台虚拟机同时运行,而每台虚拟机都会有其唯一的MAC地址。这样,为了保证集群中所有虚机可以正常通信,交换机必须保存每台虚机的MAC地址,这样就导致了交换机中的MAC表异常庞大,从而影响交换机的转发性能。
VXLAN概念:IETF定义NVO3标准技术之一,采用MAC-in-UDP报文封装模式,通过将二层报文使用三层协议封装实现二层网络在三层范围内扩展,满足数据中心大二层虚拟机迁移和多租户需求;VXLAN技术可以基于三层网络结构来构建二层虚拟网络,通过VLAN技术可以将处于不同网段网络设备整合在同一个逻辑链路层网络中,对于终端用户而言,这些网络设备似乎“真实地”部署在了同一个链路层网络中。
也就是说,它可以通过将第2层扩展到第3层网络来构建大型的多租户数据中心,同时将虚拟网络与物理基础设施分离,并实现无与伦比的网络可靠性和可扩展性。因此,您可以使用VXLAN技术创建多达1600万个网络。
VXLAN术语介绍:
A、NVE:NetworkVirtualization Edge,网络虚拟边缘,用于建立VxLAN隧道的网络设备;
B、VTEP:VxLANtunnel End Point,VxLAN隧道端点,指建立VxLAN隧道的NVE设备端点IP,可用于静态VxLAN配置及动态VxLAN配置;
C、VNI:VirtualNetwork Identifier,虚拟网络ID,一个VNI即一个VxLAN广播域,实现VxLAN广播域隔离,相当于VLAN中的VLAN ID;
D、BD:BridgeDomain,定义一个VxLAN广播域,可配合配置BDIF,实现跨VxLAN路由,一个BD唯一映射一个VNI;
E、VxLAN报文格式:
VXLAN技术的优势和局限性
相比VLAN技术,VXLAN技术具有以下的优势:
(1) 24位长度的VNI字段值可以支持更多数量的虚拟网络,解决了VLAN数目上限为4094的局限性的问题。
(2) VXLAN技术通过隧道技术在物理的三层网络中虚拟二层网络,处于VXLAN网络的终端无法察觉到VXLAN的通信过程,这样也就使得逻辑网络拓扑和物理网络拓扑实现了一定程度的解耦,网络拓扑的配置对于物理设备的配置的依赖程度有所降低,配置更灵活更方便。
(3)VLAN技术仅仅解决了二层网络广播域分割的问题,而VXLAN技术还具有多租户支持的特性,通过VXLAN分割,各个租户可以独立组网、通信,地址分配方面和多个租户之间地址冲突的问题也得到了解决。
为了保证VXLAN机制通信过程的正确性,rfc7348标准中规定,涉及到VXLAN通信的IP报文一律不允许分片,这就要求物理网络的链路层实现中必须提供足够大的MTU值,保证VXLAN报文的顺利传输,这一点可以理解为当前VXLAN技术的局限性。
VXLAN的应用场景:
VXLAN在云数据中心之间虚拟机迁移中的应用,如某个企业在不同的数据中心有不同业务应用的虚拟机,数据中心之间虚拟机迁移是经常会遇到的,为了保证虚拟机迁移过程中业务不中断,则需要保证迁移虚拟机的IP地址、MAC地址等参数保持不变,这就要求虚拟机迁移前后属于统一个二层网络。如果使用传统方法解决此问题,可能需要购买新的物理设备以分离流量,并可能导致诸如VLAN散乱、网络成环以及系统和管理开销等问题。
VXLAN在SDN环境下的应用,SDN环境下,可以通过SDN控制器来实现VXLAN的IP和VID之间相关信息的对应关系,SDN控制器可以作为ARP代答设备,这样大大提高了VXLAN的灵活性与扩展性。所以VXLAN技术在SDN环境中可以被广泛应用。
---
TCP/IP 分层模型 vxlan 报文 以及通信过程
https://blog.csdn.net/weixin_45806131/article/details/108034628
VXLAN通信原理和应用场景
https://blog.csdn.net/qq_37643334/article/details/122530357
VXLAN 基础教程:VXLAN 协议原理介绍
https://zhuanlan.zhihu.com/p/130277008
13.算法
1):找两个链表的公共节点。
分析
首先要理解什么是公共节点,并不是两个节点的值相同就是公共节点。
而是在第一链表和第二链表中都存在一个节点,该节点往后的子链表在两个链表中是相同的。
如下图中链表6 - 7就是两个链表的公共链表,而节点6就是第一个公共节点。
方法一
最直观就是暴力法,在第一链表上顺序遍历每个节点,每遍历到一个节点,就在第二个链表上顺序遍历每个节点。如果在第二个链表上有一个节点和第一个链表上的节点一样,则说明两个链表在这个节点上重合,但是这种方法的复杂度为O(m * n)(第一个链表长度为m,第二个链表的长度为n)
方法二
如果两个链表存在公共节点,那么公共节点出现在两个链表的尾部。如果我们从两个链表的尾部开始往前比较,那么最后一个相同的节点就是我们要找的节点。但是这两个链表是单向的,要实现尾节点最先比较,我们可以借助两个辅助栈。分别将两个链表的节点放入两个栈中,这样栈顶就是两个链表的尾节点,比较两个栈顶节点是否相同,如果相同,将栈顶弹出比较下一个栈顶,直到找到最后一个相同的栈顶。时间复杂度O(m + n)。
方法三
先获得两个链表的长度,然后在较长的链表上先走若干步(两链表长度之差),接着同时在两个链表上遍历,找到的第一个相同的节点就是他们的第一个公共节点。时间复杂度O(m + n)。
2):如何判断环形链表。
题目描述:给定一个链表,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。
如果链表中存在环,则返回 true 。 否则,返回 false 。
你能用 O(1)(即,常量)内存解决此问题吗?
分析: 对于这个问题,如果没有内存空间的限制,首先想到的就是使用哈希的方法,用一个哈希存储节点,然后向下枚举链表节点:
如果发现其中有在哈希中,那么就说明有环返回true。 如果枚举到最后结束,那就说明没有环。
但是这样并不满足O(1)空间复杂度的要求,我们应该怎么处理呢?
如果链表尾部有环,如果一个节点枚举到后面会在闭环中不断循环枚举,那么怎么样能高效判断有环并且能快速终止呢?
有环,其实就是第二次、第三次走过这条路才能说它有环,一个指针在不借助太多空间存储状态下无法有效判断是否有环(有可能链表很长、有可能已经在循环了),可以借助快慢指针(双指针) 。
其核心思想就是利用两个指针:快指针(fast)和慢指针(slow),它们两个同时从链表头遍历链表,只不过两者速度不同,如果存在环那么最终会在循环链表中相遇。
我们在具体实现的时候,可以快指针(fast)每次走两步,慢指针(slow)每次走一步。如果存在环的话快指针先进入环,慢指针后入环,在慢指针到达末尾前快指针会追上慢指针。
快慢指针如果有相遇那就说明有环,如果快指针先为null那就说明没环。
提高:如何找到环的入口位置?
14.TCP连接优化,一个是快速回收,一个是复用tcp长连接。
对处于time-wait状态的socket进行快速回收。
time-wait调优:减少time-wait
还可以使用长连接的方式,减少time-wait。
15.面试官:如果让你设计一个指标监控和告警系统,你会怎么做?
小明:好的,这个系统是为公司内部使用的,还是设计像 Datadog 这种 SaaS 服务?
面试官:很好的问题,目前这个系统只是公司内部使用。
小明:我们想收集哪些指标信息?
面试官:包括操作系统的指标信息,中间件的指标,以及运行的应用服务的 qps 这些指标。
小明:我们用这个系统监控的基础设施的规模是多大的?
面试官:1亿日活跃用户,1000个服务器池,每个池 100 台机器。
小明:指标数据要保存多长时间呢?
面试官:我们想保留一年。
小明:好吧,为了较长时间的存储,可以降低指标数据的分辨率吗?
面试官:很好的问题,对于最新的数据,会保存 7 天,7天之后可以降低到1分钟的分辨率,而到 30 天之后,可以按照 1 小时的分辨率做进一步的汇总。
小明:支持的告警渠道有哪些?
面试官:邮件,电钉钉,企业微信,Http Endpoint。
小明:我们需要收集日志吗?还有是否需要支持分布式系统的链路追踪?
面试官:目前专注于指标,其他的暂时不考虑。
小明:好的,大概都了解了。
总结一下,被监控的基础设施是大规模的,以及需要支持各种维度的指标。另外,整体的系统也有较高的要求,要考虑到可扩展性,低延迟,可靠性和灵活性。
【系统设计】指标监控和告警系统 - SpringLeee - 博客园
16.如何识别tcp和udp报文。答:报文里有标签,tcp是6,udp是17。
17.[逻辑]-- 25匹马赛跑问题
25匹马通过赛跑来决出前三名,每轮最多5匹马参赛,求最少需要几轮?
条件:
1、最多5匹马一组,可以决出本组比赛的次序。
2、没有计时工具,假设马每轮的速度相同。
=====================================================================
每次都排除不能争夺前三名的马是关键
7轮就可以了
1。小组比赛
5个一组进行比赛,25匹马需要5轮。纪录5轮比赛的各组比赛结果(每小组内的排名顺序)
2。冠军赛
选择每组比赛的第一名进行比赛,纪录比赛结果,最快的马就是25匹马中的No.1
3。亚季军赛(这个比较难理解)
选择冠军马所在的小组里的2,3名
冠军赛里第2名马所在小组的1,2名
冠军赛里第3名马所在小组的第1名共5匹马进行比赛
第1名就是亚军,第2名是季军