Kubernetes面试系列-05

2022年7月17日
大约 10 分钟

Kubernetes面试系列-05

1. Kubernetes Secret 有哪些使用方式?

创建完secret之后,可通过如下三种方式使用:

  • 在创建Pod时,通过为Pod指定Service Account来自动使用该Secret。

  • 通过挂载该Secret到Pod来使用它。

  • 在Docker镜像下载时使用,通过指定Pod的spc.ImagePullSecrets来引用它。

2. 描述一下 Kubernetes PodSecurityPolicy 机制?

Kubernetes PodSecurityPolicy是为了更精细地控制Pod对资源的使用方式以及提升安全策略。在开启PodSecurityPolicy准入控制器后,Kubernetes默认不允许创建任何Pod,需要创建PodSecurityPolicy策略和相应的RBAC授权策略(Authorizing Policies),Pod才能创建成功。

3. Kubernetes PodSecurityPolicy 机制能实现哪些安全策略?

在PodSecurityPolicy对象中可以设置不同字段来控制Pod运行时的各种安全策略,常见的有:

  • 特权模式:privileged是否允许Pod以特权模式运行。

  • 宿主机资源:控制Pod对宿主机资源的控制,如hostPID:是否允许Pod共享宿主机的进程空间。

  • 用户和组:设置运行容器的用户ID(范围)或组(范围)。

  • 提升权限:AllowPrivilegeEscalation:设置容器内的子进程是否可以提升权限,通常在设置非root用户(MustRunAsNonRoot)时进行设置。

  • SELinux:进行SELinux的相关配置。

4. 简述 Kubernetes 网络模型?

Kubernetes网络模型中每个Pod都拥有一个独立的IP地址,并假定所有Pod都在一个可以直接连通的、扁平的网络空间中。所以不管它们是否运行在同一个Node(宿主机)中,都要求它们可以直接通过对方的IP进行访问。设计这个原则的原因是,用户不需要额外考虑如何建立Pod之间的连接,也不需要考虑如何将容器端口映射到主机端口等问题。

同时为每个Pod都设置一个IP地址的模型使得同一个Pod内的不同容器会共享同一个网络命名空间,也就是同一个Linux网络协议栈。这就意味着同一个Pod内的容器可以通过localhost来连接对方的端口。

在Kubernetes的集群里,IP是以Pod为单位进行分配的。一个Pod内部的所有容器共享一个网络堆栈(相当于一个网络命名空间,它们的IP地址、网络设备、配置等都是共享的)。

5. Kubernetes Calico 网络组件实现原理?

Calico是一个基于BGP的纯三层的网络方案,与OpenStack、Kubernetes、AWS、GCE等云平台都能够良好地集成。

Calico在每个计算节点都利用Linux Kernel实现了一个高效的vRouter来负责数据转发。每个vRouter都通过BGP协议把在本节点上运行的容器的路由信息向整个Calico网络广播,并自动设置到达其他节点的路由转发规则。

Calico保证所有容器之间的数据流量都是通过IP路由的方式完成互联互通的。Calico节点组网时可以直接利用数据中心的网络结构(L2或者L3),不需要额外的NAT、隧道或者Overlay Network,没有额外的封包解包,能够节约CPU运算,提高网络效率。

6. 简述 Kubernetes 网络策略?

为实现细粒度的容器间网络访问隔离策略,Kubernetes引入Network Policy。

Network Policy的主要功能是对Pod间的网络通信进行限制和准入控制,设置允许访问或禁止访问的客户端Pod列表。Network Policy定义网络策略,配合策略控制器(Policy Controller)进行策略的实现。

7. 什么是容器编排?

容器编排是与运行容器相关的组件和流程的自动化。 它包括诸如配置和调度容器、容器的可用性、容器之间的资源分配以及保护容器之间的交互等内容。

8. Kubernetes 中 flannel 有什么作用?

Flannel可以用于Kubernetes底层网络的实现,主要作用包括:

  • Flannel能协助Kubernetes,给每一个Node上的Docker容器都分配互相不冲突的IP地址。

  • Flannel能在这些IP地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络,将数据包原封不动地传递到目标容器内。

9. 简述 Kubernetes CNI 模型?

CNI提供了一种应用容器的插件化网络解决方案,定义对容器网络进行操作和配置的规范,通过插件的形式对CNI接口进行实现。CNI仅关注在创建容器时分配网络资源,和在销毁容器时删除网络资源。在CNI模型中只涉及两个概念:容器和网络。

  • 容器(Container):是拥有独立Linux网络命名空间的环境,例如使用Docker或rkt创建的容器。容器需要拥有自己的Linux网络命名空间,这是加入网络的必要条件。

  • 网络(Network):表示可以互连的一组实体,这些实体拥有各自独立、唯一的IP地址,可以是容器、物理机或者其他网络设备(比如路由器)等。

对容器网络的设置和操作都通过插件(Plugin)进行具体实现,CNI插件包括两种类型:CNI Plugin和IPAM(IP Address Management)Plugin。CNI Plugin负责为容器配置网络资源,IPAM Plugin负责对容器的IP地址进行分配和管理。IPAM Plugin作为CNI Plugin的一部分,与CNI Plugin协同工作。

10. Kubernetes 共享存储有什么作用?

Kubernetes对于有状态的容器应用或者对数据需要持久化的应用,因此需要更加可靠的存储来保存应用产生的重要数据,以便容器应用在重建之后仍然可以使用之前的数据。因此需要使用共享存储。

11. Kubernetes 中 PV 和 PVC 是什么?

PV是对底层网络共享存储的抽象,将共享存储定义为一种“资源”。

PVC是用户对存储资源的一个“申请”。

12. Kubernetes PV 生命周期内包括哪些阶段?

某个PV在生命周期中可能处于以下4个阶段(Phaes)之一。

  • Available:可用状态,还未与某个PVC绑定。

  • Bound:已与某个PVC绑定。

  • Released:绑定的PVC已经删除,资源已释放,但没有被集群回收。

  • Failed:自动资源回收失败。

13. Kubernetes所支持的存储供应模式有哪些?

Kubernetes支持两种资源的存储供应模式:静态模式(Static)和动态模式(Dynamic)。

  • 静态模式:集群管理员手工创建许多PV,在定义PV时需要将后端存储的特性进行设置。

  • 动态模式:集群管理员无须手工创建PV,而是通过StorageClass的设置对后端存储进行描述,标记为某种类型。此时要求PVC对存储的类型进行声明,系统将自动完成PV的创建及与PVC的绑定。

14. Kubernetes CSI 模型是什么?

Kubernetes CSI是Kubernetes推出与容器对接的存储接口标准,存储提供方只需要基于标准接口进行存储插件的实现,就能使用Kubernetes的原生存储机制为容器提供存储服务。CSI使得存储提供方的代码能和Kubernetes代码彻底解耦,部署也与Kubernetes核心组件分离,显然,存储插件的开发由提供方自行维护,就能为Kubernetes用户提供更多的存储功能,也更加安全可靠。

CSI包括CSI Controller和CSI Node:

1、CSI Controller的主要功能是提供存储服务视角对存储资源和存储卷进行管理和操作。

2、CSI Node的主要功能是对主机(Node)上的Volume进行管理和操作。

15. 描述 Kubernetes Worker 节点加入集群的过程?

通常需要对Worker节点进行扩容,从而将应用系统进行水平扩展。主要过程如下:

  • 在该Node上安装Docker、kubelet和kube-proxy服务;

  • 然后配置kubelet和kubeproxy的启动参数,将Master URL指定为当前Kubernetes集群Master的地址,最后启动这些服务;

  • 通过kubelet默认的自动注册机制,新的Worker将会自动加入现有的Kubernetes集群中;

  • Kubernetes Master在接受了新Worker的注册之后,会自动将其纳入当前集群的调度范围。

16. Kubernetes Pod 的 LivenessProbe 探针有哪些常见方式?

kubelet定期执行LivenessProbe探针来诊断容器的健康状态,通常有以下三种方式:

  • ExecAction:在容器内执行一个命令,若返回码为0,则表明容器健康。

  • TCPSocketAction:通过容器的IP地址和端口号执行TCP检查,若能建立TCP连接,则表明容器健康。

  • HTTPGetAction:通过容器的IP地址、端口号及路径调用HTTP Get方法,若响应的状态码大于等于200且小于400,则表明容器健康。

17. Kubernetes 外部如何访问集群内的服务?

对于Kubernetes,集群外的客户端默认情况,无法通过Pod的IP地址或者Service的虚拟IP地址:虚拟端口号进行访问。通常可以通过以下方式进行访问Kubernetes集群内的服务:

  • 映射Pod到物理机:将Pod端口号映射到宿主机,即在Pod中采用hostPort方式,以使客户端应用能够通过物理机访问容器应用。

  • 映射Service到物理机:将Service端口号映射到宿主机,即在Service中采用nodePort方式,以使客户端应用能够通过物理机访问容器应用。

  • 映射Sercie到LoadBalancer:通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。这种用法仅用于在公有云服务提供商的云平台上设置Service的场景。

18. Kubernetes 如何实现自动扩容机制?

Kubernetes使用Horizontal Pod Autoscaler(HPA)的控制器实现基于CPU使用率进行自动Pod扩缩容的功能。HPA控制器周期性地监测目标Pod的资源性能指标,并与HPA资源对象中的扩缩容条件进行对比,在满足条件时对Pod副本数量进行调整。

Kubernetes中的某个Metrics Server(Heapster或自定义Metrics Server)持续采集所有Pod副本的指标数据。HPA控制器通过Metrics Server的API(Heapster的API或聚合API)获取这些数据,基于用户定义的扩缩容规则进行计算,得到目标Pod副本数量。

当目标Pod副本数量与当前副本数量不同时,HPA控制器就向Pod的副本控制器(Deployment、RC或ReplicaSet)发起scale操作,调整Pod的副本数量,完成扩缩容操作。

19. Kubernetes 中如何使用 EFK 实现日志的统一管理?

在Kubernetes集群环境中,通常一个完整的应用或服务涉及组件过多,建议对日志系统进行集中化管理,通常采用EFK实现。

EFK是 Elasticsearch、Fluentd 和 Kibana 的组合,其各组件功能如下:

  • Elasticsearch:是一个搜索引擎,负责存储日志并提供查询接口;

  • Fluentd:负责从 Kubernetes 搜集日志,每个Node节点上面的Fluentd监控并收集该节点上面的系统日志,并将处理过后的日志信息发送给Elasticsearch;

  • Kibana:提供了一个 Web GUI,用户可以浏览和搜索存储在 Elasticsearch 中的日志。

通过在每台Node上部署一个以DaemonSet方式运行的Fluentd来收集每台Node上的日志。Fluentd将Docker日志目录/var/lib/docker/containers和/var/log目录挂载到Pod中,然后Pod会在Node节点的/var/log/pods目录中创建新的目录,可以区别不同的容器日志输出,该目录下有一个日志文件链接到/var/lib/docker/contianers目录下的容器日志输出。

20. Kubernetes 如何进行优雅的节点关机维护?

由于Kubernetes节点运行大量Pod,因此在进行关机维护之前,建议先使用kubectl drain将该节点的Pod进行驱逐,然后进行关机维护。