哈囉,大家好,歡迎來到 K8s的第四天!
在昨天的 Day 10,提到了 Labels
與 Selectors
,知道 Kubernetes 物件之間如何建立關聯。現在我們已經可以在同一個專案內組織 Deployment 和 Service。
今天要介紹一個新的概念:Namespace(命名空間),它可以幫助我們在同一個叢集裡,把資源分組隔離,避免名稱衝突,也方便管理權限和資源配額。
Namespace 是 Kubernetes 提供的一種機制,用來把同一個叢集內的資源邏輯分組。可以把它想成一個工作區或資料夾,每個 Namespace 裡的資源名稱必須唯一,但不同 Namespace 之間可以重複。
看範例可能會比較好懂:
同一 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 等服務。
當你安裝好 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 包含:
可以創建一個 namespace.yaml
檔建立 Namespace,方便版本控制:
# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: project-space # 建立一個 project-space 的命名空間
然後執行:
kubectl apply -f namespace.yaml
-f
是 kubectl
的一個參數,意思是 file(檔案)。它告訴 kubectl 要從哪個 YAML 或 JSON 檔案讀取資源定義,然後套用到叢集。這樣就建立了一個名為 project-space
的 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
Kubernetes 叢集內建了一個服務域名系統:
<service-name>.<namespace-name>.svc.cluster.local
svc.cluster.local
是 K8s 叢集預設的服務域名,平常不需要修改。<namespace-name>.svc.cluster.local
,直接用 Service 名稱即可。舉例來說:
同一 Namespace 內:
若要跟 ota-backend
通訊,用精簡的寫法即可。
ota-backend
跨 Namespace:
跨命名空間就要寫的完整一點。
http://ota-backend.project-space.svc.cluster.local
使用 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
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 怎麼處理應用程式的設定管理和敏感資訊管理,明天見!