目標
- 了解Kubernetes Pods(容器組)
- 了解Kubernetes Nodes(節點)
- 排查故障
Kubernetes Pods
在 部署第一個應用程序 中創建 Deployment 后,k8s創建了一個 Pod(容器組) 來放置應用程序實例(container 容器)。
Pods概述
Pod 容器組 是一個k8s中一個抽象的概念,用於存放一組 container(可包含一個或多個 container 容器,即圖上正方體),以及這些 container (容器)的一些共享資源。這些資源包括:
- 共享存儲,稱為卷(Volumes),即圖上紫色圓柱
- 網絡,每個 Pod(容器組)在集群中有個唯一的 IP,pod(容器組)中的 container(容器)共享該IP地址
- container(容器)的基本信息,例如容器的鏡像版本,對外暴露的端口等
例如,Pod可能既包含帶有Node.js應用程序的 container 容器,也包含另一個非 Node.js 的 container 容器,用於提供 Node.js webserver 要發布的數據。Pod中的容器共享 IP 地址和端口空間(同一 Pod 中的不同 container 端口不能相互沖突),始終位於同一位置並共同調度,並在同一節點上的共享上下文中運行。(同一個Pod內的容器可以使用 localhost + 端口號互相訪問)。
Pod(容器組)是 k8s 集群上的最基本的單元。當我們在 k8s 上創建 Deployment 時,會在集群上創建包含容器的 Pod (而不是直接創建容器)。每個Pod都與運行它的 worker 節點(Node)綁定,並保持在那里直到終止或被刪除。如果節點(Node)發生故障,則會在群集中的其他可用節點(Node)上運行相同的 Pod(從同樣的鏡像創建 Container,使用同樣的配置,IP 地址不同,Pod 名字不同)。
重要:
- Pod 是一組容器(可包含一個或多個應用程序容器),以及共享存儲(卷 Volumes)、IP 地址和有關如何運行容器的信息。
- 如果多個容器緊密耦合並且需要共享磁盤等資源,則他們應該被部署在同一個Pod(容器組)中。
Node(節點)
下圖顯示一個 Node(節點)上含有4個 Pod(容器組)
Pod(容器組)總是在 Node(節點) 上運行。Node(節點)是 kubernetes 集群中的計算機,可以是虛擬機或物理機。每個 Node(節點)都由 master 管理。一個 Node(節點)可以有多個Pod(容器組),kubernetes master 會根據每個 Node(節點)上可用資源的情況,自動調度 Pod(容器組)到最佳的 Node(節點)上。
每個 Kubernetes Node(節點)至少運行:
- Kubelet,負責 master 節點和 worker 節點之間通信的進程;管理 Pod(容器組)和 Pod(容器組)內運行的 Container(容器)。
- 容器運行環境(如Docker)負責下載鏡像、創建和運行容器等。
實戰:故障排除
kubectl get - 顯示資源列表
# kubectl get 資源類型
#獲取類型為Deployment的資源列表
kubectl get deployments
#獲取類型為Pod的資源列表
kubectl get pods
#獲取類型為Node的資源列表
kubectl get nodes
[root@guanbin-k8s-master ~]# kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 1/1 1 1 23h [root@guanbin-k8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp 1/1 Running 0 24h nginx 1/1 Running 0 23h nginx-deployment-6dd8bc586b-kgn85 1/1 Running 0 23h [root@guanbin-k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION guanbin-k8s-master Ready master 47h v1.18.0 guanbin-k8s-node Ready <none> 47h v1.18.0
kubectl get - 名稱空間
在命令后增加 -A
或 --all-namespaces
可查看所有 名稱空間中 的對象,使用參數 -n
可查看指定名稱空間的對象,例如
# 查看所有名稱空間的 Deployment kubectl get deployments -A kubectl get deployments --all-namespaces # 查看 kube-system 名稱空間的 Deployment kubectl get deployments -n kube-system
並非所有對象都在名稱空間里
大部分的 Kubernetes 對象(例如,Pod、Service、Deployment、StatefulSet等)都必須在名稱空間里。但是某些更低層級的對象,是不在任何名稱空間中的,例如 nodes、persistentVolumes、storageClass 等
執行一下命令可查看哪些 Kubernetes 對象在名稱空間里,哪些不在:
# 在名稱空間里 kubectl api-resources --namespaced=true # 不在名稱空間里 kubectl api-resources --namespaced=false
kubectl describe - 顯示有關資源的詳細信息
# kubectl describe 資源類型 資源名稱 #查看名稱為nginx-XXXXXX的Pod的信息 kubectl describe pod nginx-XXXXXX #查看名稱為nginx的Deployment的信息 kubectl describe deployment nginx
kubectl logs - 查看pod中的容器的打印日志
(和命令docker logs 類似)
# kubectl logs Pod名稱 #查看名稱為nginx-pod-XXXXXXX的Pod內的容器打印的日志 #本案例中的 nginx-pod 沒有輸出日志,所以您看到的結果是空的 kubectl logs -f nginx-pod-XXXXXXX
kubectl exec
- 在pod中的容器環境內執行命令(和命令docker exec 類似)
# kubectl exec Pod名稱 操作命令 # 在名稱為nginx-pod-xxxxxx的Pod中運行bash kubectl exec -it nginx-pod-xxxxxx /bin/bash