k8s 基礎名詞

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= # Base64 encoded 'username'
password: cGFzc3dvcmQ= # Base64 encoded 'password'

用途: Secret 存儲機密信息,如用戶名和密碼,這些信息可以被 Pod 安全地使用。

PersistentVolume 和 PersistentVolumeClaim:

管理存儲資源。PersistentVolume 是集群中的一塊存儲,而 PersistentVolumeClaim 是用戶對存儲的請求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# PersistentVolume
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
# PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: example-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: standard

用途: PersistentVolume 提供集群中的存儲資源,而 PersistentVolumeClaim 由用戶提出以使用這些存儲資源。在這個例子中,PVC 要求具有與 PV 相同的存儲容量和訪問模式。


k8s 基礎名詞
https://shengshengyang.github.io/2024/04/29/k8s-basic/
作者
Dean Yang
發布於
2024年4月29日
許可協議