在Kubernetes中的Namespace,就是用來將同一個集群中的各種資源互相隔離的機制。所以在同一個Namespace的各種Object的名稱都要唯一,而跨Namespace屬於整個集群的Object就沒有這種限制了。
我們來看看Namespace的YAML吧~
apiVersion: v1
kind: Namespace
metadata:
name: <insert-namespace-name-here>
另外要注意的是,創建Namespace時,名稱要避免使用kube-,因為這類型的名稱是為了Kubernetes系統所保留。
# 查看集群中有哪些Namespace
kubectl get namespace
# 在各項指令中指定namespace,這邊舉例是列出kube-system namespace的Pod
# 只要加-n $namespaceName,-n 代表--namespace
kubectl get pod -n kube-system
# 建立新的namespace test,也可以使用YAML建立
kubectl create namespace test
# 刪除Namespace test
kubectl delete namespace test
# 變更預設的Namespace為test
kubectl config set-context --current --namespace=test
# 確認目前預設的Namespace
kubectl config view --minify | grep namespace:
今天如果兩個不同Namespace的Object想要互相訪問,可以透過DNS,那這個DNS的形式為:
${serviceMame}.${namespaceName}.svc.cluster.local
舉例來說,default Namespace的Pod想要連到test Namespace的DB,而這個DB Pod綁著一個叫db-service的service,那這個DB的host會是:
db-service.test.svc.cluster.local
集群中有許多Object不屬於Namespace,如StorageClass、Node、PersistentVolume。
那我們要如何確認呢?
# 確認哪些Object屬於Namespace
kubectl api-resources --namespaced=true
# 確認哪些Object部屬於Namespace
kubectl api-resources --namespaced=false
這是一種針對Namespace限制資源總量的機制,有分為Limit和Request。
而ResourceQuota的限制有分為三類:
看看YAML吧~
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
namespace: test
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
requests.nvidia.com/gpu: 4
可以建立PriorityClass,並在Pod的YAML設定PriorityClassName。
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: very-much-so-important
value: 0000500
preemptionPolicy: Never
globalDefault: false
description: 'very much so important'
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: very-much-so-important
name: very-much-so-important
spec:
containers:
- image: nginx:1.17.6-alpine
name: very-much-so-important
resources:
requests:
memory: 1.5Gi
dnsPolicy: ClusterFirst
restartPolicy: Never
priorityClassName: very-much-so-important
status: {}
Kubernetes CKA hands-on challenge #6 Pod Priority