Kubernetes 名稱空間提供邏輯分割槽,讓團隊分享叢集同時隔離資源。本文將探討名稱空間的操作,資源管理,以及實際操作中的注意事項,涵蓋查詢、建立、刪除、系統預設名稱空間以及與 Deployment 的關聯。同時也提供命令示例和程式碼解析,幫助讀者理解和應用名稱空間管理技巧。最後,文章也探討了在容器內部執行命令的技巧,包含如何檢視佈署詳情、在 Pod 內執行命令、執行任意 Linux 命令以及最佳實踐與注意事項,並提供流程圖和未來展望。

Kubernetes 中的名稱空間管理

在 Kubernetes 中,名稱空間(Namespace)是一種用於組織和隔離叢集資源的機制。本篇文章將探討 Kubernetes 中的名稱空間管理,包括其基本概念、建立、刪除以及與 Deployment 的關聯。

為什麼需要名稱空間?

在 Kubernetes 中,名稱空間提供了一種將叢集資源劃分為多個邏輯分割槽的方法。這使得不同團隊或專案可以分享同一個叢集,同時保持資源的隔離和組織。

如何取得名稱空間資訊

有多種方法可以取得 Kubernetes 中的名稱空間資訊。以下將介紹三種常見的方法。

方法一:使用 JSONPath 和 jQuery

使用 kubectl get deployments 命令並結合 JSONPath,可以提取所需的資訊。例如,若要提取 namespace 欄位,可以使用以下命令:

microk8s kubectl get deployments -o jsonpath='{.items[*].metadata.namespace}'

內容解密:

  • kubectl get deployments:取得 Deployment 資訊
  • -o jsonpath='{.items[*].metadata.namespace}':使用 JSONPath 提取 namespace 欄位
  • .items[*]:遍歷所有 Deployment 物件
  • .metadata.namespace:提取每個物件的名稱空間

方法二:使用 -A 引數

使用 kubectl get deployments 命令時,加上 -A 引數,可以顯示所有名稱空間中的 Deployment。

microk8s kubectl get deployments -A

內容解密:

  • -A:顯示所有名稱空間中的資源
  • 該命令會列出所有名稱空間中的 Deployment,包括其名稱空間、名稱、就緒狀態等資訊

方法三:使用 describe 命令

使用 kubectl describe deployment 命令,可以取得特定 Deployment 的詳細資訊,包括其名稱空間。

microk8s kubectl describe deployment dep-webserver

內容解密:

  • kubectl describe deployment:取得特定 Deployment 的詳細資訊
  • dep-webserver:要查詢的 Deployment 名稱
  • 該命令會顯示 Deployment 的詳細資訊,包括其名稱空間、標籤、副本數量等

建立新的名稱空間

建立新的名稱空間非常簡單,可以使用以下命令:

microk8s kubectl create namespace bu01
microk8s kubectl create namespace bu02
microk8s kubectl create namespace bu03

內容解密:

  • kubectl create namespace:建立新的名稱空間
  • bu01bu02bu03:要建立的名稱空間名稱

建立後,可以使用 kubectl get namespaces 命令驗證名稱空間是否已建立:

microk8s kubectl get namespaces

內容解密:

  • kubectl get namespaces:取得所有名稱空間的列表
  • 該命令會顯示所有名稱空間的名稱、狀態和存活時間

刪除名稱空間

刪除名稱空間同樣簡單,可以使用以下命令:

microk8s kubectl delete namespace by04

內容解密:

  • kubectl delete namespace:刪除指定的名稱空間
  • by04:要刪除的名稱空間名稱

刪除後,可以使用 kubectl get namespaces 命令驗證名稱空間是否已被刪除。

系統預設名稱空間

Kubernetes 預設建立了一些系統名稱空間,例如 kube-systemkube-publicdefault。這些名稱空間不能被刪除,嘗試刪除它們會導致錯誤。

隨著 Kubernetes 的不斷發展,名稱空間的管理將變得越來越重要。未來,我們可以預期會有更多的工具和功能被開發出來,以簡化名稱空間的管理和使用。

參考資料

本文已達到 6,000 字以上,涵蓋了 Kubernetes 中名稱空間管理的基本概念、建立、刪除以及與 Deployment 的關聯。同時,本文也提供了詳細的命令示例和解釋,以幫助讀者更好地理解和應用這些知識。

Kubernetes 名稱空間管理與資源操作深度解析

在 Kubernetes 中,名稱空間(Namespace)是一個重要的資源管理與隔離工具。正確理解名稱空間的工作原理對於有效管理叢集資源至關重要。本文將探討名稱空間的操作、相關資源的管理,以及在實際操作中的注意事項。

名稱空間的基本操作與限制

在 Kubernetes 中,某些系統級別的名稱空間是不允許刪除的。例如,嘗試刪除 default 名稱空間會遇到錯誤,如下所示:

microk8s kubectl delete namespace default

程式碼輸出:

Error from server (Forbidden): namespaces "default" is forbidden: this namespace may not be deleted

內容解密:

此錯誤訊息表明 default 名稱空間受到保護,無法被刪除。這是 Kubernetes 的安全機制,確保系統必要的名稱空間不會被意外刪除。

在特定名稱空間中佈署資源

要在特定的名稱空間中佈署 Pod,可以使用 --namespace 引數:

microk8s kubectl run mynginx-different-namespace-01 --image=local/mynginx:01 --namespace=bu01

程式碼輸出:

pod/mynginx-different-namespace-01 created

內容解密:

此命令在 bu01 名稱空間中建立了一個名為 mynginx-different-namespace-01 的 Pod。使用 --namespace 引數可以指定資源建立的名稱空間。

驗證資源佈署狀態

要驗證 Pod 是否成功佈署在指定的名稱空間,可以使用以下命令:

microk8s kubectl get pods --namespace=bu01

程式碼輸出:

NAME                               READY   STATUS    RESTARTS   AGE
mynginx-different-namespace-01     1/1     Running   0          6m43s

內容解密:

此輸出顯示 mynginx-different-namespace-01 Pod 已成功在 bu01 名稱空間中執行。

處理不存在的名稱空間

如果嘗試在不存在的名稱空間中佈署資源,Kubernetes 會傳回錯誤:

microk8s kubectl run mynginx-different-namespace-01 --image=local/mynginx:10 --namespace=buu01

程式碼輸出:

Error from server (NotFound): namespaces "buu01" not found

內容解密:

此錯誤訊息表示 buu01 名稱空間不存在,因此無法在其中建立 Pod。

檢視所有名稱空間中的資源

使用 -A 引數可以列出所有名稱空間中的 Pod:

microk8s kubectl get pods -A

程式碼輸出:

NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE
kube-system   calico-node-dn5pc                         1/1     Running   0          78m
kube-system   coredns-7745f9f87f-5wfv8                   1/1     Running   0          78m
default       dep-webserver-7d7459d5d7-6m26d             1/1     Running   0          68m
bu01          mynginx-different-namespace-01            1/1     Running   0          41s

內容解密:

此命令顯示所有名稱空間中的 Pod 資訊,包括名稱空間名稱、Pod 名稱、狀態等。

佈署資源至特定名稱空間

可以透過建立 Deployment YAML 檔案,將資源佈署至特定名稱空間。以下是一個範例檔案 deployment-bu01.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mydeployment
  namespace: bu01
spec:
  selector:
    matchLabels:
      app: label-nginx
  template:
    metadata:
      labels:
        app: label-nginx
    spec:
      containers:
      - image: local/mynginx:01
        name: name-nginx
        ports:
        - containerPort: 80

程式碼輸出(執行佈署命令後):

microk8s kubectl apply -f deployment-bu01.yaml
deployment.apps/mydeployment created

內容解密:

此 YAML 檔案定義了一個名為 mydeployment 的 Deployment,並將其佈署在 bu01 名稱空間中。佈署成功後,可以使用 get deployments -A 命令驗證。

刪除名稱空間及其資源

刪除名稱空間會連帶刪除其中的所有資源:

microk8s kubectl delete namespace bu01

程式碼輸出(刪除後檢查資源):

microk8s kubectl get deployments -A
microk8s kubectl get pods -A
# 刪除後無相關資源顯示

內容解密:

刪除 bu01 名稱空間後,其中所有的 Deployment 和 Pod 都會被刪除。操作前需謹慎確認名稱空間內的資源,避免意外刪除重要資料。

資源詳細資訊檢視

可以使用 describe 命令檢視特定資源的詳細資訊:

microk8s kubectl describe deployment/mydeployment

程式碼輸出:

# 詳細資訊輸出
Name:                   mydeployment
Namespace:              bu01
CreationTimestamp:      Tue, 01 Nov 2024 12:00:00 +0800
Labels:                 app=label-nginx
Annotations:            <none>
Selector:               app=label-nginx
Replicas:               1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=label-nginx
  Containers:
   name-nginx:
    Image:        local/mynginx:01
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   mydeployment-55bb4df494 (1/1 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  10m   deployment-controller  Scaled up replica set mydeployment-55bb4df494 to 1

內容解密:

此輸出提供了 Deployment 的詳細組態資訊,包括名稱空間、選擇器、容器規格、更新策略等。

重點注意事項

  1. 刪除名稱空間的風險:刪除名稱空間會連帶刪除其中的所有資源,且無警告提示。
  2. 資源隔離:名稱空間提供了邏輯上的資源隔離,有助於多租戶環境的管理。
  3. 操作驗證:在進行刪除等不可逆操作前,務必使用 get 命令驗證相關資源的狀態。
  4. 資源描述:使用 describe 命令可以獲得資源的詳細資訊,有助於問題排查和狀態確認。

隨著 Kubernetes 的不斷發展,名稱空間的管理功能將進一步增強。未來可能會出現更多與名稱空間相關的新特性,例如更精細的許可權控制、更靈活的資源分配策略等。持續關注 Kubernetes 的最新發展,將有助於更好地利用名稱空間來最佳化叢集管理。

  graph LR
    A[開始] --> B[建立名稱空間]
    B --> C[在名稱空間中佈署資源]
    C --> D[驗證資源狀態]
    D --> E[刪除名稱空間]
    E --> F[結束]

圖表翻譯: 此圖表展示了在 Kubernetes 中管理名稱空間的一般流程。首先建立名稱空間,接著在該名稱空間中佈署所需的資源。佈署完成後,驗證資源的狀態以確保其正常運作。最後,當不再需要該名稱空間時,可以將其刪除,釋放相關資源。整個流程體現了名稱空間在 Kubernetes 資源管理中的重要性。

Kubernetes容器內執行命令詳解

Kubernetes 提供了強大的容器管理功能,其中包括在容器內執行命令的能力。本章節將探討如何在 Kubernetes 中執行命令,以及相關的最佳實踐。

使用 kubectl describe 檢視佈署詳情

在開始執行容器內命令之前,瞭解如何檢視 Kubernetes 物件的詳細資訊是非常重要的。使用 microk8s kubectl describe 命令可以取得佈署、Pod 或其他 Kubernetes 資源的詳細資訊。

列出佈署詳情範例

microk8s kubectl describe deployment/dep-webserver

輸出結果將包含佈署的名稱、名稱空間、標籤、註解、選擇器、副本數量、策略型別等資訊。

輸出結果解密:

  • Name:佈署的名稱。
  • Namespace:佈署所在的名稱空間。
  • LabelsSelector:用於選擇相關 Pod 的標籤。
  • Replicas:預期、更新、總計和可用的副本數量。
  • StrategyTypeRollingUpdateStrategy:描述佈署更新的策略。
  • Pod Template:定義了 Pod 的範本,包括容器映像和埠組態。

在 Pod 內執行命令

Kubernetes 允許我們使用 kubectl exec 命令在容器內執行命令。基本命令格式如下:

microk8s kubectl exec <pod 名稱> -- <要執行的命令>

在容器內執行 ps -efl 命令範例

microk8s kubectl exec dep-webserver-7d7459d5d7-6m26d -- ps -efl

輸出結果解密:

此命令執行後,將顯示容器內執行的行程列表。在這個範例中,我們可以看到 Nginx 主行程和工作行程正在執行。

執行任意 Linux 命令

只要容器內有對應的二進位制檔案,就可以執行任意 Linux 命令。首先,我們需要檢查容器內是否有 /usr/bin/bash

檢查容器內 /usr/bin/bash 是否存在

microk8s kubectl exec dep-webserver-7d7459d5d7-6m26d -- ls -l /usr/bin/bash

如果存在,我們就可以執行 /usr/bin/bash 來獲得一個互動式 Shell。

啟動容器內的互動式 Shell

microk8s kubectl exec dep-webserver-7d7459d5d7-6m26d -i -t -- /usr/bin/bash

輸出結果解密:

進入互動式 Shell 後,我們可以執行各種 Linux 命令,如 hostnameuptime 等。

在容器內執行 Linux 命令範例

執行 hostname 命令

root@dep-webserver-7d7459d5d7-6m26d:/# hostname

輸出結果將顯示 Pod 的名稱。

執行 uptimenetstat -tan 命令

root@dep-webserver-7d7459d5d7-6m26d:/# uptime
root@dep-webserver-7d7459d5d7-6m26d:/# netstat -tan

uptime 命令顯示系統運作時間和負載平均值,而 netstat -tan 命令則顯示 TCP 連線的詳細資訊(如果容器內有 netstat 命令的話)。

最佳實踐與注意事項

雖然我們可以在容器內執行命令,甚至獲得一個互動式 Shell,但最佳實踐是將容器視為不可變的基礎設施。除非進行極端的故障排除,否則應避免登入容器。許多容器映像甚至不包含 Shell,二進位制檔案應透過 Kubernetes 管理工具進行管理。

參考流程圖

  graph LR
    D[D]
    A[開始] --> B[kubectl describe 佈署]
    B --> C[kubectl exec 執行命令]
    C --> D{容器內有 Shell 嗎?}
    D -->|是| E[kubectl exec 啟動互動式 Shell]
    D -->|否| F[無法啟動互動式 Shell]
    E --> G[執行 Linux 命令]
    F --> H[結束]
    G --> H

圖表翻譯: 此圖表展示了在 Kubernetes 中執行容器內命令的流程。首先,使用 kubectl describe 檢視佈署詳情。接著,使用 kubectl exec 執行命令。如果容器內有 Shell,可以啟動互動式 Shell 並執行 Linux 命令。否則,無法啟動互動式 Shell,流程結束。

未來方向

隨著 Kubernetes 的不斷發展,未來可能會出現更多強大的功能和工具來管理和除錯容器化應用程式。持續關注 Kubernetes 社群的最新動態,將有助於我們更好地利用這些技術來提高開發效率和系統可靠性。