K8S - 命名空間實戰 - 從資源隔離到多環境管理

引言

在傳統的物理機或虛擬機環境中,不同業務應用共享資源,容易導致權限沖突、資源爭用和管理混亂。Kubernetes 通過 命名空間(Namespace)實現資源邏輯隔離,將集群劃分為多個虛擬子集群,從而解決以下問題:

? 資源組織:按業務、團隊或環境分類管理

? 權限控制:限制用戶/服務賬號的操作范圍

? 資源限制:分配 CPU/內存配額,防止資源搶占

? 環境隔離:支持開發、測試、生產環境獨立部署

一、核心原理

1.1 命名空間的本質

命名空間是一種 邏輯隔離機制,使得集群中的資源獨立管理,但仍共享底層物理資源。

? 資源獨立:同名資源(如 Deployment、Service)可在不同命名空間共存。

? 默認網絡互通:跨命名空間訪問需指定完整域名。

1.2 命名空間分類

系統級命名空間示例:

類型說明
系統級命令空間由Kubernetes自動創建,存放核心組件
用戶自定義命名空間由用戶創建,用于業務應用部署

? default:默認命名空間(未指定時資源部署至此)

? kube-system:存放集群核心組件(如 kube-proxy、CoreDNS)

? kube-public:可供所有用戶讀取(含未認證用戶)

? kube-node-lease:管理節點心跳信息

注意:業務應用請勿部署到系統命名空間,避免影響集群穩定性!

二、實戰:命名空間創建與應用部署

首先確保你已經完成如下環境準備。

2.1 環境搭建

1.安裝必要工具

確保已安裝并配置好以下環境:

? Kubernetes 集群(可使用 Minikube 或 Kind 進行本地測試)
? kubectl命令行工具
? Docker(用于構建鏡像)
如果還沒有環境,可使用如下命令安裝。

# 安裝 Docker 并驗證
brew install docker
docker --version          # 預期輸出:Docker version 20.10.x
docker run hello-world    # 驗證基礎功能
# 安裝 kubectl 并驗證
brew install kubectl
kubectl version --client  # 預期輸出:Client Version: v1.28.x
# 安裝 kind 并驗證
brew install kind
kind version              # 預期輸出:kind v0.20.x

2.創建本地 Kubernetes 集群

kind create cluster --name k8s-demo
kubectl cluster-info  # 確認集群正常運

到此k8s 集群環境已經準備完畢。

2.2 創建與刪除命名空間

空間命名規范:符合 DNS-1123 標準,
? 僅包含小寫字母、數字和 -
? 以字母開頭和結尾

方法 1:命令行創建命名空間

通過 kubectl命令行工具直接創建命名空間,適合快速操作。

# 創建命名空間
kubectl create namespace dev# 刪除命名空間(謹慎操作)
kubectl delete namespace dev
刪除命名空間是 異步過程,狀態從 ActiveTerminating,其下所有資源將被清理。在同一命名空間,不能重復創建相同的命名空間。示例# 第一次創建(成功)
kubectl create namespace dev
# Output: namespace/dev created# 第二次重復創建(失敗)
kubectl create namespace dev
# Output: Error from server (AlreadyExists): namespaces "dev" already exists

方法 2:YAML文件創建命名空間

通過 YAML 文件創建命名空間,適合版本控制和自動化管理。

# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:name: testing
# 將 namespace空間設置應用到集群
kubectl apply -f namespace.yaml
# 第一次應用(成功)
kubectl apply -f namespace.yaml
# Output: namespace/dev created
# 第二次重復應用(無變化)
kubectl apply -f namespace.yaml
# Output: namespace/dev unchanged

特點

  • 冪等性:如果命名空間已存在,不會報錯,而是維持現狀。
  • 版本控制:YAML 文件可提交至 Git,便于團隊協作和變更審計。
  • 擴展性:支持添加標簽(labels)和注解(annotations),例如:
apiVersion: v1
kind: Namespace
metadata:name: devlabels:env: development  # 資源環境標簽annotations:owner: team-a     # 資源歸屬注解

也可通過命令為命名空間添加標簽:

為命名空間添加標簽

kubectl label ns dev env=development
# 按標簽過濾資源
kubectl get pods -n dev -l env=development

方式3:通過 Kubernetes API 編程創建

示例(Python + Kubernetes API)

from kubernetes import client, config# 加載 kubeconfig 配置
config.load_kube_config()# 創建 API 客戶端
v1 = client.CoreV1Api()# 定義命名空間對象
namespace_name = "dev"
namespace = client.V1Namespace(metadata=client.V1ObjectMeta(name=namespace_name))# 創建命名空間,異常處理
try:v1.create_namespace(body=namespace)print(f"Namespace '{namespace_name}' created successfully")
except client.exceptions.ApiException as e:if e.status == 409:print(f"Namespace '{namespace_name}' already exists.")else:print(f"Failed to create namespace '{namespace_name}': {e}")

適用場景

適用于 CI/CD,在部署流程中動態管理命名空間。

自動化集成,便于與 Python、Go、Java 編寫的 Kubernetes 管理工具結合。

對比三種創建方式
在這里插入圖片描述

2.3 在命名空間中部署應用

1.部署應用

方式 1:在 Manifest 文件中指定命名空間 (可使用 第4講 2.3 中 示例 )

# k8s/deployment.yamlapiVersion: apps/v1
kind: Deployment
metadata:name: gitops-demo-appnamespace: dev  # 指定命名空間spec:replicas: 2selector:matchLabels:app: gitops-demo-apptemplate:metadata:labels:app: gitops-demo-appspec:containers:- name: appimage: your-dockerhub-username/gitops-demo-app:v1  # 替換為你的鏡像ports:- containerPort: 5000
# 檢查命名空間是否存在,不存在則創建
kubectl get ns dev || kubectl create ns dev
把 deployment 應用到集群kubectl apply -f deployment.yaml 

方式 2:命令行指定命名空間(推薦)

kubectl apply -f deployment.yaml -n dev

2.查看命名空間資源

查看上面示例輸出:

#查看 dev 命名空間下的 deployment 
kubectl get deployment -n devNAME              READY   UP-TO-DATE   AVAILABLE   AGE
gitops-demo-app   2/2     2            2           17h# 查看dev命名空間下的所有資源 (Pod/Service等)
kubectl get all -n devNAME                                  READY   STATUS    RESTARTS   AGE
pod/gitops-demo-app-5d7b98d8d-2j6qk   1/1     Running   0          17h
pod/gitops-demo-app-5d7b98d8d-8k9xv   1/1     Running   0          17hNAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/gitops-demo-app   2/2     2            2           17hNAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/gitops-demo-app-5d7b98d8d   2         2         2       17h

注:UP-TO-DATE 表示已更新的 Pod 數。

三、實戰:跨命名空間通信

3.1 基礎知識

Kubernetes 默認允許跨命名空間訪問,但需要使用 完整的 DNS 名稱:

<服務名>.<命名空間>.svc.cluster.local
? 服務名:Service 資源的名稱(如 backend-service)。

? 命名空間:Service 所在的命名空間(如 dev)。

? svc.cluster.local:集群默認的 DNS 后綴(可配置)。

在同一命名空間中訪問服務時,使用服務名即可:

? 同一命名空間:backend-service:80

在跨命名空間訪問時,必須使用完整的 DNS 名稱:

? 跨命名空間:backend-service.dev.svc.cluster.local:80

3.2 實戰示例 - 跨命名空間訪問

步驟 1:在 dev 命名空間創建 Service

通過 kubectl expose命令暴露 Deployment 為 Service(ClusterIP 類型):

kubectl expose deployment gitops-demo-app -n dev --port=80 --target-port=5000

參數說明:

? -n dev:指定命名空間為 dev。

? --port=80:Service 對外暴露的端口。

? --target-port=5000:容器內應用實際監聽的端口(需與 Deployment 中定義的 containerPort一致)。

kubectl expose默認會直接創建 Service 并將其應用到集群中。等效的 Service YAML 配置(命令生成的 Service)為:

apiVersion: v1
kind: Service
metadata:name: gitops-demo-appnamespace: dev
spec:selector:app: gitops-demo-appports:- protocol: TCPport: 80targetPort: 5000type: ClusterIP

驗證 Service

執行以下命令驗證 Service 是否創建成功:

kubectl get svc -n dev
預期輸出:NAME               TYPE        CLUSTER-IP      PORT(S)   AGE
gitops-demo-app    ClusterIP   10.96.123.456   80/TCP    5s

步驟 2:從 prod 命名空間發起跨命名空間訪問

啟動一個臨時 Pod 測試跨命名空間訪問:

kubectl run curl-test -n prod \--image=curlimages/curl \--rm -it -- \curl http://gitops-demo-app.dev.svc.cluster.local

參數說明:

? -n prod:在 prod命名空間中運行 Pod。

? --rm -it:容器退出后自動刪除此臨時容器,并分配交互式終端。

? curl :測試訪問目標 Service。

預期結果:

? 成功:返回 gitops-demo-app服務的響應內容(例如:GitOps Demo v1,具體內容可見 Deployment 文件)。

? 失敗的可能原因:

1.目標 Service未正確暴露端口。

2.NetworkPolicy限制了跨命名空間訪問。

四、實戰:資源配額限制

創建命名空間時增加資源限制,可以通過創建一個 LimitRange對象來限制該命名空間中的資源。LimitRange是 Kubernetes 中用于定義資源限制的策略,可以限制容器的 CPU 和內存等資源。

將 LimitRange和 Namespace一起創建,確保命名空間創建后自動應用這些資源限制。

1.創建 namespace.yaml 和 limitrange.yaml

# namespace.yamlapiVersion: v1
kind: Namespace
metadata:name: testing---# limitrange.yamlapiVersion: v1
kind: LimitRange
metadata:name: default-limitnamespace: testing
spec:limits:- max: cpu: "2"memory: "4Gi"min:cpu: "200m"memory: "512Mi"default:cpu: "1"memory: "1Gi"defaultRequest:cpu: "500m"memory: "1Gi"type: Container

解析:

LimitRange資源限制了testing 命名空間中容器的資源使用:

1.max - 限制容器的 最大CPU 和內存使用量,防止某個容器占用過多資源。

? CPU 最大 2 核(2),即容器最多只能申請 2 核 CPU。

? 內存最大 4Gi(4Gi),即容器最多只能申請 4GB 內存。

2.min(最小值)- 規定容器的最小資源申請量,避免某些 Pod 資源太少而影響運行。

? 最小 CPU 為 200毫核(200m),內存為 512Mi。

3.default(默認值)-如果 Pod 沒有明確指定資源限制,那么 Kubernetes 自動分配的資源值。

? 默認 CPU 為 1 核,內存為 1Gi。

4.defaultRequest(默認請求)- 如果 Pod 沒有指定請求資源,Kubernetes 自動分配的最小起始值。

? 默認請求 CPU 為 500m,內存為 1Gi。

2.應用到集群中

kubectl apply -f namespace.yaml
kubectl apply -f limitrange.yaml

兩個 YAML 文件都在同一個目錄下,也可以一次性應用:

kubectl apply -f .

這樣,testing命名空間會被創建,同時應用了資源限制策略。

五、使用場景與最佳實踐

5.1 何時使用命名空間?
在這里插入圖片描述

5.2 命名空間規劃建議

小型團隊:

? 按環境劃分:dev、testing、prod

? 按業務劃分:web、database

大型組織:

? 獨立集群 + 命名空間:每個團隊獨立集群,內部再劃分命名空間。

六、總結

6.1 核心重點

? 核心價值:命名空間通過邏輯隔離實現資源組織、權限控制和環境管理,是 Kubernetes 多租戶能力的關鍵。

? 軟隔離 vs 硬隔離:

? 軟隔離:命名空間(同一集群內邏輯隔離)

? 硬隔離:獨立集群(物理隔離)

最佳實踐:

? 避免修改系統命名空間,業務應用請用自定義命名空間

? 使用 -n 參數指定部署環境,避免誤操作

附:操作速查表

# 查看所有命名空間
kubectl get ns
# 快速切換默認命名空間(避免頻繁輸入 -n)
kubectl config set-context --current --namespace=dev
# 設置命名空間資源配額(需提前定義 ResourceQuota)
kubectl apply -f quota.yaml -n dev

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77859.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77859.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77859.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity3D仿星露谷物語開發40之割草動畫

1、目標 當Player選擇Scythe后&#xff0c;鼠標懸浮在草上&#xff0c;會顯示綠色光標。鼠標左擊&#xff0c;會觸發割草的動畫。 2、優化Settings.cs腳本 添加以下兩行代碼&#xff1a; // Reaping&#xff08;收割&#xff09; public const int maxCollidersToTestPerRe…

【LLM】基于 Ollama 部署 DeepSeek-R1 本地大模型

本文詳細介紹如何在 Linux 和 Windows 環境下,通過 Docker Compose 整合 Ollama 和 Open WebUI,部署 DeepSeek-R1 大語言模型,并提供 GPU 加速支持。無論你是開發者還是 AI 愛好者,均可通過本指南快速搭建私有化 GPT 環境。 一、環境準備 1. Docker 與 Docker Compose 安…

深度體驗兩年半!MAC 硬件好物分享|屏幕、掛燈、鍵盤、鼠標

寫在前面 最近快五一放假了&#xff0c;所以寫點輕松一點的文章&#xff5e; 這篇文章就介紹這兩年半來&#xff0c;我一直在用MAC硬件搭子&#xff01;&#xff01;而買這些硬件設備的錢都是一行行代碼寫出來的!! 我的MAC是21款14寸 m1 pro 32512版本&#xff0c;22年年底在…

Python math 庫教學指南

Python math 庫教學指南 一、概述 math 庫是 Python 標準庫中用于數學運算的核心模塊&#xff0c;提供以下主要功能&#xff1a; 數學常數&#xff08;如 π 和 e&#xff09;基本數學函數&#xff08;絕對值、取整等&#xff09;冪與對數運算三角函數雙曲函數特殊函數&…

Mac下安裝Python3,并配置環境變量設置為默認

下載Python 訪問Python官方網站 https://www.python.org/ 首先獲得python3安裝路徑 執行命令&#xff1a; which python3 以我這臺電腦為例&#xff0c;路徑為&#xff1a;/Library/Frameworks/Python.framework/Versions/3.9/bin/python3 編輯 bash_profile 文件 然后用 vim 打…

Arduino程序結構詳解與嵌入式開發對比指南

Arduino編程詳解&#xff1a;從基礎到進階實踐 一、Arduino程序的核心架構與擴展設計 1.1 程序框架的深度解析 Arduino程序的基石setup()和loop()函數構成了整個開發體系的核心邏輯。這兩個函數的設計哲學體現了嵌入式系統開發的兩個關鍵維度&#xff1a; 初始化階段&#…

5W1H分析法——AI與思維模型【86】

一、定義 5W1H分析法思維模型是一種通過對問題或事件從原因&#xff08;Why&#xff09;、對象&#xff08;What&#xff09;、地點&#xff08;Where&#xff09;、時間&#xff08;When&#xff09;、人員&#xff08;Who&#xff09;和方法&#xff08;How&#xff09;六個…

css 數字從0開始增加的動畫效果

項目場景&#xff1a; 提示&#xff1a;這里簡述項目相關背景&#xff1a; 在有些時候比如在做C端項目的時候&#xff0c;頁面一般需要一些炫酷效果&#xff0c;比如數字會從小值自動加到數據返回的值 css 數字從0開始增加的動畫效果 分析&#xff1a; 提示&#xff1a;這里填…

CUDA編程 - 如何使用 CUDA 流在 GPU 設備上并發執行多個內核 - 如何應用到自己的項目中 - concurrentKernels

如何使用 CUDA 流在 GPU 設備上并發執行多個內核 一、完整代碼與例程目的1.1、通過現實場景來理解多任務協作&#xff1a;1.2、完整代碼&#xff1a; 二、代碼拆解與復用2.1、編程模版 一、完整代碼與例程目的 項目地址&#xff1a;https://github.com/NVIDIA/cuda-samples/tr…

vue3 打字機效果

打字機效果 因后端返回的數據也是通過microsoft/fetch-event-source 一句一句流式返回 但是前端展示效果想要實現打字機效果 代碼如下 <template><div><div class"text-container"><span class"text-content">{{ displayText }…

線上JVM調優與全棧性能優化 - Java架構師面試實戰

線上JVM調優與全棧性能優化 - Java架構師面試實戰 本文通過一場互聯網大廠的Java架構師面試&#xff0c;深入探討了線上JVM調優、OOM定位、死鎖定位、內存和CPU調優、線程池調優、數據庫調優、緩存調優、網絡調優、微服務調優及分布式調優等關鍵領域。 第一輪提問 面試官&am…

【Android】輕松實現實時FPS功能

文章目錄 實時FPS 實時FPS 初始化 choreographer Choreographer.getInstance();lastFrameTimeNanos System.nanoTime();choreographer.postFrameCallback(frameCallback);監聽并顯示 Choreographer.FrameCallback frameCallback new Choreographer.FrameCallback() {Overri…

GD32F407單片機開發入門(十九)DMA詳解及ADC-DMA方式采集含源碼

文章目錄 一.概要二.GD32F407VET6單片機DMA外設特點三.GD32單片機DMA內部結構圖四.DMA各通道請求五.GD32F407VET6單片機ADC-DMA采集例程六.工程源代碼下載七.小結 一.概要 基本概念&#xff1a; DMA是Direct Memory Access的首字母縮寫,是一種完全由硬件執行數據交換的工作方式…

vue報錯:Error: Cannot find module ‘is-stream‘

此錯誤提示 Cannot find module ‘is-stream’ 表明 Node.js 無法找到 is-stream 模塊。一般而言&#xff0c;這是由于項目中未安裝該模塊所導致的。 解決方案: //npm npm install is-stream //yarn yarn add is-stream安裝后檢查 安裝完成之后&#xff0c;你可以再次運行項目…

全局事件總線EventBus的用法

全局事件總線 EventBus 在前端開發中是一種用于實現組件間通信的機制&#xff0c;適用于兄弟組件或跨層級組件間的數據傳遞。 1. 創建全局 EventBus 實例 在前端項目中&#xff0c;先創建一個全局的 EventBus 實例。在 Vue 中&#xff0c;可以通過創建一個新的 Vue 實例來實現…

SpringBoot 設置HTTP代理訪問

SpringBoot 設置HTTP代理訪問 遇到這樣的一個場景&#xff0c;代碼部署到私有服務器上去之后&#xff0c;這臺私有服務器a無法直接訪問公網&#xff0c;需要通過代理轉發到另外一臺專門訪問公網的服務器b, 讓服務器b去請求對應的公網ip&#xff0c;于是就需要設置Http代理。 …

在C# WebApi 中使用 Nacos01:基礎安裝教程和啟動運行

一、JDK的安裝 Nacos需要依賴JAVA環境運行,所以需要先安裝JDK 1.檢查是否安裝 可用命令行檢查是否安裝JDK 直接win+r,cmd: java -version 出現這個說明安裝成功 2.下載JDK 訪問官網點擊下載:

cURL 入門:10 分鐘學會用命令行發 HTTP 請求

curl初識 curl 通過 URL 傳輸數據的命令行工具和庫是一個非常強大的命令行工具&#xff0c;用于在網絡上傳輸數據。它支持眾多的協議&#xff0c;像 dict file ftp ftps gopher gophers http https imap imaps ipfs ipns ldap ldaps mqtt pop3 pop3s rtsp smb smbs smtp smtps…

Redis應用場景實戰:穿透/雪崩/擊穿解決方案與分布式鎖深度剖析

一、緩存異常場景全解與工業級解決方案 1.1 緩存穿透&#xff1a;穿透防御的三重門 典型場景 惡意爬蟲持續掃描不存在的用戶ID 參數注入攻擊&#xff08;如SQL注入式查詢&#xff09; 業務設計缺陷導致無效查詢泛濫 解決方案進化論 第一層防護&#xff1a;布隆過濾器&am…

C# 高效操作excel文件

C#高效操作Excel文件指南 一、主流Excel處理方案對比 方案類型特點適用場景??EPPlus??第三方庫功能全面&#xff0c;性能好&#xff0c;支持.xlsx復雜Excel操作&#xff0c;大數據量??NPOI??第三方庫支持.xls和.xlsx&#xff0c;功能全面兼容舊版Excel文件??Closed…