API Server and Pod (2)

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 出錯,可以在這邊看到一些訊息。

1
k describe pod web1

刪除 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 的容器

1
k exec client -it -- sh    

指定進入特定容器

-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 的變化

用於即時查看集群中的事件。

1
k get events --watch
  • kubectl get events:這會返回 Kubernetes 集群中所有的事件。
    • 事件是 Kubernetes 中一種對於集群內部發生的事情的描述,比如一個 pod 啟動或停止,或者一個服務的狀態變更等。
  • --watch:這是一個選項,加上它後,命令會持續運行並實時顯示新的事件。也就是說,每當有新的事件發生,它就會立即在螢幕上顯示出來。

kubectl proxy 使用方法

  1. 透過 k get pods -v 6 取得 api 訊息。
  2. 印出來的網址直接 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
}%
  1. 使用 k proxy & 讓他在背景執行 proxy。
  2. 就可以 curl 到想要的 pod。 curl http://127.0.0.1:8001/api/v1/namespaces/default/pods\?limit\=500
  3. 將背景執行的 proxy 砍掉。 fg

namespace 的基本與操作

namespace 主要是來做隔離,可以用來區分環境。

但是,不是所有的資源都可以透過 namespace 隔離。

1. 取得所有的 namespace

1
2
3
4
5
6
➜ k get namespaces
NAME STATUS AGE
default 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 AGE
client 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 --namespace kube-system
NAME READY STATUS RESTARTS AGE
coredns-565d847f94-52w2b 1/1 Running 6 (75s ago) 14d
coredns-565d847f94-mfnv7 1/1 Running 6 (75s ago) 14d
etcd-docker-desktop 1/1 Running 30 (75s ago) 14d
kube-apiserver-docker-desktop 1/1 Running 30 (75s ago) 14d
kube-controller-manager-docker-desktop 1/1 Running 30 (75s ago) 14d
kube-proxy-4vvk9 1/1 Running 6 (75s ago) 14d
kube-scheduler-docker-desktop 1/1 Running 30 (75s ago) 14d
storage-provisioner 1/1 Running 9 (33s ago) 14d
vpnkit-controller 1/1 Running 81 (33s ago) 14d

4. k get pods --all-namespaces 取得 namespace 中所有的 pod

1
2
3
4
5
6
7
8
9
10
11
12
➜ k get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
default web 2/2 Running 2 (4m51s ago) 24h
kube-system coredns-5d78c9869d-7bsz7 1/1 Running 1 (4m51s ago) 24h
kube-system coredns-5d78c9869d-dbl8d 1/1 Running 1 (4m51s ago) 24h
kube-system etcd-docker-desktop 1/1 Running 9 (4m51s ago) 24h
kube-system kube-apiserver-docker-desktop 1/1 Running 9 (4m51s ago) 24h
kube-system kube-controller-manager-docker-desktop 1/1 Running 9 (4m51s ago) 24h
kube-system kube-proxy-4ddqx 1/1 Running 1 (4m51s ago) 24h
kube-system kube-scheduler-docker-desktop 1/1 Running 9 (4m51s ago) 24h
kube-system storage-provisioner 1/1 Running 2 (4m33s ago) 24h
kube-system vpnkit-controller 1/1 Running 1 (4m51s ago) 24h

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: Active

No 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 的比喻

  1. Namespace(命名空間):可以把 Namespace 想象成一個大型餐廳裡的不同廚房區域。例如,有一個專門用於烹飪意大利菜的廚房,有一個專門用於烹飪日本料理的廚房。每個廚房都有自己的名字,並且在廚房內部,各種烹飪工具和器具的名稱必須是唯一的。
  2. 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 17m 10.1.2.92 docker-desktop <none> <none>
kube-system coredns-5d78c9869d-7bsz7 1/1 Running 1 (31m ago) 25h 10.1.2.88 docker-desktop <none> <none>
kube-system coredns-5d78c9869d-dbl8d 1/1 Running 1 (31m ago) 25h 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 的管理,可能需要手動處理故障和更新等操作。


API Server and Pod (2)
https://phoebeho.com/sre/20230730/4030265765/
作者
Phoebe
發布於
2023年7月30日
許可協議