Kubernates 提供有 namespace (命名空間) 以方便管理,這應該不難理解,現在的程式語言也多半有提供命名空間 (例如 Java 的 package),終究系統大了的話,名稱很容易重複。底下整理一些 K8s 命名空間的基本觀念。
kubectl get ns
Kubernates 安裝好,預設就會有這些命名空間,在建立各項資源時,如果沒有特別指命,預設使用 default。
kubectl get po --namespace default
這個指令可以列出指定的命名空間中的 pod,如上,列出了在「
部署 RESTful service 到 Kubernetes」及「
K8s: cluster (hostname & IP)」中練習時建立的 pod。
kubectl create namespace my-ns
這是使用指令的方式,另外也可以使用 yaml,如下:
apiVersion: v1
kind: Namespace
metadata:
name: my-ns
命名空間的名稱,限定只能用英數字及 dash (-)。
- 在指定的命名空間建立資源
使用如下的 yaml 重新建立一次 pod host:
apiVersion: v1
kind: Pod
metadata:
name: host
labels:
app: host-info
spec:
containers:
- name: host
image: twleader/host:latest
ports:
- containerPort: 9080
指令則是在原有指令後面指定命名空間:
kubectl create -f create-pod.yaml -n my-ns
建立成功後,檢查看看,確定真的建立在命名空間 my-ns 裡了!
- 命名空間的隔離
命名空間只會隔離名稱,也就是相同名稱可以存在於不同的命名空間,但是,不同命名空間的資源,仍可互相存取到對方,不會受到任何限制!
- 刪除資源
先檢查一下目前 Kubernetes 中的 pod ... 接著我們要刪除 pod host,如下:
kubectl delete po host
因為沒有指定要刪除那一個命名空間的 pod host,預設會刪除 default 裡資源,檢查如下,default 裡的被刪除了,my-ns 的還在!
指定命名空間,重新刪除一次,如下,正確的刪除了 my-ns 命名空間裡的 pod host。
當 Kubernetes 收到刪除 pod 的指令,會向 pod 中的所有 container 發出 SIGTERM 的信號,並等待一段時間 (通常為 30秒) 待所有 container 正常關閉,如果時間到仍有 container 未關閉,則會直接以 SIGKILL 將它的 process 終止! 為了確保程式可以正常結束,最好可以在程式中正確的處理 SIGTERM 信號。
kubectl delete ns my-ns
這樣的指令會把命名空間及其下所有資源刪除! 如果希望只刪除命名空間下的 pod,但保留命名空間呢? 如下:
kubectl delete po --all --namespace my-ns
如果要刪除命名空間下(幾乎)所有資源呢? 指令如下:
kubectl delete all --all --namespace my-ns
為什麼說是"幾乎"而不是全部? 因為 Pod、ReplicationController、ReplicaSet、Service 真的會被刪除,但是有少數的資源,例如 Secret 不會被刪除。
- 切換命名空間
登入 kubernetes 時,沒有特別指定,使用的是 default 這個命名空間,建立資源時,沒有指定命名空間,都會建立在 default 裡,如果我們的資源都在別的命名空間,最好是切換到那個命名空間去,這樣建立的資源就會預設是在那個命名空間,怎麼切換呢? 指令有點長,一般會先建立個 alias,如下:
alias kcd='kubectl config set-context $(kubectl config current-context) --namespace '
之後要切換命名空間,例如,有個命名空間為 home,要切換到 home,就這麼下指令:
kcd home
沒有留言:
張貼留言