iT邦幫忙

2025 iThome 鐵人賽

DAY 11
0
Cloud Native

從 Docker 到 K8s:我的 30 天雲原生筆記系列 第 11

Day 11: K8s 如何劃分領地 - Namespaces

  • 分享至 

  • xImage
  •  

哈囉,大家好,歡迎來到 K8s的第四天!

在昨天的 Day 10,提到了 LabelsSelectors,知道 Kubernetes 物件之間如何建立關聯。現在我們已經可以在同一個專案內組織 Deployment 和 Service。

今天要介紹一個新的概念:Namespace(命名空間),它可以幫助我們在同一個叢集裡,把資源分組隔離,避免名稱衝突,也方便管理權限和資源配額。

Part 1:Namespace 是什麼?

Namespace 是 Kubernetes 提供的一種機制,用來把同一個叢集內的資源邏輯分組。可以把它想成一個工作區或資料夾,每個 Namespace 裡的資源名稱必須唯一,但不同 Namespace 之間可以重複。

https://ithelp.ithome.com.tw/upload/images/20250917/20178656GlXyL7qmmN.png

看範例可能會比較好懂:

  • 同一 Namespace 中的資源名稱不能重複。
    如果我們今天要在 project-sapce 的 Namespace 裡再建立另一個 ota-mariadb,就會失敗。

    NAMESPACE      NAME
    project-space  ota-mariadb
    project-space  ota-backend
    project-space  cms-mariadb
    project-space  cms-backend
    project-space  auth-service
    
  • 不同 Namespace 之間可以重複。
    這兩個 database 是不同 Namespace 的資源,所以不會衝突。

    NAMESPACE      NAME
    ota-project    database
    cms-project    database
    

在我們自己的專案中,因為都是單一團隊管理,所以我們會把所有服務放在同一個 Namespace,例如 project-space,裡面包含 OTA、CMS、UMS 等服務。

Part 2:Kubernetes 內建 Namespace

當你安裝好 K8s 叢集,它已經內建了幾個重要 Namespace,可以用以下指令查看:

kubectl get namespaces
NAME              STATUS   AGE
default           Active   1d
kube-node-lease   Active   1d
kube-public       Active   1d
kube-system       Active   1d

主要 Namespace 包含:

  • default:未指定 Namespace 時的預設工作區,我們前幾天建立的 Deployment 和 Service 都住在這裡。
  • kube-system:K8s 系統元件的家,包括 API Server、Scheduler、CoreDNS 等,通常不會修改這裡的資源。
  • kube-public:公開可讀的空間,所有使用者都可以存取。
  • kube-node-lease:儲存節點心跳資訊,讓控制平面判斷節點健康狀態。

Part 3:在 Namespace 中部署應用

1. 建立 Namespace

可以創建一個 namespace.yaml 檔建立 Namespace,方便版本控制:

# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: project-space    # 建立一個 project-space 的命名空間

然後執行:

kubectl apply -f namespace.yaml

-fkubectl 的一個參數,意思是 file(檔案)。它告訴 kubectl 要從哪個 YAML 或 JSON 檔案讀取資源定義,然後套用到叢集。這樣就建立了一個名為 project-space 的 Namespace。

2. 在指定 Namespace 部署應用

或是直接在 Deployment 或 Service 的 YAML 中,加上 metadata.namespace,這樣 Kubernetes 就知道這個 Deployment 屬於 project-space Namespace。:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ota-backend-deployment
  namespace: project-space  #這邊
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: ota-backend
    spec:
      containers:
      - name: backend-container
        image: your-docker-id/ota-backend:1.0

同理,Service 也要指定 Namespace:

apiVersion: v1
kind: Service
metadata:
  name: ota-backend-service
  namespace: project-space #這邊
spec:
  selector:
    app: ota-backend
  ports:
    - port: 80
      targetPort: 8080

3. 跨 Namespace 通訊

Kubernetes 叢集內建了一個服務域名系統:

<service-name>.<namespace-name>.svc.cluster.local
  • svc.cluster.local 是 K8s 叢集預設的服務域名,平常不需要修改。
  • 在同一個 Namespace 內,可以省略 <namespace-name>.svc.cluster.local,直接用 Service 名稱即可。

舉例來說:

  • 同一 Namespace 內:
    若要跟 ota-backend 通訊,用精簡的寫法即可。

    ota-backend
    
  • 跨 Namespace:
    跨命名空間就要寫的完整一點。

    http://ota-backend.project-space.svc.cluster.local
    

4. 操作指定 Namespace 的資源

使用 kubectl -n--namespace 指定 Namespace:

# 查看 project-space 中的所有 Pod
kubectl get pods -n project-space

# 在 project-space 中套用設定
kubectl apply -f . -n project-space

# 查看所有 Namespace 的所有 Pod
kubectl get pods --all-namespaces

Part 4:資源配額 ResourceQuota

Namespaces 可以搭配 ResourceQuota 限制資源使用量,避免單個 Namespace 耗盡整個叢集的資源。然後ResourceQuota 可以是一份獨立的 YAML,不寫在 Deployment 裡,而是部署到 Namespace 的一個物件。

範例 YAML:

# quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: project-quota
  namespace: project-space
spec:
  hard:
    requests.cpu: "4"      # 不超過 4 核心
    requests.memory: 16Gi  # 記憶體不超過 16 GB
    pods: "10"             # 最多建立 10 個 Pods
  • spec.hard:用來定義資源上限。

下一篇,我們會來看看 Kubernetes 怎麼處理應用程式的設定管理和敏感資訊管理,明天見!


上一篇
Day 10: K8s 的關聯機制- Labels 與 Selectors
下一篇
Day 12: ConfigMap & Secret
系列文
從 Docker 到 K8s:我的 30 天雲原生筆記16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言