k8s docker 戰略轉移

2022-07-21 01:51:13 字數 4437 閱讀 8069

1、kubernetes 與 docker 有什麼關係?

眾所周知,docker 提供容器的生命週期管理和 docker 映象構建執行時容器。但是,由於這些單獨的容器有時必須跨主機通訊,這時我們需要使用 kubernetes 來解決這個問題。

因此,我們說 docker 構建容器,但這些容器通過 kubernetes 來進行跨主機相互通訊。我們還可以使用 kubernetes 手動關聯和編排在多個主機上執行的容器。

2、k8s 建立乙個pod的詳細流程,涉及的元件怎麼通訊的?

k8s 建立乙個 pod 的詳細流程如下: 

(1) 客戶端提交建立請求,可以通過 api-server 提供的 restful 介面,或者是通過 kubectl 命令列工具,支援的資料型別包括 json 和 yaml。 client ---create pod---> apiserver

(2) api-server 處理使用者請求,將 pod 資訊儲存至 etcd 中。 apiserver ------> etcd

(3) kube-scheduler 通過 api-server 提供的介面監控到未繫結的 pod,嘗試為pod分配node節點,主要分為兩個階段,預選階段和優選階段,其中預選階段是遍歷所有的node節點,根據策略篩選出候選節點,而優選階段是在第一步的基礎上,為每乙個候選節點進行打分,分數最高者勝出。

apiserver-----監聽到未繫結的pod,然後交給scheduler分配node-----> scheduler

apiserver

(4) 選擇分數最高的節點,進行 pod binding 操作,並將結果儲存至 etcd 中。

3.kubelet 監控 node 節點資源使用是通過什麼元件來實現的?

這道題主要考察 cadvisor 元件

開源軟體 cadvisor 是用於監控容器執行狀態的利器之一,在 kubernetes 系統中,cadvisor 已被預設整合到 kubelet 元件內,當 kubelet 服務啟動時,它會自動啟動 cadvisor 服務,然後 cadvisor 會實時採集所在節點的效能指標及在節點上執行的容器的效能指標。kubelet 的啟動引數 --cadvisor-port 可自定義 cadvisor 對外提供服務的埠號,預設是 4194。

4、什麼是 heapster?

heapster 是由每個節點上執行的 kubelet 提供的集群範圍的資料聚合器。

此容器管理工具在 kubernetes 集群上本機支援,並作為 pod 執行,就像集群中的任何其他 pod 一樣。因此,它基本上可以發現集群中的所有節點,並通過本機上 kubernetes **查詢集群中 kubernetes 節點的使用資訊。

5、 容器和主機部署應用的區別是什麼?

容器的中心思想就是秒級啟動;一次封裝、到處執行;這是主機部署應用無法達到的效果,但同時也更應該注重容器的資料持久化問題。

另外,容器部署可以將各個服務進行隔離,互不影響,這也是容器的另乙個核心概念。

6、請你說一下kubenetes針對pod資源物件的健康監測機制?

k8s中對於pod資源物件的健康狀態檢測,提供了三類probe(探針)來執行對pod的健康監測:

1) livenessprobe探針

可以根據使用者自定義規則來判定pod是否健康,如果livenessprobe探針探測到容器不健康,則kubelet會根據其重啟策略來決定是否重啟,如果乙個容器不包含livenessprobe探針,則kubelet會認為容器的livenessprobe探針的返回值永遠成功。

2) readinessprobe探針

同樣是可以根據使用者自定義規則來判斷pod是否健康,如果探測失敗,控制器會將此pod從對應service的endpoint列表中移除,從此不再將任何請求排程到此pod上,直到下次探測成功。

3) startupprobe探針

啟動檢查機制,應用一些啟動緩慢的業務,避免業務長時間啟動而被上面兩類探針kill掉,這個問題也可以換另一種方式解決,就是定義上面兩類探針機制時,初始化時間定義的長一些即可。

上面兩種探針都支援以下三種探測方法:

1)exec:通過執行命令的方式來檢查服務是否正常,比如使用cat命令檢視pod中的某個重要配置檔案是否存在,若存在,則表示pod健康。反之異常。

exec探測方式的yaml檔案語法如下:

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的探測機制

exec: #執行以下命令

command:

- cat

- /tmp/healthy

initialdelayseconds: 5 #在容器執行五秒後開始探測

periodseconds: 5 #每次探測的時間間隔為5秒

在上面的配置檔案中,探測機制為在容器執行5秒後,每隔五秒探測一次,如果cat命令返回的值為「0」,則表示健康,如果為非0,則表示異常。

2)httpget:通過傳送http/htps請求檢查服務是否正常,返回的狀態碼為200-399則表示容器健康(注http get類似於命令curl -i)。

httpget探測方式的yaml檔案語法如下:

spec:

containers:

- name: liveness

image: k8s.gcr.io/liveness

livenessprobe: #採用livenessprobe機制探測

httpget: #採用httpget的方式

scheme:http #指定協議,也支援https

path: /healthz #檢測是否可以訪問到網頁根目錄下的healthz網頁檔案

port: 8080 #監聽埠是8080

initialdelayseconds: 3 #容器執行3秒後開始探測

periodseconds: 3 #探測頻率為3秒

上述配置檔案中,探測方式為項容器傳送http get請求,請求的是8080埠下的healthz檔案,返回任何大於或等於200且小於400的狀態碼表示成功。任何其他**表示異常。

3)tcpsocket:通過容器的ip和port執行tcp檢查,如果能夠建立tcp連線,則表明容器健康,這種方式與httpget的探測機制有些類似,tcpsocket健康檢查適用於tcp業務。

tcpsocket探測方式的yaml檔案語法如下:

spec:

containers:

- name: goproxy

image: k8s.gcr.io/goproxy:0.1

ports:

- containerport: 8080

#這裡兩種探測機制都用上了,都是為了和容器的8080埠建立tcp連線

readinessprobe:

tcpsocket:

port: 8080

initialdelayseconds: 5

periodseconds: 10

livenessprobe:

tcpsocket:

port: 8080

initialdelayseconds: 15

periodseconds: 20

在上述的yaml配置檔案中,兩類探針都使用了,在容器啟動5秒後,kubelet將傳送第乙個readinessprobe探針,這將連線容器的8080埠,如果探測成功,則該pod為健康,十秒後,kubelet將進行第二次連線。

除了readinessprobe探針外,在容器啟動15秒後,kubelet將傳送第乙個livenessprobe探針,仍然嘗試連線容器的8080埠,如果連線失敗,則重啟容器。

探針探測的結果無外乎以下三者之一:

success:container通過了檢查;

failure:container沒有通過檢查;

unknown:沒有執行檢查,因此不採取任何措施(通常是我們沒有定義探針檢測,預設為成功)。

若覺得上面還不夠透徹,可以移步其官網文件:

k8s docker命令總結

k8s建立資源命令 kubectl create f yaml k8s刪除資源命令 kubectl delete f yaml k8s檢視容器命令 kubectl get pods o wide docker檢視當前執行容器命令 docker ps,加 a引數可檢視所有 docker刪除容器命令 d...

K8S 2 k8s 集群搭建

kubeadm是官方社群推出的乙個用於快速部署kubernetes集群的工具。這個工具能通過兩條指令完成乙個kubernetes集群的部署 建立乙個 master 節點 kubeadm init 將乙個 node 節點加入到當前集群中 kubeadm join 在開始之前,部署 kubernetes...

K8s部署prometheus監控K8s細節

prometheus 一些配置檔案可以再github上找到。部署 root kube prometheus manifests 目錄下所有檔案 部署 root kube prometheus manifests setup 目錄下所有檔案 要注意的是自己要建立乙個工作空間 如果報錯執行下面語句 部署...