docker & kubernetes 面試(某銀行科技公司)

兩年容器云工作經(jīng)驗,牛刀小試了幾家公司,將面試問到的問題記錄下來,鞭策自己不斷學(xué)習(xí)。

1、entrypoint & cmd 指令的區(qū)別

這主要考察 Dockerfile 良好實踐中關(guān)于容器啟動時運行的命令。

entrypoint 和 cmd 命令都是設(shè)置容器啟動時要執(zhí)行的命令,但用法稍有不同。entrypoint 和 cmd 指令都是在 Dockerfile 中定義,但在鏡像構(gòu)建過程中并不會被執(zhí)行,只有當(dāng)容器啟動時,entrypoint 和 cmd 指令設(shè)置的命令才會被執(zhí)行。Dockerfile 中可以有多個 entrypoint 指令,但生效的只有最后一個 entrypoint 指令,cmd 指令也類似,兩者的區(qū)別主要如下:

entrypoint 指令一般用來設(shè)置容器啟動后要執(zhí)行的命令,這對容器來說,往往是固定不變的。

cmd 指令一般用來設(shè)置容器啟動后執(zhí)行命令的默認(rèn)參數(shù),這對容器來說,往往是可以改變的,cmd 能夠被docker run 后面跟的命令行參數(shù)替換,一般而言,兩者是可以結(jié)合使用的。

舉個例子


FROM baseimage:v1.0

ENTRYPOINT ["/usr/sbin/nginx"]

CMD [""]


從以上 Dockerfile 設(shè)置的 entrypoint 和 cmd 指令來看,容器啟動時會運行 nginx 進(jìn)程,而 cmd 指令可以在執(zhí)行 docker run 傳入?yún)?shù)進(jìn)行覆蓋,如 docker run --name:** -p **:** -g "daemon off",其中 -g "daemon off" 將會被作為命令參數(shù)追加到 entrypoint 后面的指令,也就是說最后容器的啟動命令為:/usr/sbin/nginx -g "daemon off;",以前臺進(jìn)程來運行 nginx 進(jìn)程。

2、如何覆蓋 entrypoint 和 cmd 指令

這個問題是考察 entrypoint 和 cmd 的格式

CMD 有三種格式:


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

(2) CMD ["param1", "param2"],這種模式和 entrypoint 結(jié)合使用,為 entrypoint 提供額外的參數(shù),此時 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 命令帶的參數(shù)直接覆蓋

而 ENTRYPOINT 無論是哪種格式,ENTRYPOINT 指令一定會被執(zhí)行,并不會被覆蓋,但 ENTRYPOINT 在選擇格式時必須格外小心,因為這兩種格式的效果差別很大。

Exec 格式


ENTRYPOINT 中的參數(shù)始終會被使用,而 CMD 的額外參數(shù)可以在容器啟動時動態(tài)替換掉。


Shell 格式


ENTRYPOINT 的 shell 格式會忽略任何 CMD 或者 docker run 提供的任何參數(shù)。


3、ADD 和 COPY 指令有什么區(qū)別?推薦使用哪種方式

這幾道面試題都是 Dockerfile 良好實踐中的知識點,這道題主要考察在構(gòu)建鏡像時,如何向鏡像拷貝文件。

ADD 指令


ADD 指令的功能是將主機(jī)構(gòu)建環(huán)境(上下文)目錄中的文件和目錄,拷貝到鏡像中,如果源文件是個歸檔文件(壓縮文件,如tar, gzip, bzip2),ADD 指令會自動進(jìn)行解壓,如:

ADD /foo.tar.gz /tmp/

上述指令會將 foo.tar.gz 壓縮文件解壓到容器的 /tmp 目錄下。


COPY指令


COPY 指令和 ADD 指令類似,都是負(fù)責(zé)拷貝文件或者目錄到容器里,但 COPY 指令功能更簡潔和易懂,COPY 是ADD 的一種簡化版本,目的在于滿足大多數(shù)人復(fù)制文件到容器的需求,在大多數(shù)情況下,都建議使用 COPY 指令,除非你明確需要ADD指令。


4、sed、grep 和 awk 命令的區(qū)別

這道是考察 linux 常見運維命令。

簡單理解,grep 命令主要用于關(guān)鍵字的篩選,sed 指令是以行為單位的文本編輯工具,而 awk 指令通過指定分割符將一行(一條記錄)劃分為多個字段,以字段為單位來處理文本,一般結(jié)合 grep 命令來使用,比如只打印第一列,如:cat /etc/hosts | grep *** | awk '{print $1}',更詳細(xì)的說明可以參考以下文檔:

sed grep 和 awk的區(qū)別

5、兩個 namespace 如何進(jìn)行通信

這道題主要考察 Docker 主機(jī)兩個 namespace(容器)或者是容器與主機(jī)如何進(jìn)行通信的原理。

我們都知道,Docker 是基于 LXC容器技術(shù) namespace 來實現(xiàn)資源的隔離,基于 LXC容器技術(shù) cgroups 來實現(xiàn)資源的限制,Docker 采用虛擬網(wǎng)絡(luò)設(shè)置(Virtual Network Device)的方式,將不同命名空間的網(wǎng)絡(luò)設(shè)備連接到一起,這種設(shè)備對都是成對存在的,一端作為容器的網(wǎng)卡eth0,一端連接到宿主機(jī)上的docker網(wǎng)橋 veth,從而實現(xiàn) Docker 主機(jī)上不同 namespace通信,詳情可見下圖:

多個network namespace通過bridge來進(jìn)行通信

或者參考如下文檔:docker namespace

6、簡述 Docker 如何用 namespace 來進(jìn)行資源隔離

這道題主要也是考察 namespace 相關(guān)的知識。

Docker 主要通過六大 Namespace 來實現(xiàn)資源的隔離,如下:

(1) Mount Namespace,掛載命名空間,用來隔離掛載目錄,讓不同 Namespace 擁有獨立的掛載結(jié)構(gòu),而程序中對掛載信息的修改不會影響到其他 Namespace 中程序的運行。

(2) UTS Namespace,UTS Namespace,用來隔離主機(jī)名和域名,通過UTS Namespace,讓不同 Namespace 擁有獨立的主機(jī)名稱和網(wǎng)絡(luò)訪問域名。

(3) IPC Namespace,進(jìn)程通信命名空間,用來隔離進(jìn)程間通信,主要作用于 消息隊列、信號量或者是管道,IPC 只能做到同一個命名空間進(jìn)行通信,無法做到不同命名空間進(jìn)行信息交換通信。

(4) PID Namespace,進(jìn)程命名空間,用來隔離進(jìn)程的運行信息,PID Namespace 讓命名空間擁有獨立的進(jìn)程號管理。

(5) Networt Namespace,網(wǎng)絡(luò)命名空間,用來隔離網(wǎng)絡(luò)協(xié)議棧,包括網(wǎng)絡(luò)設(shè)備接口、IPV4 和 IPV6 協(xié)議等。

(6) User Namespace,用戶命名空間,用來隔離用戶和用戶組信息,通過嚴(yán)格的用戶隔離機(jī)制,避免 Namespace 中的程序直接操作到宿主機(jī)或者其他 Namespace 中的用戶。

除了 Namespace ,還有一項核心技術(shù) Cgroups(控制組),可以參考這篇博客:Docker底層技術(shù)架構(gòu)

7、glusterfs 分布式存儲元數(shù)據(jù)不一致時,如何恢復(fù)處理

這道是考察存儲相關(guān)的知識。

對存儲底層了解的不多,因此到時這道題我就簡單粗暴地說重啟 glusterfs服務(wù)進(jìn)程,明顯沒有 get 到面試官的點。

后來查閱相關(guān)的資料,說是跟時間戳有關(guān)系,但本人也沒有驗證過,詳細(xì)可以參考這篇博客:glusterfs 數(shù)據(jù)不一致處理

8、service 對外提供服務(wù)的方式有幾種

這道是考察外部如何訪問 k8s 集群內(nèi)的 service 服務(wù)。

目前來說總共有以下4種方式:

NodePort 方式


這種方式會將 Service 的端口映射到集群內(nèi)的所有的 node節(jié)點,集群內(nèi)的所有 node 節(jié)點都會起一個相同的隨機(jī)端口,通過訪問:${任一node節(jié)點IP}:${nodeport端口} 就可以訪問到 k8s 集群內(nèi)指定的 service 服務(wù)了,iptables 會捕獲這種方式的請求,根據(jù) iptables 中的規(guī)則轉(zhuǎn)發(fā)到后端具體的 pod 實例上,這種方式簡單,但會占用 node 節(jié)點的端口資源,并且 nodeport 沒有一個負(fù)載均衡器進(jìn)行路由分發(fā),這也就衍生了第二種方式。


LoadBalancer 方式


這種方式,在nodeport的外部搭建一個負(fù)載均衡器(云服務(wù)提供商),但 LoadBalancer 需要 k8s 集群跑在支持的 Cloud Provider 上,這對于企業(yè)內(nèi)部運行在私有云上的 k8s 集群不太適合。


Ingress 方式


Ingress 主要有兩大組件, Ingress 和 Ingress Controller,其中 Ingress 解決的是服務(wù)和域名的對應(yīng)問題,基本上一個 Ingress 對象,通過 yaml 文件進(jìn)行創(chuàng)建和更新,而 Ingress Controller 是將 Ingress 的這種變化動態(tài)生成一段 nginx 的配置,并通過 apiserver 更新到 nginx 這個 pod 中,并自動 reload。


Router 方式


這種方式是 Openshift 特有的方式,通過為 k8s 集群內(nèi)的每個 service 對象生成一個 Router 對象,就能實現(xiàn)外界訪問 k8s 集群內(nèi)的 service 服務(wù)了。


9、ovs 訪問外部服務(wù) ovs 網(wǎng)橋到物理網(wǎng)卡是如何連接的

這道是考察 sdn 網(wǎng)絡(luò) openvswitch的架構(gòu)和組成。

正??绻?jié)點之間的通信是通過 vxlan 隧道 或者是 gre連接來完成,見下圖:

gre連接

但如果集群內(nèi)的容器要訪問外部服務(wù),是通過ovs 的 tun0 端口來完成。

10、介紹家庭背景

這是 hr 問的一些常規(guī)問題,暫不做解釋,如實回答即可,還問到校招是否拿到公司的 offer,有女朋友嗎 等等一些問題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Docker — 云時代的程序分發(fā)方式 要說最近一年云計算業(yè)界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,874評論 15 147
  • 五、Docker 端口映射 無論如何,這些 ip 是基于本地系統(tǒng)的并且容器的端口非本地主機(jī)是訪問不到的。此外,除了...
    R_X閱讀 1,972評論 0 7
  • 一 、什么是 Docker Docker 最初是 dotCloud 公司創(chuàng)始人 Solomon Hykes 在法國...
    Blazzer閱讀 3,241評論 0 13
  • 基本概念 鏡像Docker 鏡像就是一個只讀的模板,鏡像可以用來創(chuàng)建 Docker 容器 容器容器是從鏡像創(chuàng)建的運...
    巨子聯(lián)盟閱讀 7,816評論 0 3
  • 最近在學(xué)習(xí)分享一下心得。有很多人都是想要理財?shù)牡珱]有搞清楚一個問題就是理財≠投資,而投資=理財。關(guān)于投資的若干個問...
    緣是你的俊閱讀 292評論 0 1

友情鏈接更多精彩內(nèi)容