總感覺k8s中定義的deplyment和service非常的囉嗦,尤其是在選擇器的定義上,但沒辦法,它的設計總有它的道理。
- svc(
spec.selector.app
)- deployment(
metadata.labels.app
,spec.selector.matchLabels.app
)- pods(
metadata.labels.app
)
- pods(
- deployment(
nginx的部署
下面是一個 Kubernetes YAML 檔案示例,用於部署一個 Nginx 服務。該檔案包括 Deployment 和 Service 的定義,Service 型別設定為 ClusterIP。
Nginx 部署 YAML 示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1 # 設定副本數為 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:stable-alpine # 使用最新的 Nginx 映象
ports:
- containerPort: 80 # 容器內部的埠
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: ClusterIP # 使用 ClusterIP 型別
selector:
app: nginx # 根據標籤選擇 Pod
ports:
- port: 80 # Service 的埠
targetPort: 80 # 轉發到容器的埠
說明
-
Deployment:
apiVersion: apps/v1
:指定 API 版本。kind: Deployment
:表示這是一個 Deployment 物件。metadata
:包含物件的後設資料,如名稱和標籤。spec
:定義 Deployment 的規格,包括副本數量、選擇器和 Pod 模板。replicas
:設定執行的 Pod 副本數量。selector
:用於選擇與 Deployment 相關的 Pods。template
:定義 Pod 的模板,包括後設資料和容器規格。containers
:定義容器的名稱、映象和要暴露的埠。
-
Service:
apiVersion: v1
:指定 API 版本。kind: Service
:表示這是一個 Service 物件。metadata
:包含物件的後設資料,如名稱。spec
:定義 Service 的規格,包括型別、選擇器和埠配置。type: ClusterIP
:指定 Service 型別為 ClusterIP,表示只在叢集內部可訪問。selector
:根據標籤選擇與之關聯的 Pods。ports
:定義 Service 的埠和目標埠。
部署步驟
-
將上述 YAML 內容儲存到一個檔案中,例如
nginx-deployment.yaml
。 -
使用以下命令在 Kubernetes 叢集中應用該配置:
kubectl apply -f nginx-deployment.yaml
-
檢查 Deployment 和 Service 是否成功建立:
kubectl get deployments kubectl get services
透過以上步驟,你將能夠在 Kubernetes 中成功部署一個 Nginx 服務,並透過 ClusterIP 型別的 Service 來訪問它。如果你有其他問題或需要進一步的幫助,請隨時告訴我!
關於特別囉嗦的labels的解釋
在 Kubernetes 中,Deployment
的定義中確實存在多個地方使用了相同的標籤(如 metadata.labels.app=nginx
),這有其特定的目的和意義。下面是對這些標籤的詳細解釋及其用意:
1. Metadata Labels
- 位置:在
metadata
部分。 - 作用:
- 用於為
Deployment
物件本身打標籤,這些標籤可以用於標識、選擇或組織 Kubernetes 物件。 - 可以透過這些標籤來查詢和過濾
Deployment
物件,例如使用kubectl get deployments -l app=nginx
來列出所有帶有app=nginx
標籤的 Deployments。 - 在service定義時,它的spec.selector.app會指向被關聯的deployment的.metadata.labels.app的名字
- 用於為
2. Spec Selector
- 位置:在
spec.selector
部分。 - 作用:
- 定義了該
Deployment
控制器所管理的 Pods 的選擇標準。 - Kubernetes 使用此選擇器來確定哪些 Pods 是由這個 Deployment 建立和管理的。
- 選擇器中的標籤必須與 Pods 的標籤匹配,以確保 Deployment 能夠正確地找到和管理這些 Pods。
- 定義了該
3. Template Metadata Labels
- 位置:在
template.metadata.labels
部分。 - 作用:
- 定義將要建立的 Pods 的標籤。
- 當 Deployment 建立 Pods 時,這些標籤會被附加到新建立的 Pods 上。
- 這些標籤用於與
spec.selector
中定義的選擇器進行匹配,從而使 Deployment 能夠跟蹤並管理這些 Pods。
為什麼要重複定義?
-
一致性:
- 在
Deployment
的不同部分使用相同的標籤確保了它們之間的一致性。這種一致性對於 Kubernetes 的操作至關重要,因為它依賴於這些標籤來管理物件。
- 在
-
可管理性:
- 透過使用相同的標籤,可以更方便地進行篩選和管理。例如,你可以快速找到所有與特定應用程式(如 nginx)相關的 Deployments、Pods 和 Services。
-
避免錯誤:
- 確保 Pods 的標籤與 Deployment 的選擇器相匹配,可以避免由於標籤不一致導致的管理問題。如果選擇器未能正確匹配 Pods,Deployment 將無法管理這些 Pods。