使用命名空間分享叢集

本頁說明如何檢視、使用和刪除命名空間。本頁也說明如何使用 Kubernetes 命名空間來細分您的叢集。

準備開始

檢視命名空間

使用以下命令列出叢集中目前的命名空間

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 參考中的命名空間

建立新的命名空間

建立一個名為 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 叢集。

其透過提供以下功能來達成此目的:

  1. 名稱的範疇。
  2. 將授權和策略附加到叢集子區段的機制。

多個命名空間的使用是選用的。

每個使用者社群都希望能夠與其他社群隔離地工作。每個使用者社群都有自己的

  1. 資源(Pod、服務、複製控制器等)
  2. 策略(誰可以在其社群中執行或不能執行動作)
  3. 約束(允許此社群使用多少配額等)

叢集管理員可以為每個獨特的使用者社群建立一個命名空間。

命名空間為以下項目提供獨特的範疇:

  1. 具名資源(以避免基本的命名衝突)
  2. 委派給受信任使用者的管理權限
  3. 限制社群資源消耗的能力

使用案例包括:

  1. 作為叢集管理員,我希望在單一叢集上支援多個使用者社群。
  2. 作為叢集管理員,我希望將叢集分區的權限委派給這些社群中受信任的使用者。
  3. 作為叢集管理員,我希望限制每個社群可以消耗的資源量,以限制對使用該叢集的其他社群的影響。
  4. 作為叢集使用者,我希望與與我的使用者社群相關的資源互動,而不會受到叢集上其他使用者社群正在執行的操作影響。

了解命名空間和 DNS

當您建立 服務 時,它會建立對應的 DNS 項目。此項目的格式為 <service-name>.<namespace-name>.svc.cluster.local,這表示如果容器使用 <service-name>,它將解析為命名空間本機的服務。這對於跨多個命名空間(例如開發、預備和生產環境)使用相同的配置非常有用。如果您想要跨命名空間存取,則需要使用完整網域名稱 (FQDN)。

接下來

上次修改時間:2023 年 8 月 1 日下午 5:31 PST:add kube-node-lease namespace (973280594f)