隨著集群規(guī)模的擴(kuò)大和業(yè)務(wù)復(fù)雜度的增加,如何有效地管理和組織資源成為了一個(gè)重要的問題。為了解決這個(gè)問題,Kubernetes提供了名字空間(Namespace)這一強(qiáng)大的功能,它允許將集群中的資源進(jìn)行細(xì)分,從而實(shí)現(xiàn)更好的資源隔離和管理。接下來將詳細(xì)介紹如何使用Kubernetes名字空間來細(xì)分集群。
Kubernetes 名字空間有助于不同的項(xiàng)目、團(tuán)隊(duì)或客戶去共享 Kubernetes 集群。名字空間通過以下方式實(shí)現(xiàn):
- 為名字設(shè)置作用域;
- 為集群中的部分資源關(guān)聯(lián)鑒權(quán)和策略的機(jī)制。
使用多個(gè)名字空間是可選的。
一、準(zhǔn)備
必須擁有一個(gè) Kubernetes 的集群,同時(shí)必須配置 kubectl 命令行工具與集群通信。 建議在至少有兩個(gè)不作為控制平面主機(jī)的節(jié)點(diǎn)的集群上運(yùn)行本教程。 如果還沒有集群,可以通過 Minikube 構(gòu)建一個(gè)自己的集群,或者可以使用下面的 Kubernetes 練習(xí)環(huán)境之一:
- Killercoda
- 玩轉(zhuǎn) Kubernetes
要獲知版本信息,請輸入 kubectl version.
二、環(huán)境準(zhǔn)備
此示例作如下假設(shè):
- 已擁有一個(gè)配置好的 Kubernetes 集群;
- 已對 Kubernetes 的 Pod、 服務(wù) 和 Deployment 有基本理解。
三、理解默認(rèn)名字空間
默認(rèn)情況下,Kubernetes 集群會在配置集群時(shí)實(shí)例化一個(gè)默認(rèn)名字空間,用以存放集群所使用的默認(rèn) Pod、Service 和 Deployment 集合。
假設(shè)有一個(gè)新的集群,可以通過執(zhí)行以下操作來檢查可用的名字空間:
kubectl get namespaces
NAME??????STATUS????AGE
default???Active????13m
四、創(chuàng)建新名字空間
在本練習(xí)中,將創(chuàng)建兩個(gè)額外的 Kubernetes 名字空間來保存的內(nèi)容。假設(shè)一個(gè)場景,某組織正在使用共享的 Kubernetes 集群來支持開發(fā)和生產(chǎn):
- 開發(fā)團(tuán)隊(duì)希望在集群中維護(hù)一個(gè)空間,以便他們可以查看用于構(gòu)建和運(yùn)行其應(yīng)用程序的 Pod、Service 和 Deployment 列表。在這個(gè)空間里,Kubernetes 資源被自由地加入或移除, 對誰能夠或不能修改資源的限制被放寬,以實(shí)現(xiàn)敏捷開發(fā)。
- 運(yùn)維團(tuán)隊(duì)希望在集群中維護(hù)一個(gè)空間,以便他們可以強(qiáng)制實(shí)施一些嚴(yán)格的規(guī)程, 對誰可以或誰不可以操作運(yùn)行生產(chǎn)站點(diǎn)的 Pod、Service 和 Deployment 集合進(jìn)行控制。
- 該組織可以遵循的一種模式是將 Kubernetes 集群劃分為兩個(gè)名字空間:development 和 production。
讓創(chuàng)建兩個(gè)新的名字空間來保存的工作。
文件 namespace-dev.yaml 描述了 development 名字空間:
apiVersion: v1 kind: Namespace metadata: name: development labels: name: development
使用 kubectl 創(chuàng)建 development 名字空間。
kubectl create -f https://k8s.io/examples/admin/namespace-dev.yaml
將下列的內(nèi)容保存到文件 namespace-prod.yaml 中, 這些內(nèi)容是對 production 名字空間的描述:
apiVersion: v1 kind: Namespace metadata: name: production labels: name: production
讓使用 kubectl 創(chuàng)建 production 名字空間。
kubectl create -f https://k8s.io/examples/admin/namespace-prod.yaml
為了確保一切正常,列出集群中的所有名字空間。
kubectl get namespaces --show-labels
NAME??????????STATUS????AGE???????LABELS
default???????Active????32m???????<none>
development???Active????29s???????name=development
production????Active????23s???????name=production
五、創(chuàng)建Pod
Kubernetes 名字空間為集群中的 Pod、Service 和 Deployment 提供了作用域。與一個(gè)名字空間交互的用戶不會看到另一個(gè)名字空間中的內(nèi)容。
為了演示這一點(diǎn),讓在 development 名字空間中啟動一個(gè)簡單的 Deployment 和 Pod。首先檢查一下當(dāng)前的上下文:
kubectl config view
apiVersion: v1 clusters: - cluster: certificate-authority-data: REDACTED server: https://130.211.122.180 name: lithe-cocoa-92103_kubernetes contexts: - context: cluster: lithe-cocoa-92103_kubernetes user: lithe-cocoa-92103_kubernetes name: lithe-cocoa-92103_kubernetes current-context: lithe-cocoa-92103_kubernetes kind: Config preferences: {} users: - name: lithe-cocoa-92103_kubernetes user: client-certificate-data: REDACTED client-key-data: REDACTED token: 65rZW78y8HbwXXtSXuUw9DbP4FLjHi4b - name: lithe-cocoa-92103_kubernetes-basic-auth user: password: h5M0FtUUIflBSdI7 username: admin
kubectl config current-context
lithe-cocoa-92103_kubernetes
下一步是為 kubectl 客戶端定義一個(gè)上下文,以便在每個(gè)名字空間中工作。 “cluster” 和 “user” 字段的值將從當(dāng)前上下文中復(fù)制。
<code?class="language-shell"?data-lang="shell">kubectl?config?set-context?dev?--namespace=development?\ ??--cluster=lithe-cocoa-92103_kubernetes?\ ??--user=lithe-cocoa-92103_kubernetes kubectl?config?set-context?prod?--namespace=production?\ ??--cluster=lithe-cocoa-92103_kubernetes?\ ??--user=lithe-cocoa-92103_kubernetes
默認(rèn)情況下,上述命令會添加兩個(gè)上下文到 .kube/config 文件中。 現(xiàn)在可以查看上下文并根據(jù)希望使用的名字空間并在這兩個(gè)新的請求上下文之間切換。
查看新的上下文:
kubectl config view
apiVersion: v1 clusters: - cluster: certificate-authority-data: REDACTED server: https://130.211.122.180 name: lithe-cocoa-92103_kubernetes contexts: - context: cluster: lithe-cocoa-92103_kubernetes user: lithe-cocoa-92103_kubernetes name: lithe-cocoa-92103_kubernetes - context: cluster: lithe-cocoa-92103_kubernetes namespace: development user: lithe-cocoa-92103_kubernetes name: dev - context: cluster: lithe-cocoa-92103_kubernetes namespace: production user: lithe-cocoa-92103_kubernetes name: prod current-context: lithe-cocoa-92103_kubernetes kind: Config preferences: {} users: - name: lithe-cocoa-92103_kubernetes user: client-certificate-data: REDACTED client-key-data: REDACTED token: 65rZW78y8HbwXXtSXuUw9DbP4FLjHi4b - name: lithe-cocoa-92103_kubernetes-basic-auth user: password: h5M0FtUUIflBSdI7 username: admin
切換到 development 名字空間進(jìn)行操作。
kubectl config use-context dev
可以使用下列命令驗(yàn)證當(dāng)前上下文:
kubectl config current-context
dev
此時(shí),從命令行向 Kubernetes 集群發(fā)出的所有請求都限定在 development 名字空間中。
讓創(chuàng)建一些內(nèi)容。
apiVersion: apps/v1 kind: Deployment metadata: labels: app: snowflake name: snowflake spec: replicas: 2 selector: matchLabels: app: snowflake template: metadata: labels: app: snowflake spec: containers: - image: registry.k8s.io/serve_hostname imagePullPolicy: Always name: snowflake
應(yīng)用清單文件來創(chuàng)建 Deployment。
kubectl apply -f https://k8s.io/examples/admin/snowflake-deployment.yaml
創(chuàng)建了一個(gè)副本大小為 2 的 Deployment,該 Deployment 運(yùn)行名為 snowflake 的 Pod, 其中包含一個(gè)僅提供主機(jī)名服務(wù)的基本容器。
kubectl get deployment
NAME?????????READY???UP-TO-DATE???AVAILABLE???AGE
snowflake????2/2?????2????????????2???????????2m
kubectl get pods -l app=snowflake
NAME?????????????????????????READY?????STATUS????RESTARTS???AGE
snowflake-3968820950-9dgr8???1/1???????Running???0??????????2m
snowflake-3968820950-vgc4n???1/1???????Running???0??????????2m
讓切換到 production 名字空間,展示一個(gè)名字空間中的資源如何對另一個(gè)名字空間不可見。
kubectl config use-context prod
production 名字空間應(yīng)該是空的,下列命令應(yīng)該返回的內(nèi)容為空。
kubectl get deployment kubectl get pods
生產(chǎn)環(huán)境需要以放牛的方式運(yùn)維,讓創(chuàng)建一些名為 cattle 的 Pod。
kubectl create deployment cattle --image=registry.k8s.io/serve_hostname --replicas=5 kubectl get deployment
NAME?????????READY???UP-TO-DATE???AVAILABLE???AGE
cattle???????5/5?????5????????????5???????????10s
kubectl get pods -l run=cattle
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
此時(shí),應(yīng)該很清楚的展示了用戶在一個(gè)名字空間中創(chuàng)建的資源對另一個(gè)名字空間是不可見的。隨著 Kubernetes 中的策略支持的發(fā)展,將擴(kuò)展此場景,以展示如何為每個(gè)名字空間提供不同的授權(quán)規(guī)則。