【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查看:

image.png

  • default:我们默认创建资源的地方。如通过kubectl apply -f ,如没有指定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

kubectl create namespace

image.png

也可以通过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 ConfigMapSecret也一样。

但是service是可以跨namespace访问的。比如在namespace-a下的项目,想要访问namespace-c下面的mysql,那么namespace-a下的ConfigMap除了指定service = mysql-service外,还必须加上namespace的后缀,即:dburl = mysql-service.namespace-c

3.2 有些资源是不能按namespace划分的

比如volumenode组件,是globally(全局)层面的资源,不能把它们分配给某个namespace。

可以使用命令kubectl api-resources --namespaced=falsec列出不能被namespace化的资源。

4. 在namespace中创建组件

比如我们现在有个创建ConfigMap的yaml文件,我们想要在namespace-a中创建。

方式1:在kubectl apply后面加上参数-n 即可,如:

kubectl apply -f mysql-config.yaml -n namespace-a

方式2:在mysql-config.yaml的metadata中,除了声明name外,加上另一个属性,叫namespace,如下:
image.png

如果在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查看:

image.png

切换namespace:

kubens my-namespace

image.png

这时候默认的namespace就从default切换到了my-namespace:
image.png

参考:
https://www.youtube.com/watch?v=X48VuDVv0do

你可能感兴趣的:(【k8s学习】kubernetes namespace介绍)