在前一天的學習筆記中提到,當 Kubernetes 提供給越來越多人使用時,我們可以透過 Resource Quotas 來避免單一 Pod 佔領整個 Cluster 的資源。今天的學習筆記中,想介紹 Kubernetes 的另一個元件 - Namespaces,今日筆記內容如下:
Kubernetes 提供了抽象的 Cluster (virtual cluster) 的概念,讓我們能根據專案不同、執行團隊不同,或是商業考量,將原本擁有實體資源的單一 Kubernetes Cluster ,劃分成幾個不同的抽象的 Cluster (virtual cluster)
,也就是 Namespaces。
在 minikube 上透過 kubectl get
指令,我們可以看到當前有 default
, kube-system
與 kube-public
這三個 namespaces,
default
預設的 Namespaces 名稱為 default
,過去我們產生的物件像是, Deployment, Services 等若沒特別指定 Namespace 都是存放在名稱為 default 的 namespaces 中。
kube-system
在 Kubernetes 中,較特別的資源都會存放在 kube-system
這個 namespace。若是用 kubectl get all -n kube-system
查看,可以發現先前介紹的 kube-dns 或是 heapster 都是存放在該 namepsace 中。
kube-public
kube-public
也是個特殊的 namespace,存放在裡面的物件可被所有的使用者讀取。
首先,我們要先建立一個名稱為newspace
的 namespace,指令如下,
$ kubectl create namespace newspace
namespace "newspace" created
透過 kubectl get namespaces
可以查看剛創建好的 namespaces
若要查看目前在哪個 Namespace 底下,可用以下指令
$ kubectl config view | grep namespace:
可以看到預設為 default
。可以透過 kubectl config set-context
指令,將預設的指令切換為 newspace
,指令如下:
$ kubectl config set-context \
> $(kubectl config current-context) \
> --namespace=newspace
Context "minikube" modified.
若再用指令查看目前預設的 namespace,可以發現原本的 default 變為 newspace 了,
透過 kubectl delete
指令,可以將我們剛建立好的 newspace
刪除,指令如下,
$ kubectl delete namespaces newspace
namespace "newspace" deleted
需留意的是,default 與 kube-system 是無法被刪除的 namespaces
以 hellospace.yaml 為例,內容如下:
apiVersion: v1
kind: Namespace
metadata:
name: hellospace
---
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quotas
namespace: hellospace
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "1"
requests.memory: 10Gi
---
apiVersion: v1
kind: ResourceQuota
metadata:
name: object-quotas
namespace: hellospace
spec:
hard:
services: "2"
services.loadbalancers: "1"
secrets: "1"
configmaps: "1"
replicationcontrollers: "10"
在 hellospace.yaml 中,我們新創建了一個 hellospace
的 namespace,且限制該 namespace
運算資源(compute-quotas)
CPU 最多只有 1 core ,以及 memory 的使用被限制在 10Gi 以下
物件資源(object-quotas)
限制 hellospace
最多只能有 2 個 services 物件,且只能有 1 個 loadbalancer, secret, 以及 configmap。
使用 kubectl create
創建,
$ kubectl create -f ./hellospace.yaml
namespace "hellospace" created
resourcequota "compute-quotas" created
resourcequota "object-quotas" created
創建完之後,可用 kubectl get
查看在 hellospace
裡的 Resource Quotas
$ kubectl get resourcequotas -n hellospace
NAME AGE
compute-quotas 5m
object-quotas 5m
用 kubectl describe
分別查看 compute-quotas 與 object-quotas 的內容,
compute-quotas
object-quotas
可以發現,在 hellospace
中已有一個 secret 物件,若這時我們再創建一個新的 secret 物件,會發生什麼事呢,
會看到 Kubernetes 發出 超出可允許的使用quota
警告。代表 hellospace 受 comput-quotas 與 object-quotas 的限制。
若有興趣的讀者,不妨多做其他操作看看當超出 Resource Quotas 唷。
在實際場景中,Namespaces 與 Resource Quotas 的設計使得 Kubernetes 在管理與處理不同專案的可用性大幅提升。如果對於 Resource Quotas 或 Namespaces 還想更深入研究的讀者,不妨參考 Kubernetes 官方文件,會對這兩著的運用更加清楚。
依舊歡迎大家給予建議與討論,如果能按個讚給些鼓勵也是很開心唷 :)
看起來你的 hellospace.yaml 是想要寫 limits.memory: 10Gi 但寫成 requests.memory: 10Gi