K8s常見面試題19問
收集了一些K8s常見問題和同學(xué)們面試常被問到的問題.
如果有新的面試題私聊或者留言給我
1. Docker和虛擬機(jī)有那些不同
虛擬化環(huán)境下每個 VM 是一臺完整的計算機(jī),在虛擬化硬件之上運(yùn)行所有組件,包括其自己的操作系統(tǒng)。
容器之間可以共享操作系統(tǒng),比起 VM 被認(rèn)為是更輕量級.且與 VM 類似,每個容器都具有自己的文件系統(tǒng)、CPU、內(nèi)存、進(jìn)程空間.
容器與虛擬化比有以下優(yōu)點(diǎn):
- 敏捷應(yīng)用程序的創(chuàng)建和部署:與使用 VM 鏡像相比,提高了容器鏡像創(chuàng)建的簡便性和效率。
- 持續(xù)開發(fā)、集成和部署:通過快速簡單的回滾(由于鏡像不可變性), 提供可靠且頻繁的容器鏡像構(gòu)建和部署。
- 關(guān)注開發(fā)與運(yùn)維的分離:在構(gòu)建、發(fā)布時創(chuàng)建應(yīng)用程序容器鏡像,而不是在部署時, 從而將應(yīng)用程序與基礎(chǔ)架構(gòu)分離。
- 可觀察性:不僅可以顯示 OS 級別的信息和指標(biāo),還可以顯示應(yīng)用程序的運(yùn)行狀況和其他指標(biāo)信號。
- 跨開發(fā)、測試和生產(chǎn)的環(huán)境一致性:在筆記本計算機(jī)上也可以和在云中運(yùn)行一樣的應(yīng)用程序。
- 跨云和操作系統(tǒng)發(fā)行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方運(yùn)行。
- 以應(yīng)用程序?yàn)橹行牡墓芾恚禾岣叱橄蠹墑e,從在虛擬硬件上運(yùn)行 OS 到使用邏輯資源在 OS 上運(yùn)行應(yīng)用程序。
- 松散耦合、分布式、彈性、解放的微服務(wù):應(yīng)用程序被分解成較小的獨(dú)立部分, 并且可以動態(tài)部署和管理 - 而不是在一臺大型單機(jī)上整體運(yùn)行。
- 資源隔離:可預(yù)測的應(yīng)用程序性能。
- 資源利用:高效率和高密度。
2. 簡述K8s和Docker關(guān)系
Docker是一個開源的應(yīng)用容器引擎.通過Dockerfile中的配置,將應(yīng)用,配置與依賴打包成一個鏡像,通過鏡像實(shí)現(xiàn)應(yīng)用的部署.
K8s是開源的容器集群管理系統(tǒng),可以實(shí)現(xiàn)容器集群的自動化部署,自動擴(kuò)縮容,維護(hù)等功能.
K8s是一個可移植、可擴(kuò)展的開源平臺,用于管理容器化的工作負(fù)載和服務(wù),可促進(jìn)聲明式配置和自動化。
K8s提供了以下容器不具備的功能:
- 服務(wù)發(fā)現(xiàn)和負(fù)載均衡
- 存儲編排
- 自動部署和回滾
- 自動完成裝箱計算
- 自我修復(fù)
- 密鑰與配置管理
3. 簡述Kube-proxy ipvs和iptables的異同
ipvs和iptables都是基于Netfilter實(shí)現(xiàn).
iptables是為防火墻設(shè)計的它采用規(guī)則表實(shí)現(xiàn),service數(shù)量越多iptables的規(guī)則條目越多,而iptables是從上到下逐一匹配,就會導(dǎo)致效率低下.
ipvs采用hash表實(shí)現(xiàn),當(dāng)service數(shù)量達(dá)到一定規(guī)模時,hash查表的速度優(yōu)勢會顯現(xiàn)出來,從而提高service的服務(wù)性能.
iptables的優(yōu)點(diǎn):
- 靈活
- 功能強(qiáng)大(根據(jù)tcp連接狀態(tài)對包進(jìn)行控制)
- 默認(rèn)安裝,老版本兼容
ipvs的優(yōu)點(diǎn):
- 支持hash轉(zhuǎn)發(fā)效率高
- 支持backend健康檢測
- 調(diào)度算法豐富(靜態(tài)算法:輪詢rr,加強(qiáng)輪詢wrr,目的地址dh,源地址sh,動態(tài)算法:最少連接lc,加權(quán)最少連接wlc,局部最少連接數(shù)LBLC,帶復(fù)制的局部最少連接數(shù)LBLCR,最短延遲NQ,加權(quán)最少連接增強(qiáng)版SED…)
- 可以動態(tài)設(shè)置ipset集合
4. 簡述kube-proxy切換ipvs負(fù)載的方法
步驟如下:
- 安裝ipvs
- 將kube-proxy模式改為ipvs
- 重啟kube-proxy
- 確認(rèn)切換完成
具體步驟如下:
- 查看是否使用了ipvs
[ $(ipvsadm -Ln|wc -l) -gt 1 ] && echo "有ipvs"||echo "沒ipvs"
- 載入ipvs模塊
# ubuntu
for i in `ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs/|sed -E 's/(.*)\.ko/\1/g'`;do /sbin/modprobe $i;done
# centos/redhat
for i in `ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs/|sed -E 's/(.*)\.ko\.xz/\1/g'`;do /sbin/modprobe $i;done
確認(rèn)加載完成
# lsmod |grep ip_vs
ip_vs_wlc 16384 0
ip_vs_sed 16384 0
ip_vs_pe_sip 16384 0
nf_conntrack_sip 36864 1 ip_vs_pe_sip
ip_vs_ovf 16384 0
ip_vs_nq 16384 0
ip_vs_mh 16384 0
ip_vs_lc 16384 0
ip_vs_lblcr 16384 0
ip_vs_lblc 16384 0
ip_vs_ftp 16384 0
ip_vs_fo 16384 0
ip_vs_dh 16384 0
ip_vs_sh 16384 0
ip_vs_wrr 16384 0
ip_vs_rr 16384 121
ip_vs 155648 176 ip_vs_wlc,ip_vs_rr,ip_vs_dh,ip_vs_lblcr,ip_vs_sh,ip_vs_ovf,ip_vs_fo,ip_vs_nq,ip_vs_lblc,ip_vs_pe_sip,ip_vs_wrr,ip_vs_lc,ip_vs_mh,ip_vs_sed,ip_vs_ftp
nf_nat 45056 4 ip6table_nat,iptable_nat,xt_MASQUERADE,ip_vs_ftp
nf_conntrack 139264 7 xt_conntrack,nf_nat,nf_conntrack_sip,nf_conntrack_netlink,xt_CT,xt_MASQUERADE,ip_vs
nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs
libcrc32c 16384 6 nf_conntrack,nf_nat,btrfs,xfs,raid456,ip_vs
- 修改kube-proxy模式
執(zhí)行命令
kubectl edit cm kube-proxy -n kube-system
修改配置
# 將原來的mode: ""修改為下行
mode: ipvs
- 重啟kube-proxy容器
kubectl rollout -n kube-system restart daemonset kube-proxy
- 確認(rèn)是否切換完成
kubectl logs -n kube-system $(kubectl get pods -n kube-system |grep kube-proxy |tail -1 |awk '{print $1}')|grep ipvs
5. 簡述微服務(wù)部署中的藍(lán)綠發(fā)布
常見發(fā)布有:藍(lán)綠發(fā)布,金絲雀發(fā)布,滾動發(fā)布
藍(lán)綠發(fā)布主要用作測試環(huán)境,正式環(huán)境多使用金絲雀或滾動發(fā)布
藍(lán)綠部署(Blue/Green Deployment)一共有2套系統(tǒng).一套是正在提供服務(wù)的系統(tǒng),標(biāo)記為"綠色";另一套是準(zhǔn)備發(fā)布的系統(tǒng),標(biāo)記為"藍(lán)色".兩套系統(tǒng)都是功能完善的,正在運(yùn)行的系統(tǒng),只是系統(tǒng)版本和對外提供服務(wù)的情況不同.
藍(lán)色系統(tǒng)用來做發(fā)布前測試,測試發(fā)現(xiàn)問題直接在藍(lán)色系統(tǒng)上進(jìn)行修改,不干擾用戶正在使用的綠色系統(tǒng).
藍(lán)色系統(tǒng)經(jīng)過反復(fù)的測試,修改,驗(yàn)證,確定達(dá)到上線標(biāo)準(zhǔn)后,直接將用戶切換到藍(lán)色系統(tǒng).
優(yōu)點(diǎn):
- 升級切換與回退速度快
- 版本切換時無需停機(jī),風(fēng)險最小
不足之處:
- 它是一個全量切換.無法切分流量
- 需要2倍的資源
- 如果藍(lán)色版本有問題,對用戶體驗(yàn)有影響
6. 什么是灰度發(fā)布
灰度發(fā)布:也被叫作金絲雀發(fā)布。灰度發(fā)布屬于增量發(fā)布方法。也就是說,服務(wù)升級的過程中,新舊版本會同時為用戶提供服務(wù)。
先將一小部分用戶流量切換到新版本上,測試版本性能與功能.確認(rèn)沒有問題后在對整個集群進(jìn)行升級.灰度發(fā)布就是把部署好的服務(wù)分批次,逐步暴露給越來越多的用戶,最終完成版本切替上線.
優(yōu)點(diǎn)
- 靈活,粒度細(xì)
- 無需(少量)侵入代碼
- 用戶無感知,平滑過渡
不足:
- 對自動化要求較高
部署過程:
- 從LB拆除灰度服務(wù)器,升級后再加入
- 少量用戶切換到新版本進(jìn)行測試
- 如果沒問題,調(diào)整灰度服務(wù)器數(shù)量,重復(fù)步驟2將更多的用戶流量切換到新版本.直至所有用戶流量完成切換.
7. 什么是滾動發(fā)布
k8sdeployment是滾動發(fā)布.按批次依次替換老版本(maxSurge默認(rèn)25%),逐步升級到新版本.發(fā)布過程中應(yīng)用不中斷,用戶體驗(yàn)平滑.
8. 簡述Kubernetes靜態(tài)Pod
靜態(tài)Pod由kubelet創(chuàng)建并且總是在kubelet所在節(jié)點(diǎn)上運(yùn)行.
它們不能通過API Server進(jìn)行管理,無法與==ReplicationController
,Deployment
,Daemonset
==進(jìn)行關(guān)聯(lián),它就是一個Pod,并且kubelet也無法對其健康檢查
創(chuàng)建靜態(tài)Pod有兩種方式:配置文件方式
和HTTP方式
。
配置文件方式: 通過在manifests目錄下創(chuàng)建yaml,由kubelet定期掃描自動創(chuàng)建Pod資源
HTTP方式:kubelet啟動參數(shù)–manifest-url,kubelet定期訪問此url,下載Pod定義文件,以yaml或json格式進(jìn)行解析,并創(chuàng)建Pod.
kubeadm安裝集群配置文件路徑:/var/lib/kubelet/config.yaml中staticPodPath: /etc/kubernetes/manifests
二進(jìn)制安裝配置文件路徑:由/usr/lib/systemd/system/kubelet.service的–pod-manifest-path=值定義
etcd,kube-apiserver,kube-controller-manager,kube-scheduler都是靜態(tài)Pod
如果需要創(chuàng)建自己的靜態(tài)pod,直接將yaml放置在 /etc/kubernetes/manifests 目錄下即可
配置文件方式創(chuàng)建:
/etc/kubernetes/manifests/static-web.yaml
文件內(nèi)容如下
apiVersion: v1
kind: Pod
metadata:
name: static-web
labels:
role: myrole
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
protocol: TCP
當(dāng)文件被創(chuàng)建后該pod就會被kubelet自動創(chuàng)建,且當(dāng)停止該容器后馬上會被自動再次創(chuàng)建.
root@ks-master:~# kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 58 22d
nfs-client-provisioner-68c8fcd77-hg8hl 1/1 Running 15 23d
static-web-ks-master 1/1 Running 0 7m54s
root@ks-master:~# docker ps|head -2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fe2aab2799e1 nginx "/docker-entrypoint.…" 7 minutes ago Up 7 minutes k8s_web_static-web-ks-master_default_b2f5f5f4465db575a93c8173ea740eed_0
root@ks-master:~# docker stop fe2aab2799e1
fe2aab2799e1
root@ks-master:~# docker ps|head -2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d514ae256d77 nginx "/docker-entrypoint.…" 1 second ago Up Less than a second k8s_web_static-web-ks-master_default_b2f5f5f4465db575a93c8173ea740eed_1
想要刪除把配置文件刪除即可
9. 簡述K8s存儲卷有哪些,說明它們的特征和用途
- emptyDir: Pod調(diào)度到節(jié)點(diǎn)創(chuàng)建的臨時空目錄,Pod刪除隨之刪除,用于容器存放臨時文件
- hostPath: 節(jié)點(diǎn)存儲卷,將宿主機(jī)的文件或目錄掛載到Pod
- Pv/Pvc: 外部存儲掛載到Pod,生命周期獨(dú)立于Pod,具有持久性
- StorageClass: 充當(dāng)PV模板,從而可以動態(tài)創(chuàng)建PV,自動構(gòu)建相應(yīng)的持久化數(shù)據(jù)存儲
- configmap: 明文,熱更新,支持多個pod共享,避免重復(fù)修改.
- secret: 密文
10. 簡述Dockerfile中copy和add的異同
Copy: 將宿主機(jī)的文件復(fù)制到容器內(nèi)
Add: 除了復(fù)制功能以外,還帶有解壓縮功能.支持url
copy后解壓,需要先確認(rèn)容器內(nèi)有解壓所需的命令.當(dāng)對容器鏡像大小要求比較苛刻時add顯然更好.使用空鏡像scratch時特別明顯
常見較小的鏡像有:
鏡像版本 | 大小 |
---|---|
Alpine | 7.05 MB |
Busybox | 4.86MB |
Debian:stable | 124 MB |
Ubuntu:18.04 | 63.1 MB |
CentOS:7.9.2009 | 204 MB |
11. 簡述Dockerfile中CMD 和ENDPOINTS區(qū)別
CMD: 指定啟動容器時執(zhí)行的命令,每個 Dockerfile只能有一條 CMD 命令。如果指定了多條命令,只有最后一條會被執(zhí)行。如果用戶啟動容器時候指定了運(yùn)行的命令,則會覆蓋掉 CMD 指定的命令。
Endpoint:配置容器啟動后執(zhí)行的命令,并且不可被 docker run 提供的參數(shù)覆蓋。每個 Dockerfile 中只能有一個 ENTRYPOINT,當(dāng)指定多個時,只有最后一個起效。
兩者區(qū)別:
1、CMD指令指定的容器啟動時命令可以被docker run指定的命令覆蓋ENTRYPOINT指令指定的命令不能被覆蓋,而是將docker run指定的參數(shù)當(dāng)做ENTRYPOINT指定命令的參數(shù)。
2、CMD與ENTRYPOINT同時存在時,CMD指令可以為ENTRYPOINT指令設(shè)置默認(rèn)參數(shù),而且CMD可以被docker run指定的參數(shù)覆蓋;
12. K8s如何添加和移除節(jié)點(diǎn)
12.1 移除節(jié)點(diǎn)
12.1.1 設(shè)置節(jié)點(diǎn)為不可調(diào)度
kubectl cordon k8s-node2
12.1.2 驅(qū)逐節(jié)點(diǎn)上的Pod
kubectl drain ks-node2 --ignore-daemonsets --delete-local-data --force
12.1.3 刪除節(jié)點(diǎn)
kubectl delete node k8s-node2
12.1.4 清空節(jié)點(diǎn)上數(shù)據(jù)
kubeadm reset -f
systemctl disable --now kubelet
systemctl disable --now docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/
rm -rf /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
ipvsadm -C
12.2 添加節(jié)點(diǎn)
12.2.1 kubesphere
./kk add nodes -f sample.yaml
12.2.2 kubeadmin
先檢查是否有token
kubeadm token list
如果沒有,創(chuàng)建token
## 默認(rèn)24小時token
kubeadm token create --print-join-command
## 永久
kubeadm token create --print-join-command --ttl 0
在新節(jié)點(diǎn)上執(zhí)行,添加節(jié)點(diǎn)
kubeadm join 192.168.31.131:6443 --token 9q1zfx.r2wrn6kzu03qr9df --discovery-token-ca-cert-hash sha256:94ab137b5f15edd2b7f09b570372dcf6545129a362dfc332250c5e1c68df5a06
12.2.3 二進(jìn)制安裝的k8s
- 復(fù)制配置文件
scp kubelet kube-proxy bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.31.151:/data/kubernetes/cfg/
scp kubelet.service kube-proxy.service flanneld.service root@192.168.31.151:/usr/lib/systemd/system
- 復(fù)制證書
scp ca-key.pem ca.pem server-key.pem server.pem root@192.168.31.151:/data/etcd/ssl/
scp ca.pem ca-key.pem server.pem server-key.pem kube-proxy.pem kube-proxy-key.pem root@192.168.31.151:/data/kubernetes/ssl/
- 修改kubelet和kube-proxy,將地址改為本地
## kubelet
--address=192.168.31.151 \
--hostname-override=192.168.31.151 \
## kube-proxy
--hostname-override=192.168.31.151 \
- 啟動服務(wù)
systemctl start docker;systemctl enable docker
systemctl start flanneld;systemctl enable flanneld
systemctl start kubelet;systemctl enable kubelet
systemctl start kube-proxy;systemctl enable kube-proxy
- master節(jié)點(diǎn)允許加入
kubectl get csr
kubectl certificate approve node-csr-TLFAeDwUhcScypkpi-wokn7Hv5JFr34D17IJSFFClik
13. 如何將SVC的NodePort設(shè)置成40000端口
- 默認(rèn)svc NodePort范圍是30000-32767
- 修改kube-apiserver.yaml添加–service-node-port-range=30000-45000
/etc/kubernetes/manifests/kube-apiserver.yaml
## 略
- --service-node-port-range=30000-45000
修改后執(zhí)行kubectl時會有報錯
The connection to the server lb.kubesphere.local:6443 was refused - did you specify the right host or port?
刪除apiserver靜態(tài)pod(或在master節(jié)點(diǎn)刪除apiserver的容器),后恢復(fù)
kubectl delete pod -n kube-system `kubectl get pods -n kube-system --selector=component=kube-apiserver --output=jsonpath={.items..metadata.name}`
此時再創(chuàng)建40000的nodeport就不會報錯了
14. 簡述K8s常用控制器及特點(diǎn)
- Deployment 無狀態(tài)控制器,啟動順序是無序的,Pod名字和ip是隨機(jī)的,后臺存儲往往是共享的.(web網(wǎng)站)
- StatefulSet 有狀態(tài)控制器,有序啟動,Pod名字固定,后臺存儲是獨(dú)占的.(主從數(shù)據(jù)庫)
- Daemonset 每個節(jié)點(diǎn)都部署.(日志采集和監(jiān)控)
- CronJob 定時運(yùn)行Pod
- Job 一次性運(yùn)行Pod
15. K8s無法拉伸和收縮副本可能的原因
手動拉伸或者收縮
kubectl scale deployment nginx --replicas=2
生產(chǎn)中常用HPA實(shí)現(xiàn)Deployment的自動伸縮
- 命令行
## 設(shè)置deployment中容器的cpu和內(nèi)存
kubectl set resources deployment nginx --limits=cpu=200m,memory=512Mi
## 設(shè)置autoscal
kubectl autoscale deployment nginx --min=4 --max=8 --cpu-percent=80
## 查看autoscal
kubectl get hpa
- yaml方式
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: hpa-nginx
spec:
maxReplicas: 8
minReplicas: 4
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
targetCPUUtilizationPercentage: 80
- 當(dāng)手動伸縮值與HPA的最小值沖突時,收縮不生效
- 當(dāng)手動伸縮值與HPA的最大值沖突時,擴(kuò)展不生效
- 當(dāng)對deployment有requests參數(shù)時,當(dāng)(namespace或節(jié)點(diǎn))可用資源不滿足時,擴(kuò)展失效.
16. Node容忍節(jié)點(diǎn)異常事件如何設(shè)置
node節(jié)點(diǎn)異常故障觸發(fā)遷移默認(rèn)時間是300秒.
tolerationSeconds: 300
也就是node節(jié)點(diǎn)故障了,但Pod任然為健康狀態(tài),此時用戶訪問就會造成異常
因此服務(wù)中斷時間=停機(jī)等待時間300秒+Pod重建時間+服務(wù)啟動時間+readiness探針檢測正常時間.
可以使用以下方法縮短收斂時間
- 將容忍時間從300秒改為100秒,但不能過短,一旦網(wǎng)絡(luò)延遲或抖動造成頻繁切換
編寫yaml nginx-patch.yaml
spec:
template:
spec:
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 100
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 100
以補(bǔ)丁的方式打入deployment中
kubectl patch deployment nginx-deployment --patch "$(cat nginx-patch.yaml)"
此時所有pod會被重建
root@ks-master:~# kubectl patch deployment nginx-deployment --patch "$(cat nginx-patch.yaml)"
deployment.apps/nginx-deployment patched
root@ks-master:~# kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 63 22d
nfs-client-provisioner-68c8fcd77-hg8hl 1/1 Running 19 23d
nginx-deployment-78cd64ff75-f6d87 1/1 Terminating 1 110m
nginx-deployment-78cd64ff75-g8nv4 1/1 Terminating 1 68m
nginx-deployment-78cd64ff75-h7swc 1/1 Terminating 1 68m
nginx-deployment-78cd64ff75-lx4ps 1/1 Terminating 1 110m
nginx-deployment-78cd64ff75-md2rv 1/1 Terminating 1 68m
nginx-deployment-78cd64ff75-n2z4t 1/1 Terminating 1 68m
nginx-deployment-78cd64ff75-rzs9h 1/1 Terminating 1 68m
nginx-deployment-78cd64ff75-w9rs9 1/1 Terminating 1 68m
nginx-deployment-7957b6f749-2n8jf 1/1 Running 0 18s
nginx-deployment-7957b6f749-2vcct 1/1 Running 0 19s
nginx-deployment-7957b6f749-42px5 1/1 Running 0 16s
nginx-deployment-7957b6f749-cqfsk 1/1 Running 0 16s
nginx-deployment-7957b6f749-dsqpl 1/1 Running 0 18s
nginx-deployment-7957b6f749-hmfbd 1/1 Running 0 16s
nginx-deployment-7957b6f749-nv28k 1/1 Running 0 15s
nginx-deployment-7957b6f749-wzwvg 1/1 Running 0 18s
static-web-ks-master 1/1 Running 1 5h45m
此時not-ready和unreachable的時間都變成了100秒
root@ks-master:~# kubectl describe pod nginx-deployment-7957b6f749-2n8jf |grep 100
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 100s
node.kubernetes.io/unreachable:NoExecute op=Exists for 100s
- kube-proxy負(fù)載方式由iptables改為ipvs
詳見4
17. 簡述Deployment控制器的升級和回滾
nginx-blue.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
revisionHistoryLimit: 5 # 記錄多少個版本用來回滾
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: harbor.intra.com/nginx/nginx-blue:v1
ports:
- containerPort: 80
部署生效
kubectl apply -f nginx-blue.yaml --record
訪問測試
# curl 12.233.106.215
web-app1-blue version 2.0.0
部署green版本
cp nginx-blue.yaml nginx-green.yaml
sed -i 's/blue/green/g' nginx-green.yaml
kubectl apply -f nginx-green.yaml --record
# curl 12.233.106.223
web-app1-green version 1.0.0
查看版本
# kubectl rollout history deployment nginx-deployment
1 kubectl apply --filename=nginx-blue.yaml --record=true
2 kubectl apply --filename=nginx-green.yaml --record=true
回滾到blue版本
kubectl rollout undo deployment nginx-deployment --to-revision=1
# curl 12.233.106.224
web-app1-blue version 2.0.0
查看版本
# kubectl rollout history deployment nginx-deployment
2 kubectl apply --filename=nginx-green.yaml --record=true
3 kubectl apply --filename=nginx-blue.yaml --record=true
18. kubectl自動補(bǔ)全
- 安裝依賴包
# Centos
yum install bash-completion
# ubuntu
apt install bash-completion
- 修改~/.bashrc
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc
19. 生產(chǎn)環(huán)境中如何阻止內(nèi)核及其他軟件更新版本
19.1 Ubuntu環(huán)境
- 查看當(dāng)前內(nèi)核
root@ks-master:~# uname -r
5.4.0-148-generic
root@ks-master:~# dpkg --get-selections|grep -E 'linux-image-5.4.0-148-generic|linux-headers-5.4.0-148-generic'
linux-headers-5.4.0-148-generic install
linux-image-5.4.0-148-generic install
- 禁止這2個軟件包更新
root@ks-master:~# apt-mark hold linux-headers-5.4.0-148-generic linux-image-5.4.0-148-generic
linux-headers-5.4.0-148-generic set on hold.
linux-image-5.4.0-148-generic set on hold.
再次查看可以看到這2個都已經(jīng)被鎖定了
root@ks-master:~# dpkg --get-selections|grep -E 'linux-image-5.4.0-148-generic|linux-headers-5.4.0-148-generic'
linux-headers-5.4.0-148-generic hold
linux-image-5.4.0-148-generic hold
root@ks-master:~# apt-mark showhold
linux-headers-5.4.0-148-generic
linux-image-5.4.0-148-generic
- 使用unhold恢復(fù)更新
root@ks-master:~# apt-mark unhold linux-headers-5.4.0-148-generic linux-image-5.4.0-148-generic
Canceled hold on linux-headers-5.4.0-148-generic.
Canceled hold on linux-image-5.4.0-148-generic.
root@ks-master:~# dpkg --get-selections|grep -E 'linux-image-5.4.0-148-generic|linux-headers-5.4.0-148-generic'
linux-headers-5.4.0-148-generic install
linux-image-5.4.0-148-generic install
root@ks-master:~# apt-mark showhold
19.2 Redhat系列
臨時生效:在執(zhí)行yum update的時候加上參數(shù)
yum update --exclude=kernel*
永久生效:在/etc/yum.conf的[main]下面追加exclude=kernel*
echo "exclude=kernel*" >> /etc/yum.conf
20. 簡述Dockerfile中ENV和ARG的區(qū)別
相同:
? 兩個都是Dockerfile中的變量
? 兩者都不能被CMD和ENTRYPOINT
不同:
- 變量的生命周期
? ARG的生命周期僅是docker構(gòu)建中有效,一旦構(gòu)建完ARG的值失效.
? ENV的不僅構(gòu)建時有效,當(dāng)使用此鏡像再次構(gòu)建或者使用此鏡像生成容器,ENV的值任有效.文章來源:http://www.zghlxwxcb.cn/news/detail-505750.html
- 變量值的傳遞參數(shù)
? ARG構(gòu)建時通過–build-arg參數(shù)將變量傳給Dockerfile
? ENV在docker run 命令中通過 -e標(biāo)記來傳遞環(huán)境變量文章來源地址http://www.zghlxwxcb.cn/news/detail-505750.html
到了這里,關(guān)于K8s常見面試題20問的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!