【k8s学习】kubernetes namespace介绍
【本文目标】
- What is a namespace?
- What are the use cases?
- How namespaces work and how to use it?
【前置文章】
- 【k8s学习】Kubernetes学习——核心组件和架构
- 【k8s学习】minikube、kubectl、yaml配置文件的介绍
- 【k8s学习】在minikube上布署MongoDB和MongoExpress
1. Namespace
官网:https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/namespaces/
-
Organize resources in namespace
:Kubernetes的namespace是对资源的划分,不同的Namespace中的资源是相互隔离的。 -
Virtual cluster inside a cluster
:可以看作是集群中的虚似集群。可以有多个namespace。
1.1 集群的4个默认的namespace
Kubernetes默认就会有4个namespaces。可以通过命令kubectl get namespace
查看:
-
default
:我们默认创建资源的地方。如通过kubectl apply -f <filename>
,如没有指定namespace,那么默认就在default下创建。 -
kube-node-lease
:各个节点的心跳。 -
kube-public
:可以公开访问的数据,如存放了集群信息的ConfigMap。比如我们使用命令kubectl cluster-info
拿到的集群信息,就是来自这个namespace下的数据。 -
kube-system
:一般给System组件用的如Master相关的或是kubectl自身组件相关的。不推荐在这个namespace上新增资源或修改现有资源。 -
kubernetes-dashboard
:minikube only。
1.2 创建namespace
image.pngkubectl create namespace <name>
也可以通过yaml配置文件创建namespace。
2. Namespace use cases
use case-1:根据功能来区别
如果我们只有default namespace,然后我们在default下面创建了太多的deployment,replicaset,pod以及service,以致于我们在查看的时候眼花缭乱。
这时候我们就需要对我们的资源进行分组了,比如:
- database namespace:用来放db相关的资源。
- monitoring namespace:用来放monitor相关的资源。
- elastic stack namespace:用来放elastic、kibana相关的资源。
- nginx-ingress namespace:用来放nginx相关的资源。
根据Kubernetes官网建议,如果你的项目架构很小,用户量也很小,那么也不需要使用namespace来group资源。但如果你的用户量很小,但架构还是很复杂的,比如有很多模块,像logging, monitoring等等,那么还是可以使用namespace的。
2.2 use case-2:多个组开发同一个项目的时候
假设有两个组都在开发同一个项目,虽然项目是一样的,但组1在部署的时候,可能有自己的ConfigMap,组2也有自己的ConfigMap,这种情况下会造成相互干扰,所以可以使用namespace隔离开。
比如给组1 assign namespace1的权限,给组2 assign namespace2的权限,这样天然的就不会相互干扰了。
2.3 use case-3:同一个群集里有多个Stage(如Dev/Test等)
这种情况下nginx或是elastic等组件可以共用,所以也可以用namespace来分组。
2.4 use case-4:a/b发布
在production中,可能想要新功能只提供给某些特定的用户,而另外一些用户仍然使用现有版本,也就意味着在prod环境下要同时部署多个版本,这种情况下也可以使用namespace来隔离。
3. namespace中的资源
3.1 大部分资源都不能跨namespace访问
比如有个ConfigMap在namespace-a下面,那么在namespace-b下面,不能直接拿来使用。即:Each namespace must define own ConfigMap
。Secret
也一样。
但是service
是可以跨namespace访问的。比如在namespace-a下的项目,想要访问namespace-c下面的mysql,那么namespace-a下的ConfigMap除了指定service = mysql-service外,还必须加上namespace的后缀,即:dburl = mysql-service.namespace-c
。
3.2 有些资源是不能按namespace划分的
比如volume
或node
组件,是globally(全局)层面的资源,不能把它们分配给某个namespace。
可以使用命令kubectl api-resources --namespaced=falsec
列出不能被namespace化的资源。
4. 在namespace中创建组件
比如我们现在有个创建ConfigMap的yaml文件,我们想要在namespace-a中创建。
方式1:在kubectl apply后面加上参数-n <namespace name>即可,如:
方式2:在mysql-config.yaml的metadata中,除了声明name外,加上另一个属性,叫namespace,如下: image.pngkubectl apply -f mysql-config.yaml -n namespace-a
如果在yaml中声明了,那么在创建的时候就可以不需要额外加-n了,推荐把namespace放在yaml中。
另外,我们当前所在的namespace是default namespace,如果想要查看my-namespace下的组件,也需要加-n参数,如查看my-namespace下的所有的Pod:
kubectl get pod -n my-namespace
如果想要切换当前的namespace,kubectl并不提供这样的功能,需要额外安装工具:kubens
。
在MacOS下使用brew install kubectx
进行安装。安装好后,可以使用命令kubens
查看:
切换namespace:
image.png 这时候默认的namespace就从default切换到了my-namespace: image.pngkubens my-namespace