pod 的基本操作
1 2 3 ➜ k get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web 2/2 Running 0 4h38m 10.1.1.207 docker-desktop <none> <none>
看到更多相關訊息 -o wide
-o wide
是一個選項,用來改變輸出的格式。
指定 -o wide
會顯示更多的信息,比如每個 Pod 的 IP 地址和運行該 Pod 的節點等。
1 2 3 ➜ k get pods -o wide --show-labels NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS web 2/2 Running 0 4h57m 10.1.1.207 docker-desktop <none> <none> demo=test ,run=web
描述 pod 的狀況 describe
透過這個指令可以看到 pod 的狀況,最下面有 events,如果 pod 出錯,可以在這邊看到一些訊息。
刪除 pod 1 2 ➜ k delete pod web pod "web" deleted
進入 pod 容器執行命令 設定環境 創建名為 client 的 pod
1 2 3 4 5 ➜ k run client --image=busybox --command -- bin/sh -c "sleep 100000" pod/client created ➜ k get pods NAME READY STATUS RESTARTS AGE client 1/1 Running 0 5s
進入 pod 中的容器 進入名為 client 的容器
指定進入特定容器 -c
假如 pod 裡面有多個容器,可以使用 -c
指定容器。
1 k exec web -c busybox -- date
kubectl api 級別 log 顯示 透過這個指令可以看到我們下指令的時候,他是用到哪隻 api。
我們下的指令是透過跟 api server 的通信,得到的 response。
指令 取得 Kubernetes 集群中所有 pod 的狀態資訊。
1 2 3 4 5 6 ➜ k get pods -v 6 I0618 22:50:13.464853 23078 loader.go:373] Config loaded from file: /Users/phoebe/.kube/config I0618 22:50:13.486953 23078 round_trippers.go:553] GET https://127.0.0.1:6443/api/v1/namespaces/default/pods?limit =500 200 OK in 15 milliseconds NAME READY STATUS RESTARTS AGE client 1/1 Running 0 74m web 2/2 Running 0 148m
取得特定 pod 的狀態資訊。
1 kubectl get pod <pod-name> -v 6
-v 6
的意義在 Kubernetes 的命令行工具 kubectl 中,-v
參數代表 “verbosity”,也就是輸出的詳細程度。
這個參數後面的數字(在你的例子中是 6)是指定的詳細程度等級。
Kubernetes 的 verbosity 等級範圍從 0 到 10。
數字越大,輸出的信息就越詳細。在等級 6 的時候,它將會顯示一些較為詳細的信息,例如標頭或者 Request Body。
查看 pod 的變化 用於即時查看集群中的事件。
kubectl get events
:這會返回 Kubernetes 集群中所有的事件。
事件是 Kubernetes 中一種對於集群內部發生的事情的描述,比如一個 pod 啟動或停止,或者一個服務的狀態變更等。
--watch
:這是一個選項,加上它後,命令會持續運行並實時顯示新的事件。也就是說,每當有新的事件發生,它就會立即在螢幕上顯示出來。
kubectl proxy 使用方法
透過 k get pods -v 6
取得 api 訊息。
印出來的網址直接 curl 他會出現權限不足的問題。這時候就可以用 proxy 幫我們轉發,迴避這個問題。
1 2 3 4 5 6 7 8 9 10 11 12 13 ➜ k8s-lab curl https://127.0.0.1:6443/api/v1/namespaces/default/pods\?limit \=500 --insecure { "kind" : "Status" , "apiVersion" : "v1" , "metadata" : {}, "status" : "Failure" , "message" : "pods is forbidden: User \"system:anonymous\" cannot list resource \"pods\" in API group \"\" in the namespace \"default\"" , "reason" : "Forbidden" , "details" : { "kind" : "pods" }, "code" : 403 }%
使用 k proxy &
讓他在背景執行 proxy。
就可以 curl 到想要的 pod。 curl http://127.0.0.1:8001/api/v1/namespaces/default/pods\?limit\=500
將背景執行的 proxy 砍掉。 fg
namespace 的基本與操作 namespace 主要是來做隔離,可以用來區分環境。
但是,不是所有的資源都可以透過 namespace 隔離。
1. 取得所有的 namespace 1 2 3 4 5 6 ➜ k get namespaces NAME STATUS AGEdefault Active 14d kube-node-lease Active 14d kube-public Active 14d kube-system Active 14d
2. 然後 get pods 的時候通常是 default 的 1 2 3 4 ➜ k get pods NAME READY STATUS RESTARTS AGEclient 1/1 Running 2 (60s ago) 25h web 2/2 Running 4 (60s ago) 26h
3. 假如我們要 get 其他 namespace 的時候,就需要在後方指定 namespace。 1 2 3 4 5 6 7 8 9 10 11 ➜ k get pods NAME READY STATUS RESTARTS AGE coredns-565 d847f94-52 w2b 1 / 1 Running 6 (75 s ago) 14 d coredns-565 d847f94- mfnv7 1 / 1 Running 6 (75 s ago) 14 d etcd- docker- desktop 1 / 1 Running 30 (75 s ago) 14 d kube- apiserver- docker- desktop 1 / 1 Running 30 (75 s ago) 14 d kube- controller- manager- docker- desktop 1 / 1 Running 30 (75 s ago) 14 d kube- proxy-4 vvk9 1 / 1 Running 6 (75 s ago) 14 d kube- scheduler- docker- desktop 1 / 1 Running 30 (75 s ago) 14 d storage- provisioner 1 / 1 Running 9 (33 s ago) 14 d vpnkit- controller 1 / 1 Running 81 (33 s ago) 14 d
4. k get pods --all-namespaces
取得 namespace 中所有的 pod 1 2 3 4 5 6 7 8 9 10 11 12 ➜ k get pods NAMESPACE NAME READY STATUS RESTARTS AGEdefault web 2 / 2 Running 2 (4 m51s ago) 24 h kube- system coredns-5 d78c9869d-7 bsz7 1 / 1 Running 1 (4 m51s ago) 24 h kube- system coredns-5 d78c9869d- dbl8d 1 / 1 Running 1 (4 m51s ago) 24 h kube- system etcd- docker- desktop 1 / 1 Running 9 (4 m51s ago) 24 h kube- system kube- apiserver- docker- desktop 1 / 1 Running 9 (4 m51s ago) 24 h kube- system kube- controller- manager- docker- desktop 1 / 1 Running 9 (4 m51s ago) 24 h kube- system kube- proxy-4 ddqx 1 / 1 Running 1 (4 m51s ago) 24 h kube- system kube- scheduler- docker- desktop 1 / 1 Running 9 (4 m51s ago) 24 h kube- system storage- provisioner 1 / 1 Running 2 (4 m33s ago) 24 h kube- system vpnkit- controller 1 / 1 Running 1 (4 m51s ago) 24 h
5. k describe namespaces kube-system 1 2 3 4 5 6 7 8 9 ➜ k describe namespaces kube-system Name : kube-system Labels: kubernetes.io/metadata.name=kube-system Annotations: <none > Status: ActiveNo resource quota.No LimitRange resource.
6. 指定 namespace 1 2 ➜ k run web --image =nginx --namespace =demo pod/web created
考試的時候,環境可能在不同的 namespace 裡面。
所以我們可以直接修改默認的 namespace 通常下下面的指令時,會出現預設的 default。
1 2 ➜ k get pods No resources found in default namespace.
所以我們可以使用 set-context
去設定預設的 namespace。
1 2 ➜ k config set-context --current --namespace=demo Context "docker-desktop" modified .
Namespace 的比喻
Namespace(命名空間) :可以把 Namespace 想象成一個大型餐廳裡的不同廚房區域。例如,有一個專門用於烹飪意大利菜的廚房,有一個專門用於烹飪日本料理的廚房。每個廚房都有自己的名字,並且在廚房內部,各種烹飪工具和器具的名稱必須是唯一的。
Pod(節點) :在這個廚房裡,每個烹飪臺就像是一個 Pod。一個烹飪臺上可能會有烤箱、煮鍋或者鑊子等不同的烹飪工具(就像一個 Pod 可以有一個或多個容器)。這些工具會共享一些資源,比如燃氣和水。
在這種情況下,可以在不同的 Namespace(廚房區域)中準備不同的菜餚,每個菜餚由一個或多個 Pod(烹飪臺)來完成。 這種方式提供了一種隔離機制,使得不同的廚師可以在同一個餐廳裡獨立工作,而不會互相干擾。
Static Pod static pod 是透過 kubelet 創建的,文件放置的位置就是 staticPodPath。
kubelet 文件配置在 /var/lib/kubelet/config.yaml
。
static pod 不是透過 api server 創建的 pod,並不能真的被 api 刪除。
1 2 3 4 5 ➜ ~ k get pods - A - o wide NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES demo web 1 / 1 Running 0 17 m 10.1 .2 .92 docker- desktop < none > < none > kube- system coredns-5 d78c9869d-7 bsz7 1 / 1 Running 1 (31 m ago) 25 h 10.1 .2 .88 docker- desktop < none > < none > kube- system coredns-5 d78c9869d- dbl8d 1 / 1 Running 1 (31 m ago) 25 h 10.1 .2 .91 docker- desktop < none > < none >
想刪除 static pod,就是直接把 yaml 文件刪除。
1 k delete pod web2-k8s-workor1
在這個路徑(/etc/kubernetes/manifests/
)下可以看到 kubernetes 自定義好的 static pod 的 manifest。
1 2 3 4 5 6 7 8 ➜ ~ ll /etc/kubernetes/manifests/ total 24 -rw-------. 1 root root 2483 Apr 3 01:59 etcd.yaml -rw-r--r--. 1 root root 694 Apr 2 12:43 haproxy.yaml -rw-r--r--. 1 root root 991 Apr 2 12:43 keepalived.yaml -rw-------. 1 root root 3353 Apr 3 01:58 kube-apiserver.yaml -rw-------. 1 root root 2854 Apr 3 01:58 kube-controller-manager.yaml -rw-------. 1 root root 1440 Apr 3 01:58 kube-scheduler.yaml
Static Pod 應用 Static Pod 的主要用途是運行一些基本的、關鍵性的系統元件。
這些元件在 Kubernetes 控制平面啟動之前就需要運行,或者不受控制平面的管理。以下是一些常見情況,您可能會考慮新增靜態 Pod:
核心系統元件:例如 kube-proxy 和 CoreDNS 等。
這些元件是 Kubernetes 運行所需的核心部分,在集群啟動之前需要確保它們正常運行,因此常常以靜態 Pod 形式運行在節點上。
自定義 CNI 插件:如果您使用自定義的 CNI(容器網路接口)插件來管理容器網路,可能需要將 CNI 插件以靜態 Pod 形式運行在每個節點上,以便在 Kubelet 啟動之前建立網路通信。
特殊節點上的系統元件:有些節點可能有特殊的需求,需要運行額外的系統元件。
例如,一個標有 GPU 的節點可能需要運行 NVIDIA GPU 驅動程式的容器作為靜態 Pod。
臨時測試和調試:在某些情況下,您可能需要臨時運行一個 Pod 來進行測試或調試,而不希望通過 API Server 創建正式的 Pod。
在這些情況下,使用靜態 Pod 可以更加靈活和直接地在節點上運行容器,而無需通過 API Server 或集群的 Advanced Controllers。
使用靜態 Pod 也需要注意管理和維護,因為它們不受 Controll Manager 的管理,可能需要手動處理故障和更新等操作。