K8s 常見(jiàn)面試題,讓你求職不迷路
前段時(shí)間在這個(gè)視頻中分享了 https://github.com/bregman-arie/devops-exercises 這個(gè)知識(shí)倉(cāng)庫(kù)。
這次繼續(xù)分享里面的內(nèi)容,本次主要以 k8s 相關(guān)的問(wèn)題為主。
k8s 是什么,為什么企業(yè)選擇使用它
k8s 是一個(gè)開源應(yīng)用,給用戶提供了管理、部署、擴(kuò)展容器的能力,以下幾個(gè)例子更容易理解:
- 你可以將容器運(yùn)行在不同的機(jī)器或節(jié)點(diǎn)中,并且可以將一些變化同步給這些容器,簡(jiǎn)單來(lái)說(shuō)我們只需要編寫 yaml 文件,告訴 k8s 我的預(yù)期是什么,其中同步變化的過(guò)程全部都交給 k8s 去完成。
其實(shí)就是我們常說(shuō)的聲明式 API
- 第二個(gè)特點(diǎn)剛才已經(jīng)提到了,它可以幫我們一鍵管理多個(gè)容器,同步所有的變更。
- 可以根據(jù)當(dāng)前的負(fù)載調(diào)整應(yīng)用的副本數(shù),負(fù)載高就新創(chuàng)建幾個(gè)應(yīng)用實(shí)例,低就降低幾個(gè),這個(gè)可以手動(dòng)或自動(dòng)完成。
什么時(shí)候使用或者不使用 k8s
- 如果主要還是使用物理機(jī)這種低級(jí)別的基礎(chǔ)設(shè)施的話,不太建議使用 k8s,這種情況通常是比較傳統(tǒng)的業(yè)務(wù),沒(méi)有必要使用 k8s。
- 第二種情況是如果是小團(tuán)隊(duì),或者容器規(guī)模較小時(shí)也不建議使用,除非你想使用 k8s 的滾動(dòng)發(fā)布和自擴(kuò)容能力,
不過(guò)這些功能運(yùn)維自己寫工具也能實(shí)現(xiàn)。
k8s 有哪些特性
- 是自我修復(fù),k8s 對(duì)容器有著健康檢測(cè),比如使用啟動(dòng)探針、存活探針等,或者是容器 OOM 后也會(huì)重啟應(yīng)用嘗試修復(fù)。
- 自帶負(fù)載均衡,使用 service 可以將流量自動(dòng)負(fù)載到后續(xù) Pod 中,如果 Pod 提供的是 http 服務(wù)這個(gè)夠用了,但如果是 grpc 這樣的長(zhǎng)鏈接,就需要使用 istio 這類服務(wù)網(wǎng)格,他可以識(shí)別出協(xié)議類型,從而做到請(qǐng)求級(jí)別的負(fù)載均衡。
- Operator 自動(dòng)運(yùn)維能力:k8s 可以根據(jù)應(yīng)用的運(yùn)行情況自動(dòng)調(diào)整當(dāng)前集群的 Pod 數(shù)量、存儲(chǔ)等,拿 Pulsar 舉例,當(dāng)流量激增后自動(dòng)新增 broker,磁盤不足時(shí)自動(dòng)擴(kuò)容等。
- 滾動(dòng)更新能力:當(dāng)我們發(fā)版或者是回滾版本的時(shí)候,k8s 會(huì)等待新的容器啟動(dòng)之后才會(huì)將流量切回來(lái),同時(shí)逐步停止老的實(shí)例。
- 水平擴(kuò)展能力:可以靈活的新增或者是減少副本的數(shù)量,當(dāng)然也可以自動(dòng)控制。
- 數(shù)據(jù)加密:使用 secret 可以保存一些敏感的配置或者文件。
k8s 有著哪些對(duì)象
這個(gè)就是考察我們對(duì) k8s 是否是熟悉了,常用的有:
- Pod
- Service
- ReplicationController
- DaemonSet
- namespace
- ConfigMap 這個(gè)其實(shí)知道沒(méi)有太多作用,主要還是得知道在不同場(chǎng)景如何使用不同的組件。
哪些字段是必須的
這個(gè)問(wèn)題我也覺(jué)得意義不大,只要寫過(guò) yaml 就會(huì)知道了,metadata, kind, apiVersion。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: app
name: app
kubectl 是什么
其實(shí)就是一個(gè) k8s 的 命令行客戶端。
當(dāng)你部署應(yīng)用的時(shí)候哪些對(duì)象用的比較多
- 第一個(gè)肯定是 deployment,這應(yīng)該是最常見(jiàn)的部署方式。
- service: 可以將流量負(fù)載到 Pod 中。
- Ingress: 如果需要從集群外訪問(wèn) Pod 就得需要 Ingress 然后 配合域名訪問(wèn)。
為什么沒(méi)有 k get containers 這個(gè)命令
這個(gè)問(wèn)題主要是看對(duì) Pod 的理解,因?yàn)樵?nbsp;k8s 中 Pod 就是最小的單位了,如果想要訪問(wèn)容器可以在 Pod 中訪問(wèn)。
我們可以加上 -c 參數(shù)進(jìn)入具體的容器。
kubectl exec -it app -c istio-proxy
你認(rèn)為使用使用 k8s 的最佳實(shí)踐是什么
這個(gè)主要是看日常使用時(shí)有沒(méi)有遇到什么坑了:
- 第一個(gè)就是要驗(yàn)證 yaml 內(nèi)容是否正確,這個(gè)確實(shí)很重要,一旦執(zhí)行錯(cuò)了后果很嚴(yán)重,比如使用 helm 的時(shí)候最好豈容 dry-run 和 debug,先看看生成的 yaml 是否是預(yù)期想要的。
helm upgrade app --dry-run --debug
- 第二個(gè)限制資源的使用,比如 CPU 和 內(nèi)存,這個(gè)也很重要,如果不設(shè)置一旦應(yīng)用出現(xiàn) bug 可能導(dǎo)致整個(gè) k8s 集群都受到影響。
- 為 Pod,deployment 指定標(biāo)簽,用于分組。
# 資源限制
resources:
limits:
cpu: 200m
memory: 200Mi
requests:
cpu: 100m
memory: 100Mi
參考來(lái)源:https://github.com/bregman-arie/devops-exercises/blob/master/topics/kubernetes/README.md#kubernetes-101。