docker & kubernetes 面试(某银行科技公司)

两年容器云工作经验,牛刀小试了几家公司,将面试问到的问题记录下来,鞭策自己不断学习。

1、entrypoint & cmd 指令的区别

这主要考察 Dockerfile 良好实践中关于容器启动时运行的命令。

entrypoint 和 cmd 命令都是设置容器启动时要执行的命令,但用法稍有不同。entrypoint 和 cmd 指令都是在 Dockerfile 中定义,但在镜像构建过程中并不会被执行,只有当容器启动时,entrypoint 和 cmd 指令设置的命令才会被执行。Dockerfile 中可以有多个 entrypoint 指令,但生效的只有最后一个 entrypoint 指令,cmd 指令也类似,两者的区别主要如下:

entrypoint 指令一般用来设置容器启动后要执行的命令,这对容器来说,往往是固定不变的。

cmd 指令一般用来设置容器启动后执行命令的默认参数,这对容器来说,往往是可以改变的,cmd 能够被docker run 后面跟的命令行参数替换,一般而言,两者是可以结合使用的。

举个例子


FROM baseimage:v1.0

ENTRYPOINT ["/usr/sbin/nginx"]

CMD [""]


从以上 Dockerfile 设置的 entrypoint 和 cmd 指令来看,容器启动时会运行 nginx 进程,而 cmd 指令可以在执行 docker run 传入参数进行覆盖,如 docker run --name:** -p **:** -g "daemon off",其中 -g "daemon off" 将会被作为命令参数追加到 entrypoint 后面的指令,也就是说最后容器的启动命令为:/usr/sbin/nginx -g "daemon off;",以前台进程来运行 nginx 进程。

2、如何覆盖 entrypoint 和 cmd 指令

这个问题是考察 entrypoint 和 cmd 的格式

CMD 有三种格式:


(1) Exec 格式:CMD ["executabel", "param1", "param2"],这是 CMD 的推荐格式

(2) CMD ["param1", "param2"],这种模式和 entrypoint 结合使用,为 entrypoint 提供额外的参数,此时 entrypoint 必须使用 exec 格式。

(3) Shell 格式:CMD command param1 param2


ENTRYPOINT 有两种格式:


(1) Exec 格式:ENTRYPOINT ["executable", "param1", "param2"],这是 ENTRYPOINT 的推荐方式

(2) Shell 格式:ENTRYPOINT command param1 param2


其中,CMD 无论是哪种格式,都会被 docker run 命令带的参数直接覆盖

而 ENTRYPOINT 无论是哪种格式,ENTRYPOINT 指令一定会被执行,并不会被覆盖,但 ENTRYPOINT 在选择格式时必须格外小心,因为这两种格式的效果差别很大。

Exec 格式


ENTRYPOINT 中的参数始终会被使用,而 CMD 的额外参数可以在容器启动时动态替换掉。


Shell 格式


ENTRYPOINT 的 shell 格式会忽略任何 CMD 或者 docker run 提供的任何参数。


3、ADD 和 COPY 指令有什么区别?推荐使用哪种方式

这几道面试题都是 Dockerfile 良好实践中的知识点,这道题主要考察在构建镜像时,如何向镜像拷贝文件。

ADD 指令


ADD 指令的功能是将主机构建环境(上下文)目录中的文件和目录,拷贝到镜像中,如果源文件是个归档文件(压缩文件,如tar, gzip, bzip2),ADD 指令会自动进行解压,如:

ADD /foo.tar.gz /tmp/

上述指令会将 foo.tar.gz 压缩文件解压到容器的 /tmp 目录下。


COPY指令


COPY 指令和 ADD 指令类似,都是负责拷贝文件或者目录到容器里,但 COPY 指令功能更简洁和易懂,COPY 是ADD 的一种简化版本,目的在于满足大多数人复制文件到容器的需求,在大多数情况下,都建议使用 COPY 指令,除非你明确需要ADD指令


4、sed、grep 和 awk 命令的区别

这道是考察 linux 常见运维命令。

简单理解,grep 命令主要用于关键字的筛选,sed 指令是以行为单位的文本编辑工具,而 awk 指令通过指定分割符将一行(一条记录)划分为多个字段,以字段为单位来处理文本,一般结合 grep 命令来使用,比如只打印第一列,如:cat /etc/hosts | grep *** | awk '{print $1}',更详细的说明可以参考以下文档:

sed grep 和 awk的区别

5、两个 namespace 如何进行通信

这道题主要考察 Docker 主机两个 namespace(容器)或者是容器与主机如何进行通信的原理。

我们都知道,Docker 是基于 LXC容器技术 namespace 来实现资源的隔离,基于 LXC容器技术 cgroups 来实现资源的限制,Docker 采用虚拟网络设置(Virtual Network Device)的方式,将不同命名空间的网络设备连接到一起,这种设备对都是成对存在的,一端作为容器的网卡eth0,一端连接到宿主机上的docker网桥 veth,从而实现 Docker 主机上不同 namespace通信,详情可见下图:

多个network namespace通过bridge来进行通信

或者参考如下文档:docker namespace

6、简述 Docker 如何用 namespace 来进行资源隔离

这道题主要也是考察 namespace 相关的知识。

Docker 主要通过六大 Namespace 来实现资源的隔离,如下:

(1) Mount Namespace,挂载命名空间,用来隔离挂载目录,让不同 Namespace 拥有独立的挂载结构,而程序中对挂载信息的修改不会影响到其他 Namespace 中程序的运行。

(2) UTS Namespace,UTS Namespace,用来隔离主机名和域名,通过UTS Namespace,让不同 Namespace 拥有独立的主机名称和网络访问域名。

(3) IPC Namespace,进程通信命名空间,用来隔离进程间通信,主要作用于 消息队列、信号量或者是管道,IPC 只能做到同一个命名空间进行通信,无法做到不同命名空间进行信息交换通信。

(4) PID Namespace,进程命名空间,用来隔离进程的运行信息,PID Namespace 让命名空间拥有独立的进程号管理。

(5) Networt Namespace,网络命名空间,用来隔离网络协议栈,包括网络设备接口、IPV4 和 IPV6 协议等。

(6) User Namespace,用户命名空间,用来隔离用户和用户组信息,通过严格的用户隔离机制,避免 Namespace 中的程序直接操作到宿主机或者其他 Namespace 中的用户。

除了 Namespace ,还有一项核心技术 Cgroups(控制组),可以参考这篇博客:Docker底层技术架构

7、glusterfs 分布式存储元数据不一致时,如何恢复处理

这道是考察存储相关的知识。

对存储底层了解的不多,因此到时这道题我就简单粗暴地说重启 glusterfs服务进程,明显没有 get 到面试官的点。

后来查阅相关的资料,说是跟时间戳有关系,但本人也没有验证过,详细可以参考这篇博客:glusterfs 数据不一致处理

8、service 对外提供服务的方式有几种

这道是考察外部如何访问 k8s 集群内的 service 服务。

目前来说总共有以下4种方式:

NodePort 方式


这种方式会将 Service 的端口映射到集群内的所有的 node节点,集群内的所有 node 节点都会起一个相同的随机端口,通过访问:${任一node节点IP}:${nodeport端口} 就可以访问到 k8s 集群内指定的 service 服务了,iptables 会捕获这种方式的请求,根据 iptables 中的规则转发到后端具体的 pod 实例上,这种方式简单,但会占用 node 节点的端口资源,并且 nodeport 没有一个负载均衡器进行路由分发,这也就衍生了第二种方式。


LoadBalancer 方式


这种方式,在nodeport的外部搭建一个负载均衡器(云服务提供商),但 LoadBalancer 需要 k8s 集群跑在支持的 Cloud Provider 上,这对于企业内部运行在私有云上的 k8s 集群不太适合。


Ingress 方式


Ingress 主要有两大组件, Ingress 和 Ingress Controller,其中 Ingress 解决的是服务和域名的对应问题,基本上一个 Ingress 对象,通过 yaml 文件进行创建和更新,而 Ingress Controller 是将 Ingress 的这种变化动态生成一段 nginx 的配置,并通过 apiserver 更新到 nginx 这个 pod 中,并自动 reload。


Router 方式


这种方式是 Openshift 特有的方式,通过为 k8s 集群内的每个 service 对象生成一个 Router 对象,就能实现外界访问 k8s 集群内的 service 服务了。


9、ovs 访问外部服务 ovs 网桥到物理网卡是如何连接的

这道是考察 sdn 网络 openvswitch的架构和组成。

正常跨节点之间的通信是通过 vxlan 隧道 或者是 gre连接来完成,见下图:

gre连接

但如果集群内的容器要访问外部服务,是通过ovs 的 tun0 端口来完成。

10、介绍家庭背景

这是 hr 问的一些常规问题,暂不做解释,如实回答即可,还问到校招是否拿到公司的 offer,有女朋友吗 等等一些问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258

推荐阅读更多精彩内容

  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,414评论 15 147
  • 五、Docker 端口映射 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了...
    R_X阅读 1,670评论 0 7
  • 一 、什么是 Docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国...
    Blazzer阅读 3,101评论 0 13
  • 基本概念 镜像Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器 容器容器是从镜像创建的运...
    巨子联盟阅读 7,473评论 0 3
  • 最近在学习分享一下心得。有很多人都是想要理财的但没有搞清楚一个问题就是理财≠投资,而投资=理财。关于投资的若干个问...
    缘是你的俊阅读 222评论 0 1