Viewing Pods and Nodes
學習重點
- Pods
- Nodes
- 對已部署的app進行故障排除
Pod
當創建部署時,pod會託管你的app。而Pod是一種抽象層,描述了一個群組內的app container,以及共享的資源,包含
- Shared storage, as Volumes
- Networking, as a unique cluster IP address
- Information about how to run each container, such as the container image version or specific ports to use
此外pod是k8s中的最小單位,當你創建部署時,會產生帶有container的pod,而不是直接創建container,而pod會與調度他的node綁定,直到終止或是被刪除,在node故障的情形下,pod會被轉移到其他可用的node上進行調度
Node
pod總是會運行在node中,而node是k8s中的工作機器,那可能是一台虛擬機、實體機器,具體會取決於cluster
每個node都是藉由control plane管理,而一個node可以具有多個pod
k8s control plane會在集群中跨node自動管理,並自動調用且評估每個node上的可用資源
而每個node至少會運行
- Kubelet, a process responsible for communication between the Kubernetes control plane and the Node; it manages the Pods and the containers running on a machine.
- A container runtime (like Docker) responsible for pulling the container image from a registry, unpacking the container, and running the application.
使用kubectl進行故障排除
kubectl有以下常見的操作
- kubectl get - list resources
- kubectl describe - show detailed information about a resource
- kubectl logs - print the logs from a container in a pod
- kubectl exec - execute a command on a container in a pod
Interactive Tutorial - Exploring Your App
- 取得pods列表,在此次練習中模擬延續你在之前所建立的資源
kubectl get pods
找不到的話等一下,或是重載
- 接著查看pod裡面有哪些container,用哪些image建立container等...資訊
kubectl describe pods
describe可以查看:pods/node/deployments
- 依照之前的教學,建立proxy跟export pod name,並呼叫API,依序點擊教學上的指令就會自動執行
$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
$ echo Name of the Pod: $POD_NAME
$ curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/
- app可能都會藉由
STDOUT
輸出log,可以使用指令查看log
kubectl logs $POD_NAME
注意:這裡不需要指定container name,因為在教學的pod內只有一個container
- 當pod運行後,就可以在container上執行命令,接著用pod name做為參數列出環境參數
kubectl exec $POD_NAME -- env
- 然後在教學中如前面一樣,在pod中只有一個container,所以可以省略container,然後在pod的container內啟動一個bash
kubectl exec -ti $POD_NAME -- bash
- 接著在container上開出了一個bash console,用cat指令印出JS程式碼
cat server.js
- 最後因為我們在container上,可以直接確認app狀態,如果這段執行失敗請確認你有在container上開啟bash
curl localhost:8080
exit
參考