溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Kubernetes命名空間詳解

發(fā)布時(shí)間:2021-08-31 18:40:16 來源:億速云 閱讀:116 作者:chen 欄目:云計(jì)算

本篇內(nèi)容介紹了“Kubernetes命名空間詳解”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!


 

介  紹

Kubernetes集群可以同時(shí)管理大量互不相關(guān)的工作負(fù)載,而組織通常會(huì)選擇將不同團(tuán)隊(duì)創(chuàng)建的項(xiàng)目部署到共享集群上。隨著數(shù)量的增加,部署對(duì)象常常很快就會(huì)變得難以管理,拖慢操作響應(yīng)速度,并且會(huì)增加危險(xiǎn)錯(cuò)誤出現(xiàn)的概率。

Kubernetes使用命名空間的概念幫助解決集群中在管理對(duì)象時(shí)的復(fù)雜性問題。命名空間允許將對(duì)象分組到一起,便于將它們作為一個(gè)單元進(jìn)行篩選和控制。無論是應(yīng)用自定義的訪問控制策略,還是為了測(cè)試環(huán)境而分離所有組件,命名空間都是一個(gè)按照組來處理對(duì)象、強(qiáng)大且靈活的概念。

 
在本文中,我們會(huì)討論命名空間的工作原理,介紹一些常用實(shí)例,并分享如何使用命名空間來管理Kubernetes對(duì)象。最后,我們還會(huì)介紹一個(gè)叫做projects(項(xiàng)目)的Rancher特性,看它是如何構(gòu)建并擴(kuò)展命名空間的概念的。

什么是命名空間,為什么它很重要?

 
命名空間(namespace)是Kubernetes提供的組織機(jī)制,用于給集群中的任何對(duì)象組進(jìn)行分類、篩選和管理。每一個(gè)添加到Kubernetes集群的工作負(fù)載必須放在一個(gè)命名空間中。

 
命名空間為集群中的對(duì)象名稱賦予作用域。雖然在命名空間中名稱必須是唯一的,但是相同的名稱可以在不同的命名空間中使用。這對(duì)于某些場(chǎng)景來說可能幫助很大。例如,如果使用命名空間來劃分應(yīng)用程序生命周期環(huán)境(如開發(fā)、staging、生產(chǎn)),則可以在每個(gè)環(huán)境中維護(hù)利用同樣的名稱維護(hù)相同對(duì)象的副本。

命名空間還可以讓用戶輕松地將策略應(yīng)用到集群的具體部分。你可以通過定義ResourceQuota對(duì)象來控制資源的使用,該對(duì)象在每個(gè)命名空間的基礎(chǔ)上設(shè)置了使用資源的限制。類似地,當(dāng)在集群上使用支持網(wǎng)絡(luò)策略的CNI(容器網(wǎng)絡(luò)接口)時(shí),比如Calico或Canal(calico用于策略,flannel用于網(wǎng)絡(luò))。你可以將NetworkPolicy應(yīng)用到命名空間,其中的規(guī)則定義了pod之間如何彼此通信。不同的命名空間可以有不同的策略。

 
使用命名空間最大的好處之一是能夠利用Kubernetes RBAC(基于角色的訪問控制)。RBAC允許您在單個(gè)名稱下開發(fā)角色,這樣將權(quán)限或功能列表分組。ClusterRole對(duì)象用于定義集群規(guī)模的使用模式,而角色對(duì)象類型(Role object type)應(yīng)用于具體的命名空間,從而提供更好的控制和粒度。在角色創(chuàng)建后,RoleBinding可以將定義的功能授予單個(gè)命名空間上下文中的具體具體用戶或用戶組。通過這種方式,命名空間可以使得集群操作者能夠?qū)⑾嗤牟呗杂成涞浇M織好的資源集合。

常見的命名空間使用模式

命名空間是一種非常靈活的特性,它不強(qiáng)制使用特定的結(jié)構(gòu)或組織模式。不過盡管如此,還是有許多在團(tuán)隊(duì)內(nèi)常使用的模式。
 

將命名空間映射到團(tuán)隊(duì)或項(xiàng)目上

在設(shè)置命名空間時(shí)有一個(gè)慣例是,為每個(gè)單獨(dú)的項(xiàng)目或者團(tuán)隊(duì)創(chuàng)建一個(gè)命名空間。這和我們前面提到的許多命名空間的特性很好的結(jié)合在了一起。

通過給團(tuán)隊(duì)提供專門的命名空間,你可以用RBAC策略委托某些功能來實(shí)現(xiàn)自我管理和自動(dòng)化。比如從命名空間的RoleBinding對(duì)象中添加或刪除成員就是對(duì)團(tuán)隊(duì)資源訪問的一種簡(jiǎn)單方法。除此之外,給團(tuán)隊(duì)和項(xiàng)目設(shè)置資源配額也非常有用。有了這種方式,你可以根據(jù)組織的業(yè)務(wù)需求和優(yōu)先級(jí)合理地訪問資源。
 

使用命名空間對(duì)生命周期環(huán)境進(jìn)行分區(qū)

命名空間非常適合在集群中劃分開發(fā)、staging以及生產(chǎn)環(huán)境。通常情況下我們會(huì)被建議將生產(chǎn)工作負(fù)載部署到一個(gè)完全獨(dú)立的集群中,來確保最大程度的隔離。不過對(duì)于較小的團(tuán)隊(duì)和項(xiàng)目來說,命名空間會(huì)是一個(gè)可行的解決方案。

和前面的用例一樣,網(wǎng)絡(luò)策略、RBAC策略以及配額是實(shí)現(xiàn)用例的重要因素。在管理環(huán)境時(shí),通過將網(wǎng)絡(luò)隔離來控制和組件之間的通信能力是很有必要的。同樣,命名空間范圍的RBAC策略允許運(yùn)維人員為生產(chǎn)環(huán)節(jié)設(shè)置嚴(yán)格的權(quán)限。配額能夠確保對(duì)最敏感環(huán)境的重要資源的訪問。
 

重新使用對(duì)象名稱的能力在這里很有幫助。在測(cè)試和發(fā)布對(duì)象時(shí),可以把它們放到新環(huán)境中,同時(shí)保留其命名空間。這樣可以避免因?yàn)榄h(huán)境中出現(xiàn)相似的對(duì)象而產(chǎn)生的混淆,并且減少認(rèn)知開銷。

使用命名空間隔離不同的使用者

 
另一個(gè)命名空間可以解決的用例是根據(jù)使用者對(duì)工作負(fù)載進(jìn)行分段。比如,如果你的集群為多個(gè)客戶提供基礎(chǔ)設(shè)施,那么按命名空間進(jìn)行分段就能夠?qū)崿F(xiàn)管理每個(gè)客戶,同時(shí)跟蹤賬單的去向。
 

另外,命名空間的特性可以讓你控制網(wǎng)絡(luò)和訪問策略,為你的使用者定義不同的配額。在通用的情況下,命名空間允許你為每個(gè)用戶開發(fā)和部署相同模板化環(huán)境的不同實(shí)例。這種一致性可以大大簡(jiǎn)化管理和故障診斷的過程。
 

理解預(yù)配置的Kubernetes命名空間

 
在我們進(jìn)行創(chuàng)建命名空間之前,先討論一下Kubernetes是如何自動(dòng)設(shè)置它的。在默認(rèn)情況下,新的集群上有三個(gè)命名空間:

  • default:向集群中添加對(duì)象而不提供命名空間,這樣它會(huì)被放入默認(rèn)的命名空間中。在創(chuàng)建替代的命名空間之前,該命名空間會(huì)充當(dāng)用戶新添加資源的主要目的地,無法刪除。
     

  • kube-public:kube-public命名空間的目的是讓所有具有或不具有身份驗(yàn)證的用戶都能全局可讀。這對(duì)于公開bootstrap組件所需的集群信息非常有用。它主要是由Kubernetes自己管理。

  • kube-system:kube-system命名空間用于Kubernetes管理的Kubernetes組件,一般規(guī)則是,避免向該命名空間添加普通的工作負(fù)載。它一般由系統(tǒng)直接管理,因此具有相對(duì)寬松的策略。

雖然這些命名空間有效地將用戶工作負(fù)載與系統(tǒng)管理的工作負(fù)載隔離,但它們并不強(qiáng)制使用任何額外的結(jié)構(gòu)對(duì)應(yīng)用程序進(jìn)行分類和管理。比較友好的是,創(chuàng)建和使用額外的命名空間非常簡(jiǎn)單

 
使用命名空間

使用kubectl管理命名空間及其包含的資源相當(dāng)簡(jiǎn)單。在這一節(jié)中,我們將演示一些最常見的命名空間操作,便于你開始有效地分割資源。

查看現(xiàn)有的命名空間
 

要顯示集群中可用的所有命名空間,使用kubectl get namespaces命令:
 
Kubernetes命名空間詳解
  
該命令顯示了所有可用的命名空間,無論它們是否是活躍的。此外還有資源的時(shí)長(zhǎng)(age)。

如果想獲得更詳細(xì)的信息,使用kubectl describe命令:
 
Kubernetes命名空間詳解

Name:         default 

Labels:       field.cattle.io/projectId=p-cmn9g 

Annotations:  cattle.io/status={"Conditions":[{"Type":"ResourceQuotaInit","Status":"True","Message":"","LastUpdateTime":"2018-12-17T23:17:48Z"},{"Type":"InitialRolesPopulated","Status":"True","Message":"","LastUpda...              field.cattle.io/projectId=c-7tf7d:p-cmn9g              lifecycle.cattle.io/create.namespace-auth=true

Status:       Active

No resource quota.

No resource limits.

 
該命令用于顯示與命名空間關(guān)聯(lián)的標(biāo)簽和注釋,以及已經(jīng)應(yīng)用了的所有配額或資源限制。

創(chuàng)建命名空間
 

我們使用kubectl create namespace命令來創(chuàng)建命名空間。用命名空間的名稱作為該命令的參數(shù)。

 
Kubernetes命名空間詳解
 
你還可以通過文件,使用manifest來創(chuàng)建命名空間。例如,下面的文件定義了我們和上面一模一樣的命名空間。
 
Kubernetes命名空間詳解
 
假設(shè)上面的規(guī)范保存在demo-namespace.yml文件中。你可以輸入指令來使用它:
 
Kubernetes命名空間詳解
 
無論我們采用哪種方法創(chuàng)建命名空間,在我們?cè)俅螜z查可用命名空間時(shí),應(yīng)該能列出新的命名空間(我們使用ns——命名空間的縮寫,第二次進(jìn)行查詢):
 
Kubernetes命名空間詳解
 
我們新創(chuàng)建的命名空間已經(jīng)變?yōu)榭墒褂谩?/p>

根據(jù)命名空間篩選和執(zhí)行操作

如果我們將一個(gè)工作負(fù)載對(duì)象部署到集群而不指定命名空間,它將被添加到默認(rèn)命名空間:
 
Kubernetes命名空間詳解
 
我們可以使用kubectl來驗(yàn)證部署是否創(chuàng)建在默認(rèn)的命名空間:
 
Kubernetes命名空間詳解
 
如果我們嘗試再次使用相同的名稱創(chuàng)建部署,會(huì)得到命名空間沖突的錯(cuò)誤。
 
Kubernetes命名空間詳解
 
要將操作應(yīng)用于不同的命名空間,我們必須在命令中包含—namespace=這一選項(xiàng)。下面我們?cè)赿emo-namespace命名空間上創(chuàng)建具有相同名稱的部署:
 
Kubernetes命名空間詳解
 
這次部署成功了,盡管我們?nèi)匀皇褂玫氖窍嗤牟渴鹈Q。命名空間為資源名稱提供了不同的作用域,避免了前面所經(jīng)歷的命名沖突。
 

如果想查看新部署的詳細(xì)信息,我們?cè)俅问褂谩猲amespace=選項(xiàng)指定命名空間:
 
Kubernetes命名空間詳解
 
這說明我們已經(jīng)在demo-namespace命名空間創(chuàng)建了另一個(gè)名為demo-nginx的部署。
 
通過設(shè)置Context選擇命名空間
 

如果希望避免為每個(gè)命令提供同樣的命名空間,可以通過配置kubectl的context來改變命令作用的默認(rèn)命名空間。這會(huì)修改操作在context活躍時(shí)應(yīng)用到的命名空間。
 

列出context配置的細(xì)節(jié),輸入:
 
Kubernetes命名空間詳解
 
上圖說明我們使用了一個(gè)名為Default的context,context沒有指定命名空間,因此使用了默認(rèn)命名空間。

想要將該context使用的命名空間修改成demo-context,我們輸入:
 
Kubernetes命名空間詳解
 
我們可以在此查看context配置來驗(yàn)證當(dāng)前是否選擇了demo-namespace:
 
Kubernetes命名空間詳解
 
驗(yàn)證我們的kubectl describe命令現(xiàn)在默認(rèn)使用demo-namespace,它會(huì)請(qǐng)求我們的demo-nginx部署而不需要指定命名空間:
 
Kubernetes命名空間詳解
 
刪除命名空間并清理

 
如果不需要命名空間了,我們可以刪除它。

刪除命名空間這一功能非常強(qiáng)大,因?yàn)樗粌H刪除命名空間,還會(huì)清理其中部署了的所有資源。這一功能非常方便,但是同時(shí)如果你一不小心,也會(huì)非常危險(xiǎn)。

在刪除之前,最好列出和命名空間相關(guān)的資源,確定想要?jiǎng)h除的對(duì)象:
 
Kubernetes命名空間詳解
 
一旦確定了要操作的范圍,可以輸入下面的命令刪除demo-namespace命名空間和其中的所有資源:
 
Kubernetes命名空間詳解
 
命名空間及其資源將從集群中刪除
 
Kubernetes命名空間詳解
 
如果你之前在kubectl上下文中更改了所選的命名空間,那么輸入下面的命令清除所選的命名空間:
 
Kubernetes命名空間詳解
 
在清理demo資源時(shí),請(qǐng)記住刪除我們最初提供給默認(rèn)命名空間的原始demo-nginx部署:
 
Kubernetes命名空間詳解
 
現(xiàn)在你的集群應(yīng)該處于一開始的狀態(tài)了。

使用Rancher的Project擴(kuò)展命名空間
 

如果你使用Rancher來管理Kubernetes集群,那么你就可以使用projects特性提供的擴(kuò)展功能。Rancher里的Project是一個(gè)額外的組織層,用于將多個(gè)命名空間綁定在一起。

Rancher的project在命名空間上覆蓋了一個(gè)控制結(jié)構(gòu),允許你將命名空間分組成邏輯單元并對(duì)其應(yīng)用相應(yīng)的策略。Project在大多數(shù)情況下反映了命名空間,但它是作為命名空間的容器而不是單獨(dú)的工作負(fù)載資源。Rancher中的每個(gè)命名空間只存在于一個(gè)project中,命名空間繼承應(yīng)用于該項(xiàng)目的所有策略。
 

在默認(rèn)情況下,Rancher集群定義了兩個(gè)project:

  • Default:該project包含了默認(rèn)命名空間

  • System:該project包含所有其他預(yù)配置的命名空間,包括kube-public、kube-system和系統(tǒng)提供的所有命名空間
     

在選擇了集群之后,你可以通過訪問Projects/Namespaces選項(xiàng)卡來查看集群中可用的項(xiàng)目:
 
Kubernetes命名空間詳解
 
在這里,單擊Add Project按鈕來添加project。在新建project時(shí),你可以配置project成員及其訪問權(quán)限,還可以配置安全策略和資源配額。

你還可以點(diǎn)擊project的Add Namespace按鈕向現(xiàn)有的項(xiàng)目添加命名空間。如果要將命名空間移動(dòng)到不同的project上,請(qǐng)先選擇命名空間,單擊Move按鈕。將命名空間移動(dòng)到新project中的開關(guān)會(huì)立即修改應(yīng)用于該命名空間的權(quán)限和策略。

Rancher的project沒有引入新的組織模型,而是簡(jiǎn)單地將相同的抽象應(yīng)用到了命名空間上,而命名空間作用于工作負(fù)載對(duì)象。如果你喜歡使用命名空間,但是又需要額外的控制層的話,那么它們就能夠填補(bǔ)這一使用上的空白。

 

“Kubernetes命名空間詳解”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI