使用命名空間分享叢集
本頁說明如何檢視、使用和刪除命名空間。本頁也說明如何使用 Kubernetes 命名空間來細分您的叢集。
準備開始
- 擁有現有的 Kubernetes 叢集。
- 您已基本了解 Kubernetes Pod、服務和部署。
檢視命名空間
使用以下命令列出叢集中目前的命名空間
kubectl get namespaces
NAME STATUS AGE
default Active 11d
kube-node-lease Active 11d
kube-public Active 11d
kube-system Active 11d
Kubernetes 啟動時會建立四個初始命名空間
default
沒有其他命名空間的物件之預設命名空間kube-node-lease
此命名空間保存與每個節點相關聯的 Lease 物件。節點租約允許 kubelet 發送心跳訊號,以便控制平面可以偵測節點故障。kube-public
此命名空間會自動建立,並且所有使用者(包括未經身份驗證的使用者)都可讀取。此命名空間主要保留供叢集使用,以防某些資源應在整個叢集中公開可見和可讀。此命名空間的公開方面僅是一種慣例,而非要求。kube-system
由 Kubernetes 系統建立的物件之命名空間
您也可以使用以下命令取得特定命名空間的摘要
kubectl get namespaces <name>
或者您可以使用以下命令取得詳細資訊
kubectl describe namespaces <name>
Name: default
Labels: <none>
Annotations: <none>
Status: Active
No resource quota.
Resource Limits
Type Resource Min Max Default
---- -------- --- --- ---
Container cpu - - 100m
請注意,這些詳細資訊同時顯示資源配額(如果存在)以及資源限制範圍。
資源配額追蹤命名空間中資源的彙總使用量,並允許叢集操作員定義命名空間可能消耗的硬性資源使用量限制。
限制範圍定義單一實體可以在命名空間中消耗的資源量之最小/最大約束。
請參閱許可控制:限制範圍
命名空間可以處於以下兩種階段之一
Active
命名空間正在使用中Terminating
命名空間正在刪除中,且不能用於新物件
如需更多詳細資訊,請參閱 API 參考中的命名空間。
建立新的命名空間
請注意
避免建立以kube-
為字首的命名空間,因為它保留給 Kubernetes 系統命名空間使用。建立一個名為 my-namespace.yaml
的新 YAML 檔案,內容如下
apiVersion: v1
kind: Namespace
metadata:
name: <insert-namespace-name-here>
然後執行
kubectl create -f ./my-namespace.yaml
或者,您可以使用以下命令建立命名空間
kubectl create namespace <insert-namespace-name-here>
您的命名空間名稱必須是有效的 DNS 標籤。
有一個選用欄位 finalizers
,允許觀察者在命名空間刪除時清除資源。請記住,如果您指定不存在的終止器,則會建立命名空間,但如果使用者嘗試刪除它,則會卡在 Terminating
狀態。
有關 finalizers
的更多資訊,請參閱命名空間設計文件。
刪除命名空間
使用以下命令刪除命名空間
kubectl delete namespaces <insert-some-namespace-name>
警告
這會刪除命名空間下的所有內容!此刪除是非同步的,因此在一段時間內您會看到命名空間處於 Terminating
狀態。
使用 Kubernetes 命名空間細分您的叢集
預設情況下,Kubernetes 叢集在佈建叢集時會實例化一個預設命名空間,以保存叢集使用的預設 Pod、服務和部署集。
假設您有一個全新的叢集,您可以透過執行以下操作來檢視可用的命名空間
kubectl get namespaces
NAME STATUS AGE
default Active 13m
建立新的命名空間
在本練習中,我們將建立兩個額外的 Kubernetes 命名空間來保存我們的內容。
在組織將共用 Kubernetes 叢集用於開發和生產用例的情境中
開發團隊希望在叢集中維護一個空間,他們可以在其中檢視用於建置和執行其應用程式的 Pod、服務和部署列表。在這個空間中,Kubernetes 資源來來去去,並且放寬了誰可以或不能修改資源的限制,以實現敏捷開發。
維運團隊希望在叢集中維護一個空間,他們可以在其中對誰可以或不能操作執行生產網站的 Pod、服務和部署集強制執行嚴格的程序。
這個組織可以遵循的一種模式是將 Kubernetes 叢集劃分為兩個命名空間:development 和 production。讓我們建立兩個新的命名空間來保存我們的工作。
使用 kubectl 建立 development 命名空間
kubectl create -f https://k8s.io/examples/admin/namespace-dev.json
然後讓我們使用 kubectl 建立 production 命名空間
kubectl create -f https://k8s.io/examples/admin/namespace-prod.json
為了確保一切正確,請列出我們叢集中的所有命名空間。
kubectl get namespaces --show-labels
NAME STATUS AGE LABELS
default Active 32m <none>
development Active 29s name=development
production Active 23s name=production
在每個命名空間中建立 Pod
Kubernetes 命名空間為叢集中的 Pod、服務和部署提供範圍。與一個命名空間互動的使用者不會看到另一個命名空間中的內容。為了示範這一點,讓我們在 development 命名空間中啟動一個簡單的部署和 Pod。
kubectl create deployment snowflake \
--image=registry.k8s.io/serve_hostname \
-n=development --replicas=2
我們已建立一個副本大小為 2 的部署,該部署正在執行名為 snowflake
的 Pod,其中包含一個提供主機名稱的基本容器。
kubectl get deployment -n=development
NAME READY UP-TO-DATE AVAILABLE AGE
snowflake 2/2 2 2 2m
kubectl get pods -l app=snowflake -n=development
NAME READY STATUS RESTARTS AGE
snowflake-3968820950-9dgr8 1/1 Running 0 2m
snowflake-3968820950-vgc4n 1/1 Running 0 2m
這很棒,開發人員可以做他們想做的事情,而且他們不必擔心影響 production 命名空間中的內容。
讓我們切換到 production 命名空間,並展示一個命名空間中的資源如何對另一個命名空間隱藏。production 命名空間應為空,並且以下命令應傳回任何內容。
kubectl get deployment -n=production
kubectl get pods -n=production
Production 喜歡執行 cattle,所以讓我們建立一些 cattle Pod。
kubectl create deployment cattle --image=registry.k8s.io/serve_hostname -n=production
kubectl scale deployment cattle --replicas=5 -n=production
kubectl get deployment -n=production
NAME READY UP-TO-DATE AVAILABLE AGE
cattle 5/5 5 5 10s
kubectl get pods -l app=cattle -n=production
NAME READY STATUS RESTARTS AGE
cattle-2263376956-41xy6 1/1 Running 0 34s
cattle-2263376956-kw466 1/1 Running 0 34s
cattle-2263376956-n4v97 1/1 Running 0 34s
cattle-2263376956-p5p3i 1/1 Running 0 34s
cattle-2263376956-sxpth 1/1 Running 0 34s
此時,應該很清楚使用者在一個命名空間中建立的資源對另一個命名空間是隱藏的。
隨著 Kubernetes 中原則支援的發展,我們將擴展此情境,以展示如何為每個命名空間提供不同的授權規則。
了解使用命名空間的動機
單一叢集應能夠滿足多個使用者或使用者群體的需求(在本文中後續稱為使用者社群)。
Kubernetes 命名空間 協助不同的專案、團隊或客戶共用一個 Kubernetes 叢集。
其透過提供以下功能來達成此目的:
- 名稱的範疇。
- 將授權和策略附加到叢集子區段的機制。
多個命名空間的使用是選用的。
每個使用者社群都希望能夠與其他社群隔離地工作。每個使用者社群都有自己的
- 資源(Pod、服務、複製控制器等)
- 策略(誰可以在其社群中執行或不能執行動作)
- 約束(允許此社群使用多少配額等)
叢集管理員可以為每個獨特的使用者社群建立一個命名空間。
命名空間為以下項目提供獨特的範疇:
- 具名資源(以避免基本的命名衝突)
- 委派給受信任使用者的管理權限
- 限制社群資源消耗的能力
使用案例包括:
- 作為叢集管理員,我希望在單一叢集上支援多個使用者社群。
- 作為叢集管理員,我希望將叢集分區的權限委派給這些社群中受信任的使用者。
- 作為叢集管理員,我希望限制每個社群可以消耗的資源量,以限制對使用該叢集的其他社群的影響。
- 作為叢集使用者,我希望與與我的使用者社群相關的資源互動,而不會受到叢集上其他使用者社群正在執行的操作影響。
了解命名空間和 DNS
當您建立 服務 時,它會建立對應的 DNS 項目。此項目的格式為 <service-name>.<namespace-name>.svc.cluster.local
,這表示如果容器使用 <service-name>
,它將解析為命名空間本機的服務。這對於跨多個命名空間(例如開發、預備和生產環境)使用相同的配置非常有用。如果您想要跨命名空間存取,則需要使用完整網域名稱 (FQDN)。
接下來
- 深入了解設定命名空間偏好設定。
- 深入了解為請求設定命名空間
- 請參閱命名空間設計。