美文网首页DevOps/SRE
【DevOps工程师】【Kubernetes】面试题

【DevOps工程师】【Kubernetes】面试题

作者: 炼狱腾蛇Eric | 来源:发表于2019-09-30 13:38 被阅读0次

    容器化和Docker相关的问题

    选择题

    • Docker命令的参数中,哪个是指定容器环境变量的参数?
      A:-t
      *B:-e
      C:-i
      D:-v
    • Docker下列哪个不是Docker技术实现的基础
      A:UnionFS
      B:Cgroup
      C:Namespace
      *D:etcd

    问答题

    • 简单说一下你对docker的理解/优点
      (这是一道开放性题目,可以一次性挖出面试者对于docker的理解,然后针对他所了解的部分进行深挖,然后针对没有涉及的问题进行横向扩展)

    Docker是一个开源的应用容器引擎,是容器虚拟化的一种实现方式,他是基于库的虚拟化,让开发/运维人员把程序所需要的依赖全部打包在一个镜像中,具有一次打包,到处运行的特点,体积小且启动快

    • Dockerfile中的RUN, CMD和ENTRYPOINT的区别

    RUN命令执行命令并创建新的镜像层,通常用于安装软件包
    CMD命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换
    ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行 docker run时指定了其他命令)

    • 简述Docker技术三大要点:cgroup, namespace和unionFS实现方式

    -- cgroup:Linux CGroupCgroup 可​​​让​​​您​​​为​​​系​​​统​​​中​​​所​​​运​​​行​​​任​​​务​​​(进​​​程​​​)的​​​用​​​户​​​定​​​义​​​组​​​群​​​分​​​配​​​资​​​源​​​ — 比​​​如​​​ CPU 时​​​间​​​、​​​系​​​统​​​内​​​存​​​、​​​网​​​络​​​带​​​宽​​​或​​​者​​​这​​​些​​​资​​​源​​​的​​​组​​​合​​​。​​​您​​​可​​​以​​​监​​​控​​​您​​​配​​​置​​​的​​​ cgroup,拒​​​绝​​​ cgroup 访​​​问​​​某​​​些​​​资​​​源​​​,甚​​​至​​​在​​​运​​​行​​​的​​​系​​​统​​​中​​​动​​​态​​​配​​​置​​​您​​​的​​​ cgroup
    -- namespace:
    PID NameSpace:Linux 2.6.24 ,PID隔离
    Network NameSpace:Linux 2.6.29,网络设备、网络栈、端口等网络资源隔离
    User NameSpace:Linux 3.8,用户和用户组资源隔离
    IPC NameSpace:Linux 2.6.19,信号量、消息队列和共享内存的隔离
    UTS NameSpace:Linux 2.6.19,主机名和域名的隔离;
    Mount NameSpace:Linux 2.4.19,挂载点(文件系统)隔离;
    -- AUFS:
    UnionFS:把不同的物理位置的目录合并到同一个目录中。
    Device mapper/OverlayFS:由于Redhat并不原生支持AUFS,但是为了适应Docker技术,在RHEL6中引进的文件系统,也可以使用OverlayFS,但是需要额外的配置

    • 在主机和容器上部署应用程序有什么区别?


      image.png

    请参考上图。左侧架构表示在主机上部署应用程序。因此,这种架构将具有操作系统,然后操作系统将具有内核,该内核将在应用程序所需的操作系统上安装各种库。因此,在这种框架中,您可以拥有n个应用程序,并且所有应用程序将共享该操作系统中存在的库,而在容器中部署应用程序时,体系结构则略有不同。

    这种架构将有一个内核,这是唯一一个在所有应用程序之间唯一共同的东西。因此,如果有一个需要Java的特定应用程序,那么我们将获得访问Java的特定应用程序,如果有另一个需要Python的应用程序,则只有该特定应用程序才能访问Python。

    您可以在图表右侧看到的各个块基本上是容器化的,并且这些块与其他应用程序隔离。因此,应用程序具有与系统其余部分隔离的必要库和二进制文件,并且不能被任何其他应用程序侵占。

    Kubernetes基本面试问题

    选择题

    • Kubernetes集群数据存储在以下哪个位置?
      A. kube-apiserver
      B. Kubelet
      *C. etcd
      D. promethues
    • 哪个是Kubernetes的Pod控制器?
      *A. ReplicaSet
      *B. Deployment
      C. kube-controller-manager
      D. Service
    • 以下哪个是核心Kubernetes对象?
      *A. Pods
      *B. Services
      *C. Volumes
      D. ReplicaSet
    • Kubernetes Network代理在哪个节点上运行?
      A. Master Node
      B. Worker Node
      *C. 所有节点
      D. 以上都不是
    • Controller-Manager的职责是什么?
      *A. 将CIDR块分配给节点
      *B. 维护节点列表
      *C. 监视节点的运行状况
      D. 监控文件大小
    • Replication Controller的职责是什么?
      *A. 使用单个命令更新或删除多个pod
      *B. 有助于达到理想状态
      *C. 如果现有Pod崩溃,则创建新Pod
      D. 维护节点列表
    • 如何在没有选择器的情况下定义服务?
      *A. 指定外部名称
      B. 指定具有IP地址和端口的端点
      C. 只需指定IP地址即可
      D. 指定标签和api版本

    问答题

    • 简单说一下你对Kubernetes的了解

    Kubernetes是一个开源容器管理工具,负责容器部署,容器扩缩容以及负载平衡。作为Google的创意之作,它提供了出色的社区,并与所有云提供商合作(如果可以说的CNCF的话证明经常关注社区)。因此,我们可以说Kubernetes不是一个容器化平台,而是一个多容器管理解决方案。

    • Kubernetes的基本组成以及他们的作用,组件之间是如何交互的


      image.png

    Master
    -- kube-apiserver:Api Server 是唯一可以操作etcd 数据库的组件,并提供了认证、授权等机制。它严格遵守了REST规范,去操作这些资源,具有CRUD特性。它是Kubernetes控制的前端工程,它能够水平扩展,可以通过部署多个实例来达到高可用的目的。

    -- kube-scheduler:通过API Server的watch接口监听新建Pod副本信息,并通过算法为该pod选择一个合适的node。调度器可用选择合适的策略,策略的考虑包括个人和集体资源的情况,软件、硬件条件的影响,亲和性和反亲和性的规范等因素。调度器是可插拔的,并且我们期待支持多集群的调度,未来甚至希望可以支持用户自定义的调度器。

    -- kube-controller-manager:集群内各种资源controller 的核心管理者。针对于每一种具体的资源,都有相应的Controller,保证其下管理的每个Controller所对应的资源始终处于“期望的状态”。从逻辑上讲,每个控制器都是一个单独的过程,但为了降低复杂性,它们都被编译成单个二进制文件并在单个进程中运行。

    --- etcd:用于存储集群中所有对象产生的数据。etcd是Coreos开源的(Apache 2.0协议)一个分布式键值存储数据库,它提供了一种在一组机器上存储数据的可靠方法。 etcd采用了master-slave架构,在网络分区期间优雅地处理Leader选举,并且可以容忍机器故障,包括Leader。

    Worker
    -- kubelet:用于和Master节点交互,运行了node上的Service进程
    它位于集群中每个 node上非容器形式的服务进程组件,是Master和node之间的桥梁。处理Master下发到本Node上的pod创建、启停等管理任务,向API server注册Node信息。监控本Node上容器和节点资源情况,并定期向Master汇报节点资源占用情况。它还会向Master汇报容器运行的健康情况。

    -- kube-proxy:Service抽象概念的实现,将到service的请求按策略(负载均衡算法分发到后端的pod )上,默认使用iptables mode实现;支持nodeport模式,实现从外部访问集群内的service。

    • k8s的pause容器有什么用

    Pause容器,又叫Infra容器。在pod中担任Linux命名空间共享的基础。
    PID命名空间:Pod中的不同应用程序可以看到其他应用程序的进程ID。
    网络命名空间:Pod中的多个容器能够访问同一个IP和端口范围。
    IPC命名空间:Pod中的多个容器能够使用SystemV IPC或POSIX消息队列进行通信。
    UTS命名空间:Pod中的多个容器共享一个主机名;Volumes(共享存储卷):
    Pod中的各个容器可以访问在Pod级别定义的Volumes。

    • 一个pod的创建过程
      Pod是Kubernetes的基础单元,了解其创建的过程,更有助于理解系统的运作。
      ①用户通过kubectl或其他API客户端提交Pod Spec给API Server。
      ②API Server尝试将Pod对象的相关信息存储到etcd中,等待写入操作完成,API Server返回确认信息到客户端。
      ③API Server开始反映etcd中的状态变化。
      ④所有的Kubernetes组件通过"watch"机制跟踪检查API Server上的相关信息变动。
      ⑤kube-scheduler(调度器)通过其"watcher"检测到API Server创建了新的Pod对象但是没有绑定到任何工作节点。
      ⑥kube-scheduler为Pod对象挑选一个工作节点并将结果信息更新到API Server。
      ⑦调度结果新消息由API Server更新到etcd,并且API Server也开始反馈该Pod对象的调度结果。
      ⑧Pod被调度到目标工作节点上的kubelet尝试在当前节点上调用docker engine进行启动容器,并将容器的状态结果返回到API Server。
      ⑨API Server将Pod信息存储到etcd系统中。
      ⑩在etcd确认写入操作完成,API Server将确认信息发送到相关的kubelet。

    • 详述kube-proxy原理,一个请求是如何经过层层转发落到某个pod上的整个过程。请求可能来自pod也可能来自外部。

    kube-proxy其实就是管理service的访问入口,包括集群内Pod到Service的访问和集群外访问service。 kube-proxy管理sevice的Endpoints,该service对外暴露一个Virtual IP,也成为Cluster IP, 集群内通过访问这个Cluster IP:Port就能访问到集群内对应的serivce下的Pod。 service是通过Selector选择的一组Pods的服务抽象,其实就是一个微服务,提供了服务的LB和反向代理的能力,而kube-proxy的主要作用就是负责service的实现。 service另外一个重要作用是,一个服务后端的Pods可能会随着生存灭亡而发生IP的改变,service的出现,给服务提供了一个固定的IP,而无视后端Endpoint的变化。
    kube-proxy当前实现了两种proxyMode:userspace和iptables。其中userspace mode是v1.0及之前版本的默认模式,从v1.1版本中开始增加了iptables mode,在v1.2版本中正式替代userspace模式成为默认模式。最新版本中iptables已经改成了LVS。

    • 一个最小的可以运行容器的K8S平台应该包含哪些组件
      除了Master和Worker节点上运行的组件之外还需要安装下面的组件才可以正常部署容器
      -- CNI(网络方案calico、flannel、canel、weaver)
      -- DNS(CoreDNS、dnsmasq)

    • 什么是Ingress网络,它是如何工作的?
      Ingress网络是一组规则,充当Kubernetes集群的入口点。这允许入站连接,可以将其配置为通过可访问的URL,负载平衡流量或通过提供基于名称的虚拟主机从外部提供服务。因此,Ingress是一个API对象,通常通过HTTP管理集群中服务的外部访问,是暴露服务的最有效方式。
      现在,让我以一个例子向您解释Ingress网络的工作。
      有2个节点具有带有Linux桥接器的pod和根网络命名空间。除此之外,还有一个名为flannel0(网络插件)的新虚拟以太网设备被添加到根网络中。
      现在,假设我们希望数据包从pod1流向pod 4.请参阅下图。


      image.png

      因此,数据包将pod1的网络保留在eth0,并进入veth0的根网络。
      然后它被传递给cbr0,这使得ARP请求找到目的地,并且发现该节点上没有人具有目的地IP地址。
      因此,桥接器将数据包发送到flannel0,因为节点的路由表配置了flannel0。
      现在,flannel守护程序与Kubernetes的API服务器通信,以了解所有pod IP及其各自的节点,以创建pods IP到节点IP的映射。
      网络插件将此数据包封装在UDP数据包中,其中额外的标头将源和目标IP更改为各自的节点,并通过eth0发送此数据包。
      现在,由于路由表已经知道如何在节点之间路由流量,因此它将数据包发送到目标节点2。
      数据包到达node2的eth0并返回到flannel0以解封装并在根网络命名空间中将其发回。
      同样,数据包被转发到Linux网桥以发出ARP请求以找出属于veth1的IP。
      数据包最终穿过根网络并到达目标Pod4。

    • Replica Set 和 Replication Controller之间有什么区别?
      Replica Set 和 Replication Controller几乎完全相同。它们都确保在任何给定时间运行指定数量的pod副本。不同之处在于复制pod使用的选择器。Replica Set使用基于集合的选择器,而Replication Controller使用基于权限的选择器。
      -- Equity-Based选择器:这种类型的选择器允许按标签键和值进行过滤。因此,在外行术语中,基于Equity的选择器将仅查找与标签具有完全相同短语的pod。 示例:假设您的标签键表示app = nginx,那么,使用此选择器,您只能查找标签应用程序等于nginx的那些pod。
      -- Selector-Based选择器:此类型的选择器允许根据一组值过滤键。因此,换句话说,基于Selector的选择器将查找已在集合中提及其标签的pod。 示例:假设您的标签键在(nginx,NPS,Apache)中显示应用程序。然后,使用此选择器,如果您的应用程序等于任何nginx,NPS或Apache,则选择器将其视为真实结果。

    基础产品的面试问题

    除了Kubernetes,你还知道哪些容器编排工具,说说他们的优缺点。

    Kubernetes与Docker Swarm的区别


    image.png

    你还了解哪些Devops相关的产品。

    Devops产品:Openshift,AWS EKS
    CI产品:Jenkins,rundeck
    CD产品:Spinnaker,JenkinsX
    Docker仓库:Vmware Harbor
    GIT仓库:GitLab,BitBucket
    Agile工具:JIRA
    自动化工具:ansible,chef,puppet

    相关文章

      网友评论

        本文标题:【DevOps工程师】【Kubernetes】面试题

        本文链接:https://www.haomeiwen.com/subject/rjexuctx.html