使用名稱空間共享叢集

此頁面展示瞭如何檢視、使用和刪除名稱空間。此頁面還展示瞭如何使用 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,它允許觀測者在名稱空間被刪除時清理資源。請記住,如果你指定了一個不存在的 finalizer,名稱空間將被建立,但如果使用者嘗試刪除它,它將卡在 Terminating 狀態。

有關 finalizers 的更多資訊,請參閱名稱空間設計文件

刪除名稱空間

使用以下命令刪除名稱空間

kubectl delete namespaces <insert-some-namespace-name>

此刪除是非同步的,因此在一段時間內你會看到名稱空間處於 Terminating 狀態。

使用 Kubernetes 名稱空間細分你的叢集

預設情況下,Kubernetes 叢集在配置叢集時會例項化一個預設名稱空間,以儲存叢集使用的預設 Pod、Service 和 Deployment。

假設你有一個全新的叢集,你可以透過以下方式檢查可用的名稱空間

kubectl get namespaces
NAME      STATUS    AGE
default   Active    13m

建立新的名稱空間

在本練習中,我們將建立另外兩個 Kubernetes 名稱空間來儲存我們的內容。

在組織使用共享 Kubernetes 叢集進行開發和生產用例的場景中

  • 開發團隊希望在叢集中維護一個空間,他們可以在其中檢視用於構建和執行應用程式的 Pod、Service 和 Deployment 列表。在這個空間中,Kubernetes 資源會來來去去,對誰可以或不可以修改資源的限制會放寬,以實現敏捷開發。

  • 運營團隊希望在叢集中維護一個空間,他們可以在其中嚴格執行誰可以或不可以操作執行生產站點的 Pod、Service 和 Deployment 集的程式。

該組織可以遵循的一種模式是將 Kubernetes 叢集劃分為兩個名稱空間:developmentproduction。讓我們建立兩個新的名稱空間來容納我們的工作。

使用 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、Service 和 Deployment 提供作用域。與一個名稱空間互動的使用者不會看到另一個名稱空間中的內容。為了演示這一點,讓我們在 development 名稱空間中啟動一個簡單的 Deployment 和 Pod。

kubectl create deployment snowflake \
  --image=registry.k8s.io/serve_hostname \
  -n=development --replicas=2

我們建立了一個副本大小為 2 的 Deployment,它執行名為 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

生產環境喜歡執行“畜群”,所以讓我們建立一些“畜群” 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、Service、ReplicationController 等)
  2. 策略(誰可以在其社群中執行或不能執行操作)
  3. 約束(此社群被允許多少配額等)

叢集操作員可以為每個獨特的使用者社群建立一個名稱空間。

名稱空間提供了獨特的範圍,用於

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

用例包括

  1. 作為叢集操作員,我希望在單個叢集上支援多個使用者社群。
  2. 作為叢集操作員,我希望將叢集分割槽的許可權委託給這些社群中受信任的使用者。
  3. 作為叢集操作員,我希望限制每個社群可以消耗的資源量,以限制對使用叢集的其他社群的影響。
  4. 作為叢集使用者,我希望與我的使用者社群相關的資源進行互動,而無需擔心其他使用者社群在叢集上做什麼。

理解名稱空間和 DNS

當你建立一個 Service 時,它會建立一個相應的 DNS 條目。 此條目的形式為 ..svc.cluster.local,這意味著如果容器使用 ,它將解析為本地名稱空間中的 Service。 這對於在多個名稱空間(例如 Development、Staging 和 Production)中使用相同的配置非常有用。 如果你想跨名稱空間訪問,你需要使用完全限定域名(FQDN)。

下一步

上次修改時間:2023 年 8 月 1 日下午 5:31 PST:新增 kube-node-lease 名稱空間 (973280594f)