Kubernetes 中的命名空間與資源隔離
命名空間的基本概念
命名空間(Namespace) 是 Kubernetes 中的一個邏輯分隔符,用於在同一 Kubernetes Cluster 中劃分和管理資源。它的主要目的是為了隔離和組織不同的資源,使得 Cluster 中的多個團隊或應用可以共用一個 Cluster 而不會互相干擾。
主要特點:
- 資源隔離:命名空間提供了一個隔離層,確保不同應用或團隊的資源互不影響。例如,同一個服務名稱在不同命名空間中可以重複使用。
- 資源配額:命名空間允許你對資源使用設置限制和配額(如 CPU 和RAM),這有助於防止單一命名空間中的應用過度消耗資源。
- 存取控制:通過基於角色的存取控制(RBAC),可以為不同命名空間中的資源設置不同的存取權限,從而增強 Cluster 的安全性。
- 預設命名空間:
- Kubernetes Cluster 中有一些預設的命名空間:
default:如果不指定命名空間,資源會被創建在此命名空間中。kube-system:這裡存放的是 Kubernetes 系統運行所需的資源。kube-public:這是預設的公共命名空間,通常用於存放 Cluster 內所有用戶都可存取的資源。kube-node-lease:用於存放節點租約,這些租約由 Kubernetes 節點持有,用來改善節點故障檢測的性能。
- Kubernetes Cluster 中有一些預設的命名空間:
使用命名空間進行資源隔離
創建命名空間:
- 使用
kubectl create namespace <namespace-name>命令來創建新的命名空間。例如:
kubectl create namespace dev這將創建一個名為
dev的命名空間,用於開發環境的資源隔離。- 使用
在命名空間中操作資源:
- 創建資源時,可以指定所屬的命名空間。例如,創建一個 Pod 並將其放入
dev命名空間:
apiVersion: v1 kind: Pod metadata: name: nginx-pod namespace: dev spec: containers: - name: nginx image: nginx使用
kubectl apply -f <yaml-file>將資源應用到指定的命名空間中。- 創建資源時,可以指定所屬的命名空間。例如,創建一個 Pod 並將其放入
切換命名空間:
- 如果你需要頻繁操作特定命名空間中的資源,可以使用
kubectl config set-context命令設置預設命名空間:
kubectl config set-context --current --namespace=dev這樣,所有後續的 kubectl 命令都將預設作用於
dev命名空間。- 如果你需要頻繁操作特定命名空間中的資源,可以使用
查看命名空間中的資源:
- 使用
kubectl get all -n <namespace-name>命令可以查看特定命名空間中的所有資源。例如:
kubectl get all -n dev- 使用
命名空間的資源配額和限制
資源配額(Resource Quotas):
- 命名空間允許你設置資源配額,以限制每個命名空間中可以使用的資源數量(如 CPU、RAM等)。
- 這有助於防止單個命名空間中的應用程式使用過多資源,影響其他命名空間的應用程式。
限額範圍(Limit Ranges):
- 限額範圍允許你設置 Pod 或容器可以使用的最小和最大資源限制,進一步控制資源的使用。
基於角色的存取控制(RBAC):
- 命名空間與 RBAC 結合使用時,可以實現對資源存取的精細化控制。這意味著你可以為不同的用戶或服務賬戶在不同的命名空間內分配不同的權限。
可以為命名空間設置資源配額和限制,確保其資源消耗不會超出分配範圍。以下是一個示例,為 dev 命名空間設置 CPU 和RAM的配額:
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-quota
namespace: dev
spec:
hard:
requests.cpu: "2"
requests.memory: "4Gi"
limits.cpu: "4"
limits.memory: "8Gi"
使用 kubectl apply -f <yaml-file> 來設置資源配額。
命名空間的常見應用場景
多租戶環境:
- 在一個大型企業中,可能會有多個團隊共用同一個 Kubernetes Cluster。通過命名空間,每個團隊可以擁有自己獨立的環境,資源彼此隔離。
開發、測試和正式環境的隔離:
- 可以為開發、測試和正式環境創建不同的命名空間,確保不同階段的應用不會互相影響。
資源管理和配額控制:
- 對於需要嚴格管理資源的 Cluster,可以使用命名空間和資源配額來限制資源的使用,防止某些應用程式消耗過多的資源。
命名空間與 DNS 的運作關係
命名空間如何影響 DNS 名稱解析:
- 在 Kubernetes 中,每個 Pod 都會自動獲得一個 DNS 名稱,這個名稱會基於 Pod 所在的命名空間來構建。當你在同一個命名空間中解析服務時,可以使用簡單的服務名稱進行解析,例如
my-service。然而,當你跨命名空間存取其他服務時,則需要使用全名,例如my-service.my-namespace.svc.cluster.local。 - Kubernetes 的內建 DNS 系統會根據這些名稱自動解析並路由到相應的服務。這意味著不同的命名空間之間可以擁有同名的服務而不會產生衝突,因為這些服務的 DNS 名稱是基於其命名空間的。
- 在 Kubernetes 中,每個 Pod 都會自動獲得一個 DNS 名稱,這個名稱會基於 Pod 所在的命名空間來構建。當你在同一個命名空間中解析服務時,可以使用簡單的服務名稱進行解析,例如
跨命名空間的服務解析:
- 當服務需要跨命名空間存取時,必須使用 FQDN(Fully Qualified Domain Name,全域域名),如
my-service.my-namespace.svc.cluster.local。這確保了即使在不同的命名空間中有相同名稱的服務,也能準確解析和路由到正確的服務。
- 當服務需要跨命名空間存取時,必須使用 FQDN(Fully Qualified Domain Name,全域域名),如
總結
命名空間是 Kubernetes 中一個強大且靈活的工具,能夠有效地組織和管理 Cluster 中的資源。通過使用命名空間,可以在一個 Cluster 中運行多個應用程式或服務,並確保它們之間的資源和權限隔離。資源配額和存取控制的結合使用,還能夠進一步增強 Cluster 的可管理性和安全性。
在接下來的課程中,我們將探討 Kubernetes 中的 Helm 套件管理工具,這些工具將幫助你更加高效地部署和管理 Kubernetes 應用程式。
文章標籤
全站熱搜
