在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(相当于没有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,如果不指定,会默认使用default
这个Namespace。
3. Example
怎么划分Namespace呢?非常简单的例子就是把resource分成:production,development,QA environment。把它们对应不同的Namespace。
k8s本身也有自带的Namespace,在cluster创建的时候就有了(下面介绍来自官方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,我们可以设置RequestQuota(应用于一个Namespace的所有Pod,对比于LimitRange是应用在单独的Pod上),也可以对Namespace设置相应的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文件创建一个Namespace:
kubectl create -f <namespace-yaml-file>.yaml
<namespace-yaml-file>.yaml的例子如下:
apiVersion: v1
kind: Namespace
metadata:
name: my-namespace
方法2: 手动创建一个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里面创建一个<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