【本文目標(biāo)】
- What is a namespace?
- What are the use cases?
- How namespaces work and how to use it?
【前置文章】
- 【k8s學(xué)習(xí)】Kubernetes學(xué)習(xí)——核心組件和架構(gòu)
- 【k8s學(xué)習(xí)】minikube、kubectl苇经、yaml配置文件的介紹
- 【k8s學(xué)習(xí)】在minikube上布署MongoDB和MongoExpress
1. Namespace
官網(wǎng):https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/namespaces/
-
Organize resources in namespace
:Kubernetes的namespace是對(duì)資源的劃分仓洼,不同的Namespace中的資源是相互隔離的。 -
Virtual cluster inside a cluster
:可以看作是集群中的虛似集群险绘√呔可以有多個(gè)namespace。
1.1 集群的4個(gè)默認(rèn)的namespace
Kubernetes默認(rèn)就會(huì)有4個(gè)namespaces宦棺“昃啵可以通過(guò)命令kubectl get namespace
查看:
-
default
:我們默認(rèn)創(chuàng)建資源的地方。如通過(guò)kubectl apply -f <filename>
代咸,如沒(méi)有指定namespace蹈丸,那么默認(rèn)就在default下創(chuàng)建。 -
kube-node-lease
:各個(gè)節(jié)點(diǎn)的心跳呐芥。 -
kube-public
:可以公開(kāi)訪問(wèn)的數(shù)據(jù)白华,如存放了集群信息的ConfigMap。比如我們使用命令kubectl cluster-info
拿到的集群信息贩耐,就是來(lái)自這個(gè)namespace下的數(shù)據(jù)弧腥。 -
kube-system
:一般給System組件用的如Master相關(guān)的或是kubectl自身組件相關(guān)的。不推薦在這個(gè)namespace上新增資源或修改現(xiàn)有資源潮太。 -
kubernetes-dashboard
:minikube only管搪。
1.2 創(chuàng)建namespace
kubectl create namespace <name>
也可以通過(guò)yaml配置文件創(chuàng)建namespace虾攻。
2. Namespace use cases
use case-1:根據(jù)功能來(lái)區(qū)別
如果我們只有default namespace,然后我們?cè)赿efault下面創(chuàng)建了太多的deployment更鲁,replicaset霎箍,pod以及service,以致于我們?cè)诓榭吹臅r(shí)候眼花繚亂澡为。
這時(shí)候我們就需要對(duì)我們的資源進(jìn)行分組了漂坏,比如:
- database namespace:用來(lái)放db相關(guān)的資源。
- monitoring namespace:用來(lái)放monitor相關(guān)的資源顶别。
- elastic stack namespace:用來(lái)放elastic驯绎、kibana相關(guān)的資源。
- nginx-ingress namespace:用來(lái)放nginx相關(guān)的資源谋旦。
根據(jù)Kubernetes官網(wǎng)建議册着,如果你的項(xiàng)目架構(gòu)很小演熟,用戶量也很小,那么也不需要使用namespace來(lái)group資源。但如果你的用戶量很小获三,但架構(gòu)還是很復(fù)雜的,比如有很多模塊贞谓,像logging, monitoring等等,那么還是可以使用namespace的晕城。
2.2 use case-2:多個(gè)組開(kāi)發(fā)同一個(gè)項(xiàng)目的時(shí)候
假設(shè)有兩個(gè)組都在開(kāi)發(fā)同一個(gè)項(xiàng)目,雖然項(xiàng)目是一樣的,但組1在部署的時(shí)候几睛,可能有自己的ConfigMap夯接,組2也有自己的ConfigMap,這種情況下會(huì)造成相互干擾逊拍,所以可以使用namespace隔離開(kāi)。
比如給組1 assign namespace1的權(quán)限缨恒,給組2 assign namespace2的權(quán)限血巍,這樣天然的就不會(huì)相互干擾了玫恳。
2.3 use case-3:同一個(gè)群集里有多個(gè)Stage(如Dev/Test等)
這種情況下nginx或是elastic等組件可以共用帆焕,所以也可以用namespace來(lái)分組。
2.4 use case-4:a/b發(fā)布
在production中,可能想要新功能只提供給某些特定的用戶,而另外一些用戶仍然使用現(xiàn)有版本,也就意味著在prod環(huán)境下要同時(shí)部署多個(gè)版本还蹲,這種情況下也可以使用namespace來(lái)隔離。
3. namespace中的資源
3.1 大部分資源都不能跨namespace訪問(wèn)
比如有個(gè)ConfigMap在namespace-a下面耙考,那么在namespace-b下面,不能直接拿來(lái)使用斗遏。即:Each namespace must define own ConfigMap
最易。Secret
也一樣。
但是service
是可以跨namespace訪問(wèn)的汪茧。比如在namespace-a下的項(xiàng)目弥虐,想要訪問(wèn)namespace-c下面的mysql扩灯,那么namespace-a下的ConfigMap除了指定service = mysql-service外,還必須加上namespace的后綴,即:dburl = mysql-service.namespace-c
捻撑。
3.2 有些資源是不能按namespace劃分的
比如volume
或node
組件,是globally(全局)層面的資源缤底,不能把它們分配給某個(gè)namespace顾患。
可以使用命令kubectl api-resources --namespaced=falsec
列出不能被namespace化的資源。
4. 在namespace中創(chuàng)建組件
比如我們現(xiàn)在有個(gè)創(chuàng)建ConfigMap的yaml文件训堆,我們想要在namespace-a中創(chuàng)建描验。
方式1:在kubectl apply后面加上參數(shù)-n <namespace name>即可白嘁,如:
方式2:在mysql-config.yaml的metadata中坑鱼,除了聲明name外,加上另一個(gè)屬性絮缅,叫namespace鲁沥,如下:kubectl apply -f mysql-config.yaml -n namespace-a
如果在yaml中聲明了,那么在創(chuàng)建的時(shí)候就可以不需要額外加-n了耕魄,推薦把namespace放在yaml中画恰。
另外,我們當(dāng)前所在的namespace是default namespace吸奴,如果想要查看my-namespace下的組件允扇,也需要加-n參數(shù),如查看my-namespace下的所有的Pod:
kubectl get pod -n my-namespace
如果想要切換當(dāng)前的namespace则奥,kubectl并不提供這樣的功能考润,需要額外安裝工具:kubens
。
在MacOS下使用brew install kubectx
進(jìn)行安裝读处。安裝好后糊治,可以使用命令kubens
查看:
切換namespace:
kubens my-namespace