kubernetes常見面試題匯總!建議收藏
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
1、 k8s是什么?請(qǐng)說出你的了解?
2、 K8s架構(gòu)的組成是什么?
主節(jié)點(diǎn)主要用于暴露API,調(diào)度部署和節(jié)點(diǎn)的管理;
計(jì)算節(jié)點(diǎn)運(yùn)行一個(gè)容器運(yùn)行環(huán)境,一般是docker環(huán)境(類似docker環(huán)境的還有rkt),同時(shí)運(yùn)行一個(gè)K8s的代理(kubelet)用于和master通信。計(jì)算節(jié)點(diǎn)也會(huì)運(yùn)行一些額外的組件,像記錄日志,節(jié)點(diǎn)監(jiān)控,服務(wù)發(fā)現(xiàn)等等。計(jì)算節(jié)點(diǎn)是k8s集群中真正工作的節(jié)點(diǎn)。
Kubectl:客戶端命令行工具,作為整個(gè)K8s集群的操作入口;
Api Server:在K8s架構(gòu)中承擔(dān)的是“橋梁”的角色,作為資源操作的唯一入口,它提供了認(rèn)證、授權(quán)、訪問控制、API注冊(cè)和發(fā)現(xiàn)等機(jī)制。客戶端與k8s群集及K8s內(nèi)部組件的通信,都要通過Api Server這個(gè)組件;
Controller-manager:負(fù)責(zé)維護(hù)群集的狀態(tài),比如故障檢測、自動(dòng)擴(kuò)展、滾動(dòng)更新等;
Scheduler:負(fù)責(zé)資源的調(diào)度,按照預(yù)定的調(diào)度策略將pod調(diào)度到相應(yīng)的node節(jié)點(diǎn)上;
Etcd:擔(dān)任數(shù)據(jù)中心的角色,保存了整個(gè)群集的狀態(tài);
2、Node節(jié)點(diǎn):Kubelet:負(fù)責(zé)維護(hù)容器的生命周期,同時(shí)也負(fù)責(zé)Volume和網(wǎng)絡(luò)的管理,一般運(yùn)行在所有的節(jié)點(diǎn),是Node節(jié)點(diǎn)的代理,當(dāng)Scheduler確定某個(gè)node上運(yùn)行pod之后,會(huì)將pod的具體信息(image,volume)等發(fā)送給該節(jié)點(diǎn)的kubelet,kubelet根據(jù)這些信息創(chuàng)建和運(yùn)行容器,并向master返回運(yùn)行狀態(tài)。(自動(dòng)修復(fù)功能:如果某個(gè)節(jié)點(diǎn)中的容器宕機(jī),它會(huì)嘗試重啟該容器,若重啟無效,則會(huì)將該pod殺死,然后重新創(chuàng)建一個(gè)容器);
Kube-proxy:Service在邏輯上代表了后端的多個(gè)pod。負(fù)責(zé)為Service提供cluster內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡(外界通過Service訪問pod提供的服務(wù)時(shí),Service接收到的請(qǐng)求后就是通過kube-proxy來轉(zhuǎn)發(fā)到pod上的);
container-runtime:是負(fù)責(zé)管理運(yùn)行容器的軟件,比如docker
Pod:是k8s集群里面最小的單位。每個(gè)pod里邊可以運(yùn)行一個(gè)或多個(gè)container(容器),如果一個(gè)pod中有兩個(gè)container,那么container的USR(用戶)、MNT(掛載點(diǎn))、PID(進(jìn)程號(hào))是相互隔離的,UTS(主機(jī)名和域名)、IPC(消息隊(duì)列)、NET(網(wǎng)絡(luò)棧)是相互共享的。我比較喜歡把pod來當(dāng)做豌豆夾,而豌豆就是pod中的container;
3、 容器和主機(jī)部署應(yīng)用的區(qū)別是什么?
4、請(qǐng)你說一下kubenetes針對(duì)pod資源對(duì)象的健康監(jiān)測機(jī)制?
initialDelaySeconds:初始第一次探測間隔,用于應(yīng)用啟動(dòng)的時(shí)間,防止應(yīng)用還沒啟動(dòng)而健康檢查失敗
periodSeconds:檢查間隔,多久執(zhí)行probe檢查,默認(rèn)為10s;
timeoutSeconds:檢查超時(shí)時(shí)長,探測應(yīng)用timeout后為失敗;
successThreshold:成功探測閾值,表示探測多少次為健康正常,默認(rèn)探測1次。
spec:
containers:
- name: liveness
image: k8s.gcr.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe: #選擇livenessProbe的探測機(jī)制
exec: #執(zhí)行以下命令
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 #在容器運(yùn)行五秒后開始探測
periodSeconds: 5 #每次探測的時(shí)間間隔為5秒
spec:
containers:
- name: liveness
image: k8s.gcr.io/liveness
livenessProbe: #采用livenessProbe機(jī)制探測
httpGet: #采用httpget的方式
scheme:HTTP #指定協(xié)議,也支持https
path: /healthz #檢測是否可以訪問到網(wǎng)頁根目錄下的healthz網(wǎng)頁文件
port: 8080 #監(jiān)聽端口是8080
initialDelaySeconds: 3 #容器運(yùn)行3秒后開始探測
periodSeconds: 3 #探測頻率為3秒
spec:
containers:
- name: goproxy
image: k8s.gcr.io/goproxy:0.1
ports:
- containerPort: 8080
#這里兩種探測機(jī)制都用上了,都是為了和容器的8080端口建立TCP連接
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
Success:Container通過了檢查;
Failure:Container沒有通過檢查;
Unknown:沒有執(zhí)行檢查,因此不采取任何措施(通常是我們沒有定義探針檢測,默認(rèn)為成功)。
5、 如何控制滾動(dòng)更新過程?
[root@master yaml]# kubectl explain deploy.spec.strategy.rollingUpdate
6、K8s中鏡像的下載策略是什么?
Always:鏡像標(biāo)簽為latest時(shí),總是從指定的倉庫中獲取鏡像;
Never:禁止從倉庫中下載鏡像,也就是說只能使用本地鏡像;
IfNotPresent:僅當(dāng)本地沒有對(duì)應(yīng)鏡像時(shí),才從目標(biāo)倉庫中下載。
默認(rèn)的鏡像下載策略是:當(dāng)鏡像標(biāo)簽是latest時(shí),默認(rèn)策略是Always;當(dāng)鏡像標(biāo)簽是自定義時(shí)(也就是標(biāo)簽不是latest),那么默認(rèn)策略是IfNotPresent。
7、 image的狀態(tài)有哪些?
Running:Pod所需的容器已經(jīng)被成功調(diào)度到某個(gè)節(jié)點(diǎn),且已經(jīng)成功運(yùn)行,
Pending:APIserver創(chuàng)建了pod資源對(duì)象,并且已經(jīng)存入etcd中,但它尚未被調(diào)度完成或者仍然處于倉庫中下載鏡像的過程
Unknown:APIserver無法正常獲取到pod對(duì)象的狀態(tài),通常是其無法與所在工作節(jié)點(diǎn)的kubelet通信所致。
8、 pod的重啟策略是什么?
Always:但凡pod對(duì)象終止就重啟,此為默認(rèn)策略。
OnFailure:僅在pod對(duì)象出現(xiàn)錯(cuò)誤時(shí)才重啟
9、 Service這種資源對(duì)象的作用是什么?
10、版本回滾相關(guān)的命令?
[root@master httpd-web]# kubectl apply -f httpd2-deploy1.yaml --record
#運(yùn)行yaml文件,并記錄版本信息;
[root@master httpd-web]# kubectl rollout history deployment httpd-devploy1
#查看該deployment的歷史版本
[root@master httpd-web]# kubectl rollout undo deployment httpd-devploy1 --to-revision=1
#執(zhí)行回滾操作,指定回滾到版本1
#在yaml文件的spec字段中,可以寫以下選項(xiàng)(用于限制最多記錄多少個(gè)歷史版本):
spec:
revisionHistoryLimit: 5
#這個(gè)字段通過 kubectl explain deploy.spec 命令找到revisionHistoryLimit <integer>行獲得
11、 標(biāo)簽與標(biāo)簽選擇器的作用是什么?
基于等值關(guān)系的,如:“=”、“”“==”、“!=”(注:“==”也是等于的意思,yaml文件中的matchLabels字段);
基于集合的,如:in、notin、exists(yaml文件中的matchExpressions字段);
注:in:在這個(gè)集合中;notin:不在這個(gè)集合中;exists:要么全在(exists)這個(gè)集合中,要么都不在(notexists);
在使用基于集合的標(biāo)簽選擇器同時(shí)指定多個(gè)選擇器之間的邏輯關(guān)系為“與”操作(比如:- {key: name,operator: In,values: [zhangsan,lisi]} ,那么只要擁有這兩個(gè)值的資源,都會(huì)被選中);
使用空值的標(biāo)簽選擇器,意味著每個(gè)資源對(duì)象都被選中(如:標(biāo)簽選擇器的鍵是“A”,兩個(gè)資源對(duì)象同時(shí)擁有A這個(gè)鍵,但是值不一樣,這種情況下,如果使用空值的標(biāo)簽選擇器,那么將同時(shí)選中這兩個(gè)資源對(duì)象)
空的標(biāo)簽選擇器(注意不是上面說的空值,而是空的,都沒有定義鍵的名稱),將無法選擇出任何資源;
在基于集合的選擇器中,使用“In”或者“Notin”操作時(shí),其values可以為空,但是如果為空,這個(gè)標(biāo)簽選擇器,就沒有任何意義了。
兩種標(biāo)簽選擇器類型(基于等值、基于集合的書寫方法):
selector:
matchLabels: #基于等值
app: nginx
matchExpressions: #基于集合
- {key: name,operator: In,values: [zhangsan,lisi]} #key、operator、values這三個(gè)字段是固定的
- {key: age,operator: Exists,values:} #如果指定為exists,那么values的值一定要為空
12、 常用的標(biāo)簽分類有哪些?
版本類標(biāo)簽(release):stable(穩(wěn)定版)、canary(金絲雀版本,可以將其稱之為測試版中的測試版)、beta(測試版);
環(huán)境類標(biāo)簽(environment):dev(開發(fā))、qa(測試)、production(生產(chǎn))、op(運(yùn)維);
應(yīng)用類(app):ui、as、pc、sc;
架構(gòu)類(tier):frontend(前端)、backend(后端)、cache(緩存);
分區(qū)標(biāo)簽(partition):customerA(客戶A)、customerB(客戶B);
品控級(jí)別(Track):daily(每天)、weekly(每周)。
13、 有幾種查看標(biāo)簽的方式?
[root@master ~]# kubectl get pod --show-labels #查看pod,并且顯示標(biāo)簽內(nèi)容
[root@master ~]# kubectl get pod -L env,tier #顯示資源對(duì)象標(biāo)簽的值
[root@master ~]# kubectl get pod -l env,tier #只顯示符合鍵值資源對(duì)象的pod,而“-L”是顯示所有的pod
14、 添加、修改、刪除標(biāo)簽的命令?
#對(duì)pod標(biāo)簽的操作
[root@master ~]# kubectl label pod label-pod abc=123 #給名為label-pod的pod添加標(biāo)簽
[root@master ~]# kubectl label pod label-pod abc=456 --overwrite #修改名為label-pod的標(biāo)簽
[root@master ~]# kubectl label pod label-pod abc- #刪除名為label-pod的標(biāo)簽
[root@master ~]# kubectl get pod --show-labels
#對(duì)node節(jié)點(diǎn)的標(biāo)簽操作
[root@master ~]# kubectl label nodes node01 disk=ssd #給節(jié)點(diǎn)node01添加disk標(biāo)簽
[root@master ~]# kubectl label nodes node01 disk=sss –overwrite #修改節(jié)點(diǎn)node01的標(biāo)簽
[root@master ~]# kubectl label nodes node01 disk- #刪除節(jié)點(diǎn)node01的disk標(biāo)簽
15、 DaemonSet資源對(duì)象的特性?
在去做每個(gè)節(jié)點(diǎn)的日志收集工作;
監(jiān)控每個(gè)節(jié)點(diǎn)的的運(yùn)行狀態(tài);
16、 說說你對(duì)Job這種資源對(duì)象的了解?
#提高Job執(zhí)行效率的方法:
spec:
parallelism: 2 #一次運(yùn)行2個(gè)
completions: 8 #最多運(yùn)行8個(gè)
template:
metadata:
17、描述一下pod的生命周期有哪些狀態(tài)?
Pending:表示pod已經(jīng)被同意創(chuàng)建,正在等待kube-scheduler選擇合適的節(jié)點(diǎn)創(chuàng)建,一般是在準(zhǔn)備鏡像;
Running:表示pod中所有的容器已經(jīng)被創(chuàng)建,并且至少有一個(gè)容器正在運(yùn)行或者是正在啟動(dòng)或者是正在重啟;
Succeeded:表示所有容器已經(jīng)成功終止,并且不會(huì)再啟動(dòng);
Failed:表示pod中所有容器都是非0(不正常)狀態(tài)退出;
Unknown:表示無法讀取Pod狀態(tài),通常是kube-controller-manager無法與Pod通信。
18、 創(chuàng)建一個(gè)pod的流程是什么?
19、 刪除一個(gè)Pod會(huì)發(fā)生什么事情?
20、 K8s的Service是什么?
21、 k8s是怎么進(jìn)行服務(wù)注冊(cè)的?
22、 k8s集群外流量怎么訪問Pod?
23、 k8s數(shù)據(jù)持久化的方式有哪些?
ReadWriteOnce:只能以讀寫的方式掛載到單個(gè)節(jié)點(diǎn);
ReadOnlyMany:能以只讀的方式掛載到多個(gè)節(jié)點(diǎn);
ReadWriteMany:能以讀寫的方式掛載到多個(gè)節(jié)點(diǎn)。,
以及指定pv的回收策略:recycle:清除PV的數(shù)據(jù),然后自動(dòng)回收;
Retain:需要手動(dòng)回收;
delete:刪除云存儲(chǔ)資源,云存儲(chǔ)專用;
#PS:這里的回收策略指的是在PV被刪除后,在這個(gè)PV下所存儲(chǔ)的源文件是否刪除)。
作者 | @ Ray
來源 | csdn.net/lvjianzhaoa/article/details/103240449

