Pods:
- Kubernetes 中最基本的部署單位,它代表了在集群中運行的一組一個或多個容器。每個 Pod 都會分配到一個特定的節點(Node)上運行。
- Pod 內的容器共享相同的 IP 地址、Port 範圍,並能夠彼此透過 localhost 通訊。
- 如果 Pod 遭到節點故障或其他原因導致失效,它不會自動重新創建。
1 2 3 4 5 6 7 8 9
| apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image: nginx:latest
|
Deployments:
- Deployment 是更高階的 Kubernetes 管理物件,主要用於維護應用程式的狀態和更新。
- Deployment 控制和管理一組 Pod 的副本(replicas),確保指定數量的 Pod 副本處於運行狀態。
- Deployment 支持滾動更新,可以在不停機的情況下更新應用程序的版本,並在更新過程中保持一定數量的 Pod 在線。
- Deployment 透過 ReplicaSet(另一種 Kubernetes 資源)來保持 Pod 的副本數量。每次 Deployment 更新時,它會創建一個新的
ReplicaSet,並逐漸增加新副本的數量同時減少舊副本的數量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| apiVersion: apps/v1 kind: Deployment metadata: name: example-deployment spec: replicas: 3 selector: matchLabels: app: example template: metadata: labels: app: example spec: containers: - name: example-container image: nginx:latest
|
Service:
用於定義如何訪問一組特定的 Pods,無論背後 Pod 的數量如何變化。Service 確保應用的可訪問性和服務發現。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| apiVersion: apps/v1 kind: Deployment metadata: name: example-deployment spec: replicas: 3 selector: matchLabels: app: example template: metadata: labels: app: example spec: containers: - name: example-container image: nginx:latest
|
用途: Service 提供一個固定的 IP 地址和 DNS 名稱給一組特定的 Pod,即使 Pod 被替換,這個 IP 地址和 DNS 名稱也保持不變。
ReplicaSet:
確保指定數量的 Pod 副本始終運行。Deployment 在後台使用 ReplicaSet 來管理 Pod 的創建、刪除和替換。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| apiVersion: apps/v1 kind: ReplicaSet metadata: name: my-replicaset spec: replicas: 3 selector: matchLabels: app: MyApp template: metadata: labels: app: MyApp spec: containers: - name: myapp-container image: nginx
|
用途: ReplicaSet 確保指定數量的 Pod 副本始終在運行。如果 Pod 數量少於指定數量,它會啟動新的 Pod。
StatefulSet:
適用於需要穩定的唯一網絡標識符、穩定的持久存儲和有序部署、擴展和滾動更新的應用(如數據庫)。
用途: StatefulSet 是用於需要持久存儲和唯一標識的應用(如數據庫),每個 Pod 的名稱和網絡標識符都是固定且唯一的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| apiVersion: apps/v1 kind: StatefulSet metadata: name: my-statefulset spec: serviceName: "my-service" replicas: 3 selector: matchLabels: app: MyApp template: metadata: labels: app: MyApp spec: containers: - name: myapp-container image: nginx
|
用途: StatefulSet 是用於需要持久存儲和唯一標識的應用(如數據庫),每個 Pod 的名稱和網絡標識符都是固定且唯一的。
DaemonSet:
確保所有(或某些)節點運行一個 Pod 的副本。當節點加入集群時,自動添加 Pod,當節點從集群移除時,也會刪除相應的 Pod。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| apiVersion: apps/v1 kind: DaemonSet metadata: name: my-daemonset spec: selector: matchLabels: app: MyApp template: metadata: labels: app: MyApp spec: containers: - name: myapp-container image: nginx
|
用途: DaemonSet 確保每個節點上運行一個 Pod 的副本,常用於運行集群存儲、日誌收集等背景服務。
Job:
用於執行終止型任務,即只運行到完成。這適合批處理任務,一旦任務完成,Pod 會被標記為完成,不會重新啟動。
1 2 3 4 5 6 7 8 9 10 11 12
| apiVersion: batch/v1 kind: Job metadata: name: my-job spec: template: spec: containers: - name: myjob-container image: busybox command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600'] restartPolicy: Never
|
Job 用於執行一次性任務,任務完成後,Pod 不會重新啟動。
CronJob:
管理基於時間的 Job,相當於 Unix 系統中的 cron,可以按計劃時間執行任務。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| apiVersion: batch/v1beta1 kind: CronJob metadata: name: example-cronjob spec: schedule: "0 1 * * *" jobTemplate: spec: template: spec: containers: - name: example-job image: busybox args: - /bin/sh - -c - date; echo Hello from the Kubernetes cluster restartPolicy: OnFailure
|
用途: CronJob 根據設定的時間表(每天凌晨 1 點)運行任務,執行命令來打印當前日期和消息。
Ingress:
管理外部訪問到集群內服務的路由規則,提供統一的入口點來管理外部訪問。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: myapp.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-service port: number: 80
|
用途: Ingress 為 myapp.example.com 提供外部訪問,所有對此主機的 HTTP 請求都被路由到名為 my-service 的 Service 上。
ConfigMap 和 Secret:
ConfigMap 用於存儲應用程序配置的非機密數據,Secret 用於存儲機密數據。兩者都可以被 Pod 以環境變量或文件的形式使用。
1 2 3 4 5 6 7 8 9 10
| apiVersion: v1 kind: ConfigMap metadata: name: example-configmap data: app-settings.json: | { "setting1": "value1", "setting2": "value2" }
|
用途: ConfigMap 存儲非機密配置數據,可以被 Pod 使用來配置應用程序。
1 2 3 4 5 6 7 8
| apiVersion: v1 kind: Secret metadata: name: example-secret type: Opaque data: username: dXNlcm5hbWU= password: cGFzc3dvcmQ=
|
用途: Secret 存儲機密信息,如用戶名和密碼,這些信息可以被 Pod 安全地使用。
PersistentVolume 和 PersistentVolumeClaim:
管理存儲資源。PersistentVolume 是集群中的一塊存儲,而 PersistentVolumeClaim 是用戶對存儲的請求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| apiVersion: v1 kind: PersistentVolume metadata: name: example-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: standard hostPath: path: "/mnt/data"
|
1 2 3 4 5 6 7 8 9 10 11 12
| apiVersion: v1 kind: PersistentVolumeClaim metadata: name: example-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: standard
|
用途: PersistentVolume 提供集群中的存儲資源,而 PersistentVolumeClaim 由用戶提出以使用這些存儲資源。在這個例子中,PVC 要求具有與 PV 相同的存儲容量和訪問模式。