在k8s里面岸蜗,有一些group & manage resources的方式,比如Label绊袋,Namespace毕匀。
想理解Label,我們可以類比成tag(Instagram癌别,微博都有這種用#開始的tag)皂岔,或者gmail里的label。我們這里重點看下Namespace展姐。
1. Intro
官方doc上介紹說躁垛,k8s可以把一個physical cluster劃分成virtual clusters的剖毯,這種virtual cluster就是Namespace。
Kubernetes supports multiple virtual clusters backed by the same physical cluster. These virtual clusters are called namespaces.
通過Namespace教馆,我們可以把cluster resource劃分給不同的user(通過 ResourceQuota)逊谋。
2. Label v.s. Namespace
首先比較一下Label和Namespace:
- 一個k8s的resource可以有多個Label,也可以沒有土铺。而一個resource只能有一個Namespace或者global(相當(dāng)于沒有Namespace胶滋,或者說是cluster-level resource,比如Node這個resource就是cluster-level的)舒憾。
- Label之間是可以有overlap的镀钓,而Namespace不可以。
- 不同Namespace可以有相同的resource name(resource name只需要在Namespace里是unique的)镀迂。比如namespace-a有個resource叫resource-x丁溅,namespace-b也可以有個resource叫resource-x。label不可以探遵。
- 我們在使用cluster的時候(比如用
kubectl
)窟赏,如果不指定Label,會顯示所有的object(也就是不管Label是什么)箱季。對于Namespace涯穷,如果不指定,會默認(rèn)使用default
這個Namespace藏雏。
3. Example
怎么劃分Namespace呢拷况?非常簡單的例子就是把resource分成:production,development掘殴,QA environment赚瘦。把它們對應(yīng)不同的Namespace。
k8s本身也有自帶的Namespace奏寨,在cluster創(chuàng)建的時候就有了(下面介紹來自官方doc):
- default - The default namespace for objects with no other namespace
- kube-system - The namespace for objects created by the Kubernetes system
- kube-public - This namespace is created automatically and is readable by all users (including those not authenticated). This namespace is mostly reserved for cluster usage, in case that some resources should be visible and readable publicly throughout the whole cluster. The public aspect of this namespace is only a convention, not a requirement.
- kube-node-lease - This namespace for the lease objects associated with each node which improves the performance of the node heartbeats as the cluster scales.
有了Namespace起意,我們可以設(shè)置RequestQuota(應(yīng)用于一個Namespace的所有Pod,對比于LimitRange是應(yīng)用在單獨的Pod上)病瞳,也可以對Namespace設(shè)置相應(yīng)的access permission揽咕。
4. Commands
列出cluster里的所有Namespace:
kubectl get ns
下面兩個command是一樣的,列出cluster里Namespace是<namespace-name>的所有Pod:
kubectl get po --namespace <namespace-name>
kubectl get po -n <namespace-name>
Create a Namespace
方法1: 通過yaml文件創(chuàng)建一個Namespace:
kubectl create -f <namespace-yaml-file>.yaml
<namespace-yaml-file>.yaml的例子如下:
apiVersion: v1
kind: Namespace
metadata:
name: my-namespace
方法2: 手動創(chuàng)建一個Namespace:
kubectl create namespace <namespace-name>
Manage Objects in a Namespace
方法1: 在object(比如pod套菜,etc)的yaml文件中亲善,在metadata部分加入Namespace: <namespace-name>這個entry。
方法2: 在<namespace-name>這個Namespace里面創(chuàng)建一個<object-yaml-file>.yaml定義的object(比如pod逗柴,etc):
kubectl create -f <object-yaml-file>.yaml -ns <namespace-name>
Check if an Object is Namespaced
之前我們說過蛹头,不是所有的resource object都在某個namespace。有的resource object是cluster-wide的,比如Node掘而,再比如PersistentVolume。如果我們想查看哪些是于购,哪些不是袍睡,用下面的command:
# In a namespace
kubectl api-resources --namespaced=true
# Not in a namespace
kubectl api-resources --namespaced=false
Reference:
- Kubernetes in Action