容器化和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,但是需要额外的配置
-
在主机和容器上部署应用程序有什么区别?
请参考上图。左侧架构表示在主机上部署应用程序。因此,这种架构将具有操作系统,然后操作系统将具有内核,该内核将在应用程序所需的操作系统上安装各种库。因此,在这种框架中,您可以拥有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的基本组成以及他们的作用,组件之间是如何交互的
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.请参阅下图。
因此,数据包将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的区别
你还了解哪些Devops相关的产品。
Devops产品:Openshift,AWS EKS
CI产品:Jenkins,rundeck
CD产品:Spinnaker,JenkinsX
Docker仓库:Vmware Harbor
GIT仓库:GitLab,BitBucket
Agile工具:JIRA
自动化工具:ansible,chef,puppet