Kubernetes 名字空間演練

2022-06-07 11:29 更新

名字空間演練

Kubernetes 名字空間 有助于不同的項目、團(tuán)隊或客戶去共享 Kubernetes 集群。

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

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

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

此示例演示了如何使用 Kubernetes 名字空間細(xì)分集群。

在開始之前

你必須擁有一個 Kubernetes 的集群,同時你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個節(jié)點的集群上運(yùn)行本教程,且這些節(jié)點不作為控制平面主機(jī)。 如果你還沒有集群,你可以通過 Minikube 構(gòu)建一個你自己的集群,或者你可以使用下面任意一個 Kubernetes 工具構(gòu)建:

要檢查版本,請輸入 kubectl version。

環(huán)境準(zhǔn)備

此示例作如下假設(shè):

  1. 你已擁有一個配置好的 Kubernetes 集群。
  2. 你已對 Kubernetes 的 Pods、 Services 和 Deployments 有基本理解。

理解默認(rèn)名字空間

默認(rèn)情況下,Kubernetes 集群會在配置集群時實例化一個默認(rèn)名字空間,用以存放集群所使用的默認(rèn) Pod、Service 和 Deployment 集合。

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

kubectl get namespaces
NAME      STATUS    AGE
default   Active    13m

創(chuàng)建新的名字空間

在本練習(xí)中,我們將創(chuàng)建兩個額外的 Kubernetes 名字空間來保存我們的內(nèi)容。

我們假設(shè)一個場景,某組織正在使用共享的 Kubernetes 集群來支持開發(fā)和生產(chǎn):

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

運(yùn)維團(tuán)隊希望在集群中維護(hù)一個空間,以便他們可以強(qiáng)制實施一些嚴(yán)格的規(guī)程, 對誰可以或誰不可以操作運(yùn)行生產(chǎn)站點的 Pod、Service 和 Deployment 集合進(jìn)行控制。

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

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

文件 ?namespace-dev.json? 描述了 ?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.json

將下列的內(nèi)容保存到文件 ?namespace-prod.json? 中, 這些內(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.json

為了確保一切正常,我們列出集群中的所有名字空間。

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 提供了作用域。

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

為了演示這一點,讓我們在 development 名字空間中啟動一個簡單的 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 客戶端定義一個上下文,以便在每個名字空間中工作。 "cluster" 和 "user" 字段的值將從當(dāng)前上下文中復(fù)制。

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)情況下,上述命令會添加兩個上下文到 ?.kube/config? 文件中。 你現(xiàn)在可以查看上下文并根據(jù)你希望使用的名字空間并在這兩個新的請求上下文之間切換。

查看新的上下文:

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

你可以使用下列命令驗證當(dāng)前上下文:

kubectl config current-context
dev

此時,我們從命令行向 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: k8s.gcr.io/serve_hostname
        imagePullPolicy: Always
        name: snowflake

應(yīng)用清單文件來創(chuàng)建 Deployment。

我們創(chuàng)建了一個副本大小為 2 的 Deployment,該 Deployment 運(yùn)行名為 ?snowflake ?的 Pod, 其中包含一個僅提供主機(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

這很棒,開發(fā)人員可以做他們想要的事情,而不必?fù)?dān)心影響 ?production ?名字空間中的內(nèi)容。

讓我們切換到 ?production ?名字空間,展示一個名字空間中的資源如何對另一個名字空間不可見。

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=k8s.gcr.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

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

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


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號