crictl 是 CRI 兼容的容器運(yùn)行時(shí)命令行接口,用于管理和調(diào)試 Kubernetes 節(jié)點(diǎn)上的容器運(yùn)行時(shí)和應(yīng)用程序。crictl 的源代碼托管在 cri-tools 代碼庫(kù)中,管理員可以在該代碼庫(kù)中獲取最新版本的 crictl 工具,并根據(jù)需要進(jìn)行自定義和編譯。
一、準(zhǔn)備
由于 crictl 是基于 CRI 標(biāo)準(zhǔn)開(kāi)發(fā)的工具,因此它需要在安裝有符合 CRI 標(biāo)準(zhǔn)的容器運(yùn)行時(shí)的 Linux 操作系統(tǒng)上運(yùn)行。
二、安裝crictl
可以從 cri-tools 發(fā)布頁(yè)面 下載一個(gè)壓縮的 crictl 歸檔文件,用于幾種不同的架構(gòu)。 下載與 kubernetes 版本相對(duì)應(yīng)的版本。 提取它并將其移動(dòng)到系統(tǒng)路徑上的某個(gè)位置,例如 /usr/local/bin/。
三、crictl用法
crictl 命令有幾個(gè)子命令和運(yùn)行時(shí)參數(shù)。 有關(guān)詳細(xì)信息,請(qǐng)使用 crictl help 或 crictl <subcommand> help 獲取幫助信息。
可以用以下方法之一來(lái)為 crictl 設(shè)置端點(diǎn):
- 設(shè)置參數(shù) –runtime-endpoint 和 –image-endpoint;
- 設(shè)置環(huán)境變量 CONTAINER_RUNTIME_ENDPOINT 和 IMAGE_SERVICE_ENDPOINT;
- 在配置文件 –config=/etc/crictl.yaml 中設(shè)置端點(diǎn)。 要設(shè)置不同的文件,可以在運(yùn)行 crictl 時(shí)使用 –config=PATH_TO_FILE 標(biāo)志。
注意:如果不設(shè)置端點(diǎn),crictl 將嘗試連接到已知端點(diǎn)的列表,這可能會(huì)影響性能。
還可以在連接到服務(wù)器并啟用或禁用調(diào)試時(shí)指定超時(shí)值,方法是在配置文件中指定 timeout 或 debug 值,或者使用 –timeout 和 –debug 命令行參數(shù)。
如果要查看或編輯當(dāng)前配置,請(qǐng)查看或編輯 /etc/crictl.yaml 的內(nèi)容。 例如,使用 containerd 容器運(yùn)行時(shí)的配置會(huì)類似于這樣:
runtime-endpoint: unix:///var/run/containerd/containerd.sock image-endpoint: unix:///var/run/containerd/containerd.sock timeout: 10 debug: true
四、crictl命令示例
如果使用 crictl 在正在運(yùn)行的 Kubernetes 集群上創(chuàng)建 Pod 沙盒或容器, kubelet 最終將刪除它們。 crictl 不是一個(gè)通用的工作流工具,而是一個(gè)對(duì)調(diào)試有用的工具。
1、打印 Pod 清單
打印所有 Pod 的清單:
crictl pods
輸出類似于:
POD ID??????????????CREATED??????????????STATE???????????????NAME?????????????????????????NAMESPACE???????????ATTEMPT 926f1b5a1d33a???????About?a?minute?ago???Ready???????????????sh-84d7dcf559-4r2gq??????????default?????????????0 4dccb216c4adb???????About?a?minute?ago???Ready???????????????nginx-65899c769f-wv2gp???????default?????????????0 a86316e96fa89???????17?hours?ago?????????Ready???????????????kube-proxy-gblk4?????????????kube-system?????????0 919630b8f81f1???????17?hours?ago?????????Ready???????????????nvidia-device-plugin-zgbbv???kube-system?????????0
根據(jù)名稱打印 Pod 清單:
crictl pods --name nginx-65899c769f-wv2gp
輸出類似于這樣:
POD ID??????????????CREATED?????????????STATE???????????????NAME?????????????????????NAMESPACE???????????ATTEMPT 4dccb216c4adb???????2?minutes?ago???????Ready???????????????nginx-65899c769f-wv2gp???default?????????????0
根據(jù)標(biāo)簽打印 Pod 清單:
crictl pods --label run=nginx
輸出類似于這樣:
POD ID??????????????CREATED?????????????STATE???????????????NAME?????????????????????NAMESPACE???????????ATTEMPT 4dccb216c4adb???????2?minutes?ago???????Ready???????????????nginx-65899c769f-wv2gp???default?????????????0
2、打印鏡像清單
打印所有鏡像清單:
crictl images
輸出類似于這樣:
IMAGE?????????????????????????????????????TAG?????????????????IMAGE ID????????????SIZE busybox???????????????????????????????????latest??????????????8c811b4aec35f???????1.15MB k8s-gcrio.azureedge.net/hyperkube-amd64???v1.10.3?????????????e179bbfe5d238???????665MB k8s-gcrio.azureedge.net/pause-amd64???????3.1?????????????????da86e6ba6ca19???????742kB nginx?????????????????????????????????????latest??????????????cd5239a0906a6???????109MB
根據(jù)倉(cāng)庫(kù)打印鏡像清單:
crictl images nginx
輸出類似于這樣:
IMAGE???????????????TAG?????????????????IMAGE ID????????????SIZE nginx???????????????latest??????????????cd5239a0906a6???????109MB
只打印鏡像 ID:
crictl images -q
輸出類似于這樣:
sha256:8c811b4aec35f259572d0f79207bc0678df4c736eeec50bc9fec37ed936a472a sha256:e179bbfe5d238de6069f3b03fccbecc3fb4f2019af741bfff1233c4d7b2970c5 sha256:da86e6ba6ca197bf6bc5e9d900febd906b133eaa4750e6bed647b0fbe50ed43e sha256:cd5239a0906a6ccf0562354852fae04bc5b52d72a2aff9a871ddb6bd57553569
3、打印容器清單
打印所有容器清單:
crictl ps -a
輸出類似于這樣:
CONTAINER ID????????IMAGE?????????????????????????????????????????????????????????????????????????????????????????????????????????????CREATED?????????????STATE???????????????NAME???????????????????????ATTEMPT 1f73f2d81bf98???????busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47???????????????????????????????????7?minutes?ago???????Running?????????????sh?????????????????????????1 9c5951df22c78???????busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47???????????????????????????????????8?minutes?ago???????Exited??????????????sh?????????????????????????0 87d3992f84f74???????nginx@sha256:d0a8828cccb73397acb0073bf34f4d7d8aa315263f1e7806bf8c55d8ac139d5f?????????????????????????????????????8?minutes?ago???????Running?????????????nginx??????????????????????0 1941fb4da154f???????k8s-gcrio.azureedge.net/hyperkube-amd64@sha256:00d814b1f7763f4ab5be80c58e98140dfc69df107f253d7fdd714b30a714260a???18?hours?ago????????Running?????????????kube-proxy?????????????????0
打印正在運(yùn)行的容器清單:
crictl ps
輸出類似于這樣:
CONTAINER ID????????IMAGE?????????????????????????????????????????????????????????????????????????????????????????????????????????????CREATED?????????????STATE???????????????NAME???????????????????????ATTEMPT 1f73f2d81bf98???????busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47???????????????????????????????????6?minutes?ago???????Running?????????????sh?????????????????????????1 87d3992f84f74???????nginx@sha256:d0a8828cccb73397acb0073bf34f4d7d8aa315263f1e7806bf8c55d8ac139d5f?????????????????????????????????????7?minutes?ago???????Running?????????????nginx??????????????????????0 1941fb4da154f???????k8s-gcrio.azureedge.net/hyperkube-amd64@sha256:00d814b1f7763f4ab5be80c58e98140dfc69df107f253d7fdd714b30a714260a???17?hours?ago????????Running?????????????kube-proxy?????????????????0
4、在正在運(yùn)行的容器上執(zhí)行命令
crictl exec -i -t 1f73f2d81bf98 ls
輸出類似于這樣:
bin???dev???etc???home??proc??root??sys???tmp???usr???var
5、獲取容器日志
獲取容器的所有日志:
crictl logs 87d3992f84f74
輸出類似于這樣:
10.240.0.96 - - [06/Jun/2018:02:45:49 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-" 10.240.0.96 - - [06/Jun/2018:02:45:50 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-" 10.240.0.96 - - [06/Jun/2018:02:45:51 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"
獲取最近的 N 行日志:
crictl logs --tail=1 87d3992f84f74
輸出類似于這樣:
10.240.0.96 - - [06/Jun/2018:02:45:51 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.47.0" "-"
6、運(yùn)行 Pod 沙盒
用 crictl 運(yùn)行 Pod 沙盒對(duì)容器運(yùn)行時(shí)排錯(cuò)很有幫助。 在運(yùn)行的 Kubernetes 集群中,沙盒會(huì)隨機(jī)地被 kubelet 停止和刪除。
編寫(xiě)下面的 JSON 文件:
{ "metadata": { "name": "nginx-sandbox", "namespace": "default", "attempt": 1, "uid": "hdishd83djaidwnduwk28bcsb" }, "log_directory": "/tmp", "linux": { } }
使用 crictl runp 命令應(yīng)用 JSON 文件并運(yùn)行沙盒。
crictl runp pod-config.json
返回了沙盒的 ID。
7、創(chuàng)建容器
用 crictl 創(chuàng)建容器對(duì)容器運(yùn)行時(shí)排錯(cuò)很有幫助。 在運(yùn)行的 Kubernetes 集群中,沙盒會(huì)隨機(jī)地被 kubelet 停止和刪除。
拉取 busybox 鏡像:
crictl pull busybox
Image is up to date for busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47
創(chuàng)建 Pod 和容器的配置:
Pod 配置:
{ "metadata": { "name": "busybox-sandbox", "namespace": "default", "attempt": 1, "uid": "aewi4aeThua7ooShohbo1phoj" }, "log_directory": "/tmp", "linux": { } }
容器配置:
{ "metadata": { "name": "busybox" }, "image":{ "image": "busybox" }, "command": [ "top" ], "log_path":"busybox.log", "linux": { } }
創(chuàng)建容器,傳遞先前創(chuàng)建的 Pod 的 ID、容器配置文件和 Pod 配置文件。返回容器的 ID。
crictl create f84dd361f8dc51518ed291fbadd6db537b0496536c1d2d6c05ff943ce8c9a54f container-config.json pod-config.json
查詢所有容器并確認(rèn)新創(chuàng)建的容器狀態(tài)為 Created。
crictl ps -a
輸出類似于這樣:
CONTAINER ID????????IMAGE???????????????CREATED?????????????STATE???????????????NAME????????????????ATTEMPT 3e025dd50a72d???????busybox?????????????32?seconds?ago??????Created?????????????busybox?????????????0
8、啟動(dòng)容器
要啟動(dòng)容器,要將容器 ID 傳給 crictl start:
crictl start 3e025dd50a72d956c4f14881fbb5b1080c9275674e95fb67f965f6478a957d60
輸出類似于這樣:
3e025dd50a72d956c4f14881fbb5b1080c9275674e95fb67f965f6478a957d60
確認(rèn)容器的狀態(tài)為 Running。
crictl ps
輸出類似于這樣:
CONTAINER ID???IMAGE????CREATED??????????????STATE????NAME?????ATTEMPT 3e025dd50a72d??busybox??About?a?minute?ago???Running??busybox??0