03-Kubernetes名稱空間
1、什麼是名稱空間
Kubernetes支援多個虛擬叢集,它們底層依賴於同一個物理叢集。這些虛擬叢集被稱為名稱空間。
名稱空間(namespace)是Kubernetes叢集級別的資源,可以給不同的使用者、租戶、環境或者專案建立對應的名稱空間,例如,可以給test
、devloment
、production
環境分別建立各自的名稱空間。
2、名稱空間的應用場景
名稱空間適用於存在很多跨多個團隊或專案的使用者的場景。對於只有幾到幾十個使用者的叢集,根本不需要建立或考慮名稱空間。
2.1 檢視名稱空間及其資源物件
k8s叢集預設提供了幾個名稱空間用於特定目的,例如,kube-system主要用於執行系統級資源,存放k8s一些元件的。而default則為那些未指定名稱空間的資源操作提供一個預設值。
使用kubectl get namespaces
可以檢視namespace資源,使用kubectl describe namespace $NAME
可以檢視特定的名稱空間的詳細資訊。
kubectl get ns
kubectl get namespaces
kubectl describe namespaces kube-system
kubectl describe ns kubernetes-dashboard
2.2 管理名稱空間資源
-
namespace資源屬性較少,通常只需要指定名稱即可建立,如
kubectl create namespace qa
。 -
namespace資源的名稱僅能由
字母、數字、下劃線、連線線等字元
-
刪除namespace資源會級聯刪除其包含的所有其他資源物件。
3、名稱空間使用案例
3.1 建立名稱空間
kubectl create namespace test
3.2 切換名稱空間
kubectl config set-context --current --namespace=test
切換後kubeconfig
檔案也會自動改變:
3.3 檢視哪些資源屬於名稱空間級別
kubectl api-resources --namespaced=true
名稱空間級別的資源有:
3.4 名稱空間資源限額
namespace是名稱空間,裡面有很多資源,那麼我們可以對名稱空間資源做個限制,防止該名稱空間部署的資源超過限制。
我們可以在建立名稱空間的時候就對該名稱空間的資源進行限額。
通過資源清單對名稱空間進行資源限額:
# namespace-test.yaml
apiVersion: v1
kind: Namespace
metadata:
name: test
spec:
finalizers:
- kubernetes
---
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-quota
namespace: test
spec:
hard:
requests.cpu: "2"
requests.memory: 2Gi
limits.cpu: "4"
limits.memory: 4Gi
建立的ResourceQuota物件將在test名字空間中新增以下限制:
- 每個容器必須設定記憶體請求(memory request),記憶體限額(memory limit),cpu請求(cpu request)和cpu限額(cpu limit)。
- 所有容器的記憶體請求總額不得超過2GiB。
- 所有容器的記憶體限額總額不得超過4 GiB。
- 所有容器的CPU請求總額不得超過2 CPU。
- 所有容器的CPU限額總額不得超過4CPU。
更新資源配置清單:
kubectl apply -f namespace-test.yaml
Kubernetes會自動建立名稱空間並設定資源限額:
在有資源限額的名稱空間中建立Pod必須設定資源限額,否則建立Pod會失敗!
# pod-test.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-test
namespace: test
labels:
name: pod-test
spec:
containers:
- name: pod-test
image: tomcat:8.5-jre8-alpine
ports:
- containerPort: 8080
imagePullPolicy: IfNotPresent
更新資源配置檔案:
kubectl apply -f pod-test.yaml
由於沒有設定資源限額,所以報錯如下:
修改之後的資源配置檔案:
# pod-test.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-test
namespace: test
labels:
name: pod-test
spec:
containers:
- name: pod-test
image: tomcat:8.5-jre8-alpine
resources:
requests:
memory: "128Mi"
cpu: "500m"
limits:
memory: "256Mi"
cpu: "1000m"
ports:
- containerPort: 8080
imagePullPolicy: IfNotPresent
更新資源配置清單:
kubectl apply -f pod-test.yaml
kubectl get pods -n test -o wide
Pod成功建立: