Kubernetes 通過名字空間共享集群

2022-06-08 13:55 更新

通過名字空間共享集群

本頁展示如何查看、使用和刪除名字空間。 本頁同時展示如何使用 Kubernetes 名字空間來劃分集群。

在開始之前

  • 你已擁有一個配置好的 Kubernetes 集群。
  • 你已對 Kubernetes 的 Pods , Services , 和 Deployments 有基本理解。

查看名字空間

  • 列出集群中現(xiàn)有的名字空間:
  • kubectl get namespaces
    
    NAME          STATUS    AGE
    default       Active    11d
    kube-system   Active    11d
    kube-public   Active    11d

初始狀態(tài)下,Kubernetes 具有三個名字空間:

  • ?default ?無名字空間對象的默認名字空間
  • ?kube-system? 由 Kubernetes 系統(tǒng)創(chuàng)建的對象的名字空間
  • ?kube-public? 自動創(chuàng)建且被所有用戶可讀的名字空間(包括未經(jīng)身份認證的)。此名字空間通常在某些資源在整個集群中可見且可公開讀取時被集群使用。此名字空間的公共方面只是一個約定,而不是一個必要條件。

你還可以通過下列命令獲取特定名字空間的摘要:

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

請注意,這些詳情同時顯示了資源配額(如果存在)以及資源限制區(qū)間。

資源配額跟蹤并聚合 Namespace 中資源的使用情況,并允許集群運營者定義 Namespace 可能消耗的 Hard 資源使用限制。

限制區(qū)間定義了單個實體在一個 Namespace 中可使用的最小/最大資源量約束。

名字空間可以處于下列兩個階段中的一個:

  • ?Active ?名字空間正在被使用中。
  • ?Terminating ?名字空間正在被刪除,且不能被用于新對象。

創(chuàng)建名字空間

Note: 避免使用前綴 ?kube-? 創(chuàng)建名字空間,因為它是為 Kubernetes 系統(tǒng)名字空間保留的。

  1. 新建一個名為 ?my-namespace.yaml? 的 YAML 文件,并寫入下列內(nèi)容:
  2. apiVersion: v1
    kind: Namespace
    metadata:
      name: <insert-namespace-name-here>

    然后運行:

    kubectl create -f ./my-namespace.yaml
    
  3. 或者,你可以使用下面的命令創(chuàng)建名字空間:
  4. kubectl create namespace <insert-namespace-name-here>
    

請注意,名字空間的名稱必須是一個合法的 DNS 標(biāo)簽。

可選字段 ?finalizers ?允許觀察者們在名字空間被刪除時清除資源。記住如果指定了一個不存在的終結(jié)器,名字空間仍會被創(chuàng)建,但如果用戶試圖刪除它,它將陷入 ?Terminating ?狀態(tài)。

刪除名字空間

刪除名字空間使用命令:

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

Warning: 這會刪除名字空間下的 所有內(nèi)容 !

刪除是異步的,所以有一段時間你會看到名字空間處于 ?Terminating ?狀態(tài)。

使用 Kubernetes 名字空間細分你的集群

  1. 理解 default 名字空間
  2. 默認情況下,Kubernetes 集群會在配置集群時實例化一個 default 名字空間,用以存放集群所使用的默認 Pods、Services 和 Deployments 集合。

    假設(shè)你有一個新的集群,你可以通過執(zhí)行以下操作來內(nèi)省可用的名字空間

    kubectl get namespaces
    
    NAME      STATUS    AGE
    default   Active    13m
  3. 創(chuàng)建新的名字空間
  4. 在本練習(xí)中,我們將創(chuàng)建兩個額外的 Kubernetes 名字空間來保存我們的內(nèi)容。

    在某組織使用共享的 Kubernetes 集群進行開發(fā)和生產(chǎn)的場景中:

    開發(fā)團隊希望在集群中維護一個空間,以便他們可以查看用于構(gòu)建和運行其應(yīng)用程序的 Pods、Services 和 Deployments 列表。在這個空間里,Kubernetes 資源被自由地加入或移除, 對誰能夠或不能修改資源的限制被放寬,以實現(xiàn)敏捷開發(fā)。

    運維團隊希望在集群中維護一個空間,以便他們可以強制實施一些嚴格的規(guī)程, 對誰可以或不可以操作運行生產(chǎn)站點的 Pods、Services 和 Deployments 集合進行控制。

    該組織可以遵循的一種模式是將 Kubernetes 集群劃分為兩個名字空間:development 和 production。

    讓我們創(chuàng)建兩個新的名字空間來保存我們的工作。

    使用 kubectl 創(chuàng)建 ?development ?名字空間。

    kubectl create -f https://k8s.io/examples/admin/namespace-dev.json
    

    讓我們使用 kubectl 創(chuàng)建 ?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
  5. 在每個名字空間中創(chuàng)建 pod
  6. Kubernetes 名字空間為集群中的 Pods、Services 和 Deployments 提供了作用域。

    與一個名字空間交互的用戶不會看到另一個名字空間中的內(nèi)容。

    為了演示這一點,讓我們在 ?development ?名字空間中啟動一個簡單的 Deployment 和 Pod。

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

    我們創(chuàng)建了一個副本個數(shù)為 2 的 Deployment,運行名為 ?snowflake ?的 Pod,其中包含一個負責(zé)提供主機名的基本容器。

    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

    看起來還不錯,開發(fā)人員能夠做他們想做的事,而且他們不必擔(dān)心會影響到 ?production ?名字空間下面的內(nèi)容。

    讓我們切換到 ?production ?名字空間,展示一下一個名字空間中的資源是如何對 另一個名字空間隱藏的。

    名字空間 ?production ?應(yīng)該是空的,下面的命令應(yīng)該不會返回任何東西。

    kubectl get deployment -n=production
    kubectl get pods -n=production

    生產(chǎn)環(huán)境下一般以養(yǎng)牛的方式運行負載,所以讓我們創(chuàng)建一些 Cattle(牛)Pod。

    kubectl create deployment cattle --image=k8s.gcr.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

此時,應(yīng)該很清楚的展示了用戶在一個名字空間中創(chuàng)建的資源對另一個名字空間是隱藏的。

隨著 Kubernetes 中的策略支持的發(fā)展,我們將擴展此場景,以展示如何為每個名字空間提供不同的授權(quán)規(guī)則。

理解使用名字空間的動機

單個集群應(yīng)該能滿足多個用戶及用戶組的需求(以下稱為 “用戶社區(qū)”)。

Kubernetes 名字空間 幫助不同的項目、團隊或客戶去共享 Kubernetes 集群。

名字空間通過以下方式實現(xiàn)這點:

  1. 為名字設(shè)置作用域.
  2. 為集群中的部分資源關(guān)聯(lián)鑒權(quán)和策略的機制。

使用多個名字空間是可選的。

每個用戶社區(qū)都希望能夠與其他社區(qū)隔離開展工作。

每個用戶社區(qū)都有自己的:

  1. 資源(pods、服務(wù)、 副本控制器等等)
  2. 策略(誰能或不能在他們的社區(qū)里執(zhí)行操作)
  3. 約束(該社區(qū)允許多少配額,等等)

集群運營者可以為每個唯一用戶社區(qū)創(chuàng)建名字空間。

名字空間為下列內(nèi)容提供唯一的作用域:

  • 命名資源(避免基本的命名沖突)
  • 將管理權(quán)限委派給可信用戶
  • 限制社區(qū)資源消耗的能力

用例包括:

  • 作為集群運營者, 我希望能在單個集群上支持多個用戶社區(qū)。
  • 作為集群運營者,我希望將集群分區(qū)的權(quán)限委派給這些社區(qū)中的受信任用戶。
  • 作為集群運營者,我希望能限定每個用戶社區(qū)可使用的資源量,以限制對使用同一集群的其他用戶社區(qū)的影響。
  • 作為集群用戶,我希望與我的用戶社區(qū)相關(guān)的資源進行交互,而與其他用戶社區(qū)在該集群上執(zhí)行的操作無關(guān)。

理解名字空間和 DNS

當(dāng)你創(chuàng)建服務(wù)時,Kubernetes 會創(chuàng)建相應(yīng)的 DNS 條目。 此條目的格式為 ?<服務(wù)名稱>.<名字空間名稱>.svc.cluster.local?。 這意味著如果容器使用 ?<服務(wù)名稱>?,它將解析為名字空間本地的服務(wù)。 這對于在多個名字空間(如開發(fā)、暫存和生產(chǎn))中使用相同的配置非常有用。 如果要跨名字空間訪問,則需要使用完全限定的域名(FQDN)。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號