1. 宿主機(jī)如何與容器通信
-
Bridge模式次企,即使用docker0網(wǎng)橋
默認(rèn)
- 創(chuàng)建獨(dú)立的Network Namespace
- 創(chuàng)建容器時會虛擬出網(wǎng)卡創(chuàng)建一對虛擬網(wǎng)卡
veth pair
設(shè)備剃法,一端連在容器里(eth0
網(wǎng)卡),另一端接在docker0
網(wǎng)橋 - docker run 通過參數(shù)
-p 宿主機(jī)端口:容器端口
進(jìn)行端口映射。本質(zhì)上是對iptables
做了DNAT
規(guī)則兑凿,實(shí)現(xiàn)端口轉(zhuǎn)發(fā)功能剩蟀,可通過iptables -t nat -vnL
查看 - 同個網(wǎng)橋上的可以直接訪問
- 不同網(wǎng)橋上,容器A的流量先通過網(wǎng)橋A到宿主機(jī)荔仁,再通過網(wǎng)橋B到要訪問的容器B
- 優(yōu)點(diǎn):隔離性好
- 缺點(diǎn):相比較Host模式,網(wǎng)絡(luò)性能略低(多了層路由轉(zhuǎn)發(fā))
-
Host模式芽死,即使用宿主機(jī)網(wǎng)絡(luò)
-net=host
與宿主機(jī)共用一個Network Namespace
- 優(yōu)點(diǎn):網(wǎng)絡(luò)性能好
- 缺點(diǎn):會引入共享網(wǎng)絡(luò)資源問題乏梁,比如端口沖突
-
Container模式
新創(chuàng)建的容器和已有的容器共享一個Network Namespace
,而不是和宿主機(jī)共享 -
None模式
會創(chuàng)建Network Namespace关贵,但是不會進(jìn)行任何網(wǎng)絡(luò)配置(即沒有網(wǎng)卡遇骑、路由、ip等信息)揖曾,需要手動添加
2. pod創(chuàng)建流程
- 客戶端提交創(chuàng)建請求落萎,
API Server
的RESTful API
或kubectl
-
API Server
處理用戶請求,存儲pod數(shù)據(jù)到etcd -
kube-scheduler
通過API Server watch API
一直監(jiān)聽未綁定的pod炭剪,嘗試為pod分配主機(jī)
- 過濾節(jié)點(diǎn)(調(diào)度預(yù)選):
kube-scheduler
用一組郭澤過濾掉不符合要求的主機(jī)练链。比如說pod制定了所需要的資源量,那可用資源不夠的會被過濾掉 - 節(jié)點(diǎn)打分(調(diào)度優(yōu)選):對預(yù)選的節(jié)點(diǎn)進(jìn)行打分奴拦,(考慮一些整體優(yōu)化策略:pod分散媒鼓,使用最低負(fù)載的節(jié)點(diǎn)等)
- 選擇節(jié)點(diǎn):選擇打分最高的節(jié)點(diǎn),進(jìn)行binding操作错妖,結(jié)果存儲到etcd中(調(diào)用API Server創(chuàng)建一個boundpod對象绿鸣,描述在一個工作節(jié)點(diǎn)上綁定運(yùn)行的所有pod信息)
- 目標(biāo)節(jié)點(diǎn)上的
kubelet
通過API Server watch API
定期獲取boundpod對象,發(fā)現(xiàn)需要創(chuàng)建pod了暂氯,則調(diào)用Docker API
創(chuàng)建并啟動pod -
kubelet
通過CRI(Container Runtime Interface
)獲取pod狀態(tài)潮模,傳給API Server,數(shù)據(jù)被更新到etcd中
3. etcd存儲的是什么數(shù)據(jù)
etcd是一個高可用的分布式鍵值(key-value)數(shù)據(jù)庫
etcd內(nèi)部采用raft協(xié)議作為一致性算法
etcd至于go實(shí)現(xiàn)
服務(wù)注冊和服務(wù)發(fā)現(xiàn)
保存了集群所有的網(wǎng)絡(luò)配置和API Server對象的狀態(tài)信息
4. 怎么查看etcd數(shù)據(jù)
exec進(jìn)到pod株旷,使用etcdctl
命令
$ ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
--key=/etc/kubernetes/pki/etcd/healthcheck-client.key \
get / --prefix --keys-only
5. etcd怎么做數(shù)據(jù)備份和數(shù)據(jù)恢復(fù)
直接備份數(shù)據(jù)目錄(用于單節(jié)點(diǎn))
etcd組件的數(shù)據(jù)目錄默認(rèn)位于/var/lib/etcd
里使用快照命令備份(可用于集群)
// 備份
$ etcdctl --endpoints=127.0.0.1:2380,ip:port snapshot save backupName.db
// 恢復(fù)
$ etcdctl snapshot restore backupName.db --data-dir=/var/lib/etcd
6. pod的狀態(tài)是怎么監(jiān)控的再登,怎么做到改變pod狀態(tài)的
可能是CRI(Container Runtime Interface
)
7.怎么修改docker容器資源?修改后容器重啟嗎晾剖?那修改pod呢锉矢?
// 修改容器不重啟
$ docker update -c xxx -m xxx [container_id]
修改pod重啟,因?yàn)閗ubelet會去同步etcd的數(shù)據(jù)syncPod
8. 資源隔離的具體實(shí)現(xiàn)
使用Linux的namespace
實(shí)現(xiàn)齿尽,提供六種隔離機(jī)制:
-
UTS
: 主機(jī)名與域名 -
IPC
: 信號量沽损、消息隊(duì)列、共享內(nèi)存 -
PID
: 進(jìn)程編號 -
Network
: 網(wǎng)絡(luò)設(shè)備循头、網(wǎng)絡(luò)棧绵估、端口等 -
Mount
: 掛載點(diǎn) -
User
: 用戶和用戶組
與namespace相關(guān)的三個系統(tǒng)調(diào)用:
-
clone
創(chuàng)建全新的namespace炎疆,由clone創(chuàng)建的新進(jìn)程就位于這個新的namespace里
創(chuàng)建時傳入flags
參數(shù),可選值有CLONE_NEWIPC
国裳、CLONE_NEWNET
形入、CLONE_NEWNS
、CLONE_NEWPID
缝左、CLONE_NEWUTS
亿遂、CLONE_NEWUSER
,分別對應(yīng)上面六種namespace -
unshare
為已有進(jìn)程創(chuàng)建新的namespace -
setns
把某個進(jìn)程放在已有的某個namespace里
9. 資源限制的具體實(shí)現(xiàn)
使用Linux的Cgroup
實(shí)現(xiàn)渺杉,簡單說是把進(jìn)程放到一個組里面統(tǒng)一加以控制蛇数。
作用:可以限制、記錄是越、隔離進(jìn)程組所使用的物理資源(包括:CPU耳舅、Memory、IO 等)倚评,為容器實(shí)現(xiàn)虛擬化提供了基本保證浦徊。
原理:將一組進(jìn)程放在放在一個控制組里,通過給這個控制組分配指定的可用資源蔓纠,達(dá)到控制這一組進(jìn)程可用資源的目的辑畦。
- 資源限制
可以對任務(wù)使用的資源總額進(jìn)行限制,如設(shè)定應(yīng)用運(yùn)行時使用內(nèi)存的上限腿倚,一旦超過這個配額就發(fā)出OOM(Out of Memory)提示 - 優(yōu)先級分配
通過分配的CPU時間片數(shù)量和磁盤IO帶寬大小纯出,實(shí)際上就相當(dāng)于控制了任務(wù)運(yùn)行的優(yōu)先級 - 資源統(tǒng)計(jì)
可以統(tǒng)計(jì)系統(tǒng)的資源使用,如 CPU 使用時長敷燎、內(nèi)存用量等暂筝,這個功能非常適用于計(jì)費(fèi) - 任務(wù)控制
可以對任務(wù)執(zhí)行掛起、恢復(fù)等操作
// 可以指定cpu和內(nèi)存分配大小
$ docker run -c xxx -m xxx image:tag
10. docker現(xiàn)有運(yùn)行時缺陷
- 基于Linux 64bit硬贯,無法在32bit的Linux/Windows/Unix環(huán)境下運(yùn)行
- 網(wǎng)絡(luò)管理相對簡單焕襟,主要是基于namespace隔離
- LXC是基于cgroup等linux kernel功能的,因此container的guest系統(tǒng)只能是linux base
- container隨著用戶進(jìn)程的停止而銷毀饭豹,container中的log等用戶數(shù)據(jù)不便收集
- 太依賴namespace
11. k8s資源預(yù)留是怎么做的
// 通過該參數(shù)
kubelet --system-reserved=memory=4Gi
12. Sandbox作用
sandbox
: 沙盒
是一種安全機(jī)制鸵赖,為運(yùn)行中的容器提供隔離的環(huán)境
13. 自定義k8s controller怎么選主
**etcd鎖**
tryLock模式,每次lock都是嘗試lock拄衰,已被lock就無法鎖住它褪,同時也用了租約,過期了自動釋放
- 利用租約在etcd集群中創(chuàng)建一個key翘悉,這個key有兩種形態(tài)茫打,存在和不存在,而這兩種形態(tài)就是互斥量。
- 如果這個key不存在老赤,那么線程創(chuàng)建key轮洋,成功則獲取到鎖,該key就為存在狀態(tài)抬旺。
- 如果該key已經(jīng)存在弊予,那么線程就不能創(chuàng)建key,則獲取鎖失敗嚷狞。
14. 二層網(wǎng)絡(luò)块促,四層網(wǎng)絡(luò),overlay network
-
overlay
為了滿足云計(jì)算虛擬化的網(wǎng)絡(luò)能力需求床未,逐步演化出了Overlay網(wǎng)絡(luò)技術(shù)。
通過虛擬化技術(shù)把一個邏輯網(wǎng)絡(luò)建立在實(shí)體網(wǎng)絡(luò)之上振坚。
在傳統(tǒng)二層網(wǎng)絡(luò)環(huán)境下薇搁,數(shù)據(jù)報文是通過查詢MAC地址表進(jìn)行二層轉(zhuǎn)發(fā),而網(wǎng)絡(luò)設(shè)備MAC地址表的容量限制了虛擬機(jī)的數(shù)量渡八。
常用VXLAN - 二層網(wǎng)絡(luò):數(shù)據(jù)鏈路層(進(jìn)行數(shù)據(jù)的分包)
- 四層網(wǎng)絡(luò):傳輸層(TCP/IP協(xié)議在這里)
15. 創(chuàng)建pod怎么實(shí)現(xiàn)sidecar注入
使用init-container
配置iptables
規(guī)則來做流量劫持轉(zhuǎn)發(fā)
16. 怎么查看iptables規(guī)則
$ iptables -L
17. Pod terminating時候啃洋,ip還在嗎,還通嗎
ip在屎鳍,ping不通
18. pause容器的作用宏娄,可不可以不要?pause容器的進(jìn)程樹是怎樣的逮壁?
pause容器作為pod里其他所有容器的parent container孵坚,主要有兩個職責(zé)
- 是pod里其他容器共享Linux namespace的基礎(chǔ)
- 扮演PID 1(類似Linux的init進(jìn)程)的角色,負(fù)責(zé)處理僵尸進(jìn)程
進(jìn)程樹由pause容器開始窥淆,往下是業(yè)務(wù)容器
19. docker daemon掛了卖宠,容器是什么狀態(tài)?繼續(xù)運(yùn)行還是也掛了忧饭?
容器會掛