使用名稱空間共享叢集
此頁面展示瞭如何檢視、使用和刪除名稱空間。此頁面還展示瞭如何使用 Kubernetes 名稱空間來細分你的叢集。
準備工作
- 擁有現有的 Kubernetes 叢集。
- 你對 Kubernetes 的Pod、Service 和Deployment 有基本的瞭解。
檢視名稱空間
使用以下命令列出叢集中的當前名稱空間
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
,它允許觀測者在名稱空間被刪除時清理資源。請記住,如果你指定了一個不存在的 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 叢集劃分為兩個名稱空間: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、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 叢集。
它透過提供以下功能實現此目的:
- 名稱的作用域。
- 一種將授權和策略附加到叢集子部分中的機制。
使用多個名稱空間是可選的。
每個使用者社群都希望能夠獨立於其他社群工作。每個使用者社群都有自己的
- 資源(Pod、Service、ReplicationController 等)
- 策略(誰可以在其社群中執行或不能執行操作)
- 約束(此社群被允許多少配額等)
叢集操作員可以為每個獨特的使用者社群建立一個名稱空間。
名稱空間提供了獨特的範圍,用於
- 命名資源(以避免基本的命名衝突)
- 將管理許可權委託給受信任的使用者
- 限制社群資源消耗的能力
用例包括
- 作為叢集操作員,我希望在單個叢集上支援多個使用者社群。
- 作為叢集操作員,我希望將叢集分割槽的許可權委託給這些社群中受信任的使用者。
- 作為叢集操作員,我希望限制每個社群可以消耗的資源量,以限制對使用叢集的其他社群的影響。
- 作為叢集使用者,我希望與我的使用者社群相關的資源進行互動,而無需擔心其他使用者社群在叢集上做什麼。
理解名稱空間和 DNS
當你建立一個 Service 時,它會建立一個相應的 DNS 條目。 此條目的形式為
,這意味著如果容器使用
,它將解析為本地名稱空間中的 Service。 這對於在多個名稱空間(例如 Development、Staging 和 Production)中使用相同的配置非常有用。 如果你想跨名稱空間訪問,你需要使用完全限定域名(FQDN)。