kubernetes 面试题
1,Docker 和虚拟机有哪些不同。
docker是轻量级得沙盒,在其中运行应用程序,而虚拟机里有额外的操作系统
2,简述 kube-proxy ipvs 和 iptables 的异同?
相同点: 都是通过netfilter内核进行转发。
iptables是为防火墙而设计的: ipvs 则专门用于高性能负载均衡集群, 并使用更高效的数据结构(hash表 并支持索引)
iptables与ipvs比较:
1 ipvs 为大型集群提供了更好的可扩展性和性能
2 ipvs 支持比iptables更复杂的负载均衡算法 (rr wrr lc wlc)
3 ipvs 支持服务监控检测和连接重试等功能
4 ipvs 可以动态修改ipset集合
3,简述蓝绿发布的优势和不足有哪些
优势:
升级切换和回退速度非常快。
不足:
全量切换,需要两倍的集群资源
4,简述 kuberentes 数据持久化的方式有哪些?
1, emptydir:生命周期与Pod一致,临时存储。
2, hostpath:将宿主机已经存在的目录和文件挂载到容器内部,类似与docker的bind mount
3, pv(persistentVolume):nfs gfs ceph 数据持久化存储解决方案。
5,Pod 生命周期
Pod在整个生命周期中被系统定义为各种状态,熟悉Pod的各种状态对理解如何设置Pod的调度策略,重启策略是很有必要的。
Pod 的状态如下:
状态值 | 描述 |
---|---|
Pending | API Server已经创建该Pod,但在Pod内还有一个或多个容器的镜像没有创建,包括正在下载镜像的过程 |
Running | Pod内所有容器均已创建,且至少有一个容器处于运行状态,正在启动状态或正在重启状态 |
Succeded | Pod内所有容器均成功执行后退出,且不会再重启 |
Failed | Pod内所有容器均已退出,但至少有一个容器退出为失败状态 |
Unknown | 由于某种原因无法胡哦去该Pod的状态,可能由于网络通信不畅导致 |
6,容器探针
Probe 是由kubelet 对容器执行的定期诊断。要执行诊断,kubelet 既可以在容器内执行代码,也可以发送一个网络请求。
检查机制
使用探针来检查容器有四种不同的方式。每个探针都必须准确定义为这四种机制中的一种:
exec
在容器内执行指定指令。如果命令退出是返回码为0则任务诊断成功。
grpc
使用gRPC执行一个远程调用。目标应该实现gRPC健康检查。如果响应的状态是"SERVING",则任务诊断成功。gRPC探针是一个alpha特性,只要你启用了“GRPCContainerProbe”特性门控时才能使用。
httpGet
对容器的IP地址上指定端口和路径执行HTTP GET请求。如果响应的状态码大于等于200且小于400,则诊断被认为时成功的。
tcpSocket
对容器的IP地址上的指定端口执行TCP检查。如果端口打开,则诊断被认为时成功的。如果远程系统(容器)在打开连接后立即将其关闭,这算作是健康的。
探测结果
每次探测都将获得以下三种结果之一:
Success(成功):容器通过了诊断
Failure(失败):容器未通过诊断
Unknown(未知):诊断失败,因此不会采取任何行动。
探测类型
针对运行中的容器,kubelet可以选择是否执行以下三种探针,以下如何针对探测结果作出反应:
livenessProbe
指定容器是否正在运行。如果存活态探测失败,则kubelet会杀死容器,并且容器将根据重启策略绝对未来。如果容器不提供存活探针,则默认状态为Success。
readinessProbe
指定容器是否提供服务。如果就绪探测失败,端点控制器将从与Pod匹配的所有服务的端点列表删除改Pod的IP地址。初始延迟之前的就绪态的状态默认为Failure。如果容器不提供就绪态探针,则默认状态为Success。
startupProbe
指定容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被禁用,直到此探针成功为止。如果启动探测失败,kubelet将杀死容器,而容器依其重启策略进行重启。如果容器没有提供启动探测,则默认状态为Success。
7,docker 网络模式
我们在使用docker run 创建Docker容器时,可以使用 --net 选项指定容器的网络模式,Docker可以有以下4种网络模式:
- host模式:使用 --net=host 指定。
和宿主机器共用一个 Network Namespace。容器中的网络环境(ip 地址,路由等)和宿主机器的网络环境一模一样。
- none模式:使用 --net=none 指定。
关闭网络环境
- bridge模式:使用 --net=bridge 指定,默认设置。
容器使用独立的 Network Namespace,并连接到docker虚拟网桥。通过iptables nat表配置和宿主机进行通信。
- container模式:使用 --net=container:NAME_or_ID 指定。
指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP,端口范围等。