Kubernetes 安全性設定包含 runAsGroup
與 fsGroup
等欄位,用於設定容器內的一般群組與檔案系統群組 ID,確保容器內部的檔案許可權控管。文章也探討了 Kubernetes 的 Pod 生命週期管理,包含如何使用控制器如 ReplicaSet、Deployment、DaemonSet、StatefulSet、Job 和 CronJob 來管理不同型別的應用程式。此外,文章也深入探討了 Pod 的排程策略,例如 Node 親和性、Pod 親和性和反親和性,以及如何使用汙點和容忍度來控制 Pod 的佈署位置。持久化儲存、映象提取金鑰和重啟策略等 Pod 管理的關鍵導向也有詳細說明。最後,文章也說明瞭如何在 Kubernetes 中使用 TLS 證書和金鑰來確保連線安全,以及如何使用 Ingress 控制器來管理外部流量。
什麼是 runAsGroup
?
runAsGroup
是 securityContext
中的一個子欄位,用於設定容器內的群組 ID。它可以是數字或字串,表示容器內的群組 ID。
什麼是 fsGroup
?
fsGroup
是 securityContext
中的一個子欄位,used設定容器內的檔案系統群組 ID。它可以是數字或字串,表示容器內的檔案系統群組 ID。
如何在 Kubernetes 中設定 fsGroup
?
可以在 Kubernetes 的 Pod 或 Deployment 組態檔中設定 fsGroup
欄位。例如:
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
spec:
containers:
- name: demo-container
image: cloudnatived/demo:hello
securityContext:
fsGroup: 1000
這個範例設定了 fsGroup
欄位為 1000,表示容器內的檔案系統群組 ID 為 1000。
8.1 安全性概述
在 Kubernetes 中,安全性是非常重要的。Kubernetes 提供了多種安全機制來保護叢集和應用程式。其中包括網路策略、秘密管理、根據角色的存取控制(RBAC)等。
8.2 根據使用者的安全性
Kubernetes 支援根據使用者的安全性。每個使用者都有一個唯一的 ID 和組 ID。這些 ID 用於確定使用者的許可權和存取控制。
8.3 根據角色的安全性
Kubernetes 還支援根據角色的安全性。角色是指一組許可權的集合。使用者可以被分配到不同的角色,從而獲得相應的許可權。
8.4 網路策略
Kubernetes 提供了網路策略來控制 pod 之間的通訊。網路策略可以用於限制 pod 之間的流量,提高叢集的安全性。
8.5 秘密管理
Kubernetes 提供了秘密管理機制來儲存和管理敏感資料。秘密可以用於儲存資料函式庫密碼、API 金鑰等敏感資訊。
8.6 根據 Linux 的安全性
Kubernetes 支援根據 Linux 的安全性。Linux 提供了多種安全機制,包括 SELinux、AppArmor 等。這些機制可以用於限制程式的許可權,提高系統的安全性。
8.7 容器安全性
Kubernetes 提供了多種容器安全機制來保護容器。這些機制包括限制容器的許可權、控制容器的網路流量等。
8.8 總結
Kubernetes 提供了多種安全機制來保護叢集和應用程式。這些機制包括根據使用者的安全性、根據角色的安全性、網路策略、秘密管理、根據 Linux 的安全性和容器安全性等。透過合理地使用這些機制,可以提高 Kubernetes 叢集的安全性。
Mermaid 圖表
graph LR A[根據使用者的安全性] -->|實作|> B[根據角色的安全性] B -->|實作|> C[網路策略] C -->|實作|> D[秘密管理] D -->|實作|> E[根據 Linux 的安全性] E -->|實作|> F[容器安全性]
圖表翻譯
此圖表展示了 Kubernetes 中各個安全機制之間的關係。根據使用者的安全性是基礎,根據角色的安全性是在其基礎上實作的。網路策略、秘密管理、根據 Linux 的安全性和容器安全性都是在根據角色的安全性的基礎上實作的。這些安全機制共同保護 Kubernetes 叢集和應用程式。
程式碼範例
import os
# 建立一個空目錄
os.mkdir("emptyDir")
# 將 emptyDir 掛載到容器中
volumes = [
{
"name": "cache-volume",
"emptyDir": {}
}
]
# 建立一個 pod
pod = {
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "example-pod"
},
"spec": {
"volumes": volumes,
"containers": [
{
"name": "example-container",
"image": "example-image",
"volumeMounts": [
{
"name": "cache-volume",
"mountPath": "/cache"
}
]
}
]
}
}
內容解密
此程式碼範例展示瞭如何建立一個空目錄並將其掛載到容器中。首先,建立一個空目錄 emptyDir
。然後,定義一個 volumes
列表,其中包含一個 emptyDir
卷。接下來,建立一個 pod,並將 volumes
列表新增到 pod 的 spec
中。最後,在容器中掛載 cache-volume
捲到 /cache
路徑。這樣,容器就可以存取 emptyDir
目錄了。
Kubernetes 中的容器和 Pod
Kubernetes 是一個容器協調系統,它可以自動化佈署、擴充套件和管理容器化應用。要了解 Kubernetes,首先需要了解容器和 Pod。
容器
容器是 Kubernetes 中的基本執行單位。每個容器代表一個執行中的程式,它可以包含一個或多個程式。容器之間是相互隔離的,每個容器都有自己的檔案系統、網路堆疊和程式空間。
在 Linux 系統中,容器是透過 namespace 和 cgroup 實作的隔離。namespace 提供了對資源的隔離,如 PID、網路、 mounts 等,而 cgroup 提供了對資源的限制,如 CPU、記憶體等。
Pod
Pod 是 Kubernetes 中的最小執行單位,它代表了一組緊密耦合的容器。每個 Pod 都有自己的 IP 地址和埠號,Pod 內的容器可以相互通訊。
Pod 可以包含一個或多個容器,每個容器都執行在同一個網路名稱空間中。Pod 的生命週期由 Kubernetes 管理,當 Pod 被建立時,Kubernetes 會分配資源並啟動容器。當 Pod 被刪除時,Kubernetes 會停止容器並釋放資源。
持久化儲存
在 Kubernetes 中,持久化儲存是透過 Persistent Volume (PV) 和 Persistent Volume Claim (PVC) 實作的。PV 是一個儲存資源,它可以被 PVC 請求。PVC 是一個儲存請求,它可以被 PV 滿足。
當一個 Pod 需要持久化儲存時,它可以請求一個 PVC,Kubernetes 會分配一個 PV 來滿足這個請求。Pod 可以使用這個 PV 來儲存資料,當 Pod 被刪除時,PV 會被保留,資料不會丟失。
映象提取金鑰
在 Kubernetes 中,映象提取金鑰是透過 Secret 物件實作的。Secret 物件可以儲存敏感資訊,如映象倉函式庫的使用者名稱和密碼。
當一個 Pod 需要提取映象時,它可以使用 Secret 物件來提供映象倉函式庫的認證資訊。Kubernetes 會使用這個 Secret 物件來提取映象,並將其儲存在 Pod 的檔案系統中。
重啟策略
在 Kubernetes 中,重啟策略是透過 restartPolicy 欄位實作的。restartPolicy 欄位可以設定為 Always、OnFailure 或 Never。
- Always:總是重啟容器,即使容器正常離開。
- OnFailure:只有當容器異常離開時才重啟。
- Never:從不重啟容器,即使容器異常離開。
本文介紹了 Kubernetes 中的容器和 Pod,以及持久化儲存、映象提取金鑰和重啟策略等概念。這些概念是理解 Kubernetes 的基礎,希望本文能夠幫助讀者更好地理解 Kubernetes。
Kubernetes 中的標籤和選擇器
Kubernetes 中的標籤(labels)是鍵值對,用於為物件(如 Pod)新增有意義的屬性。這些標籤可以用於篩選和選擇特定的物件。
標籤的作用
標籤可以用於:
- 標識物件的屬性,例如應用名稱、環境等
- 篩選和選擇特定的物件
- 實作資源的分組和管理
選擇器
選擇器(selector)是用於篩選標籤的表示式。選擇器可以用於:
- 根據標籤篩選物件
- 實作資源的自動化管理
標籤和選擇器的使用
標籤和選擇器可以用於各種場景,例如:
- 根據應用名稱篩選 Pod
- 根據環境篩選 Pod
- 實作藍綠佈署和金絲雀釋出
標籤和註解的區別
標籤和註解(annotations)都是鍵值對,但是它們的作用不同:
- 標籤用於標識物件的屬性和篩選物件
- 註解用於儲存物件的元資料和提供額外資訊
標籤的限制
標籤有以下限制:
- 標籤鍵的長度不能超過 63 個字元
- 標籤值的長度不能超過 63 個字元
- 標籤鍵必須以字母或數字開頭,且只能包含字母、數字、連字元、下劃線和點號
節點親和性
節點親和性(node affinity)是 Kubernetes 中一種用於控制 Pod 排程的機制。它允許使用者根據節點的屬性來決定 Pod 的排程。
節點親和性的型別
節點親和性有兩種型別:
- 硬親和性(required):如果節點不滿足親和性條件,Pod 將不會被排程到該節點
- 軟親和性(preferred):如果節點滿足親和性條件,Pod 將優先被排程到該節點,但是如果沒有滿足條件的節點,Pod 也可以被排程到其他節點
節點親和性的使用場景
節點親和性可以用於以下場景:
- 根據節點的資源和屬性來決定 Pod 的排程
- 實作高用性和容錯移轉
- 實作藍綠佈署和金絲雀釋出
節點親和性的組態
節點親和性可以透過 nodeAffinity
欄位來組態。例如:
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
spec:
containers:
- name: demo-container
image: demo-image
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/worker
operator: In
values:
- true
在這個例子中,Pod 將只被排程到具有 node-role.kubernetes.io/worker
標籤且值為 true
的節點上。
Kubernetes 中的 Pod 排程和管理
Kubernetes 提供了多種方式來管理和排程 Pod,包括 Node 親和性、Pod 親和性和反親和性、汙點(Taints)和容忍度(Tolerations)等。
Node 親和性
Node 親和性(Node Affinity)允許您根據 Node 的標籤來控制 Pod 的排程。有兩種型別的 Node 親和性:requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedulingIgnoredDuringExecution。
- requiredDuringSchedulingIgnoredDuringExecution:這是一個硬性要求,如果 Node 不滿足條件,Pod 將不會被排程。
- preferredDuringSchedulingIgnoredDuringExecution:這是一個軟性要求,如果 Node 滿足條件,Pod 將被優先排程到該 Node,但如果沒有滿足條件的 Node,Pod 仍然可以被排程到其他 Node。
Pod 親和性和反親和性
Pod 親和性(Pod Affinity)和反親和性(Pod AntiAffinity)允許您根據 Pod 的標籤來控制 Pod 的排程。有兩種型別的 Pod 親和性:requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedulingIgnoredDuringExecution。
- requiredDuringSchedulingIgnoredDuringExecution:這是一個硬性要求,如果 Pod 不滿足條件,Pod 將不會被排程。
- preferredDuringSchedulingIgnoredDuringExecution:這是一個軟性要求,如果 Pod 滿足條件,Pod 將被優先排程到該 Node,但如果沒有滿足條件的 Node,Pod 仍然可以被排程到其他 Node。
汙點(Taints)和容忍度(Tolerations)
汙點(Taints)是 Node 的一個屬性,用於表示 Node 是否可以執行某些 Pod。容忍度(Tolerations)是 Pod 的一個屬性,用於表示 Pod 是否可以執行在具有某些汙點的 Node 上。
- NoSchedule:表示 Pod 不可以被排程到具有該汙點的 Node 上。
- PreferNoSchedule:表示 Pod 儘量不被排程到具有該汙點的 Node 上,但如果沒有其他選擇,仍然可以被排程。
- NoExecute:表示如果 Pod 已經執行在具有該汙點的 Node 上,Pod 將被終止。
示例
以下是一個示例,展示瞭如何使用 Node 親和性、Pod 親和性和反親和性、汙點和容忍度來控制 Pod 的排程:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/worker
operator: In
values:
- "true"
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- "example-app"
topologyKey: kubernetes.io/hostname
tolerations:
- key: "example-key"
operator: "Equal"
value: "example-value"
effect: "NoSchedule"
在這個示例中,Pod example-pod
將被排程到具有標籤 node-role.kubernetes.io/worker=true
的 Node 上,並且將被排程到與具有標籤 app=example-app
的 Pod 相同的主機上。此外,Pod 還可以執行在具有汙點 example-key=example-value
的 Node 上。
Kubernetes 中的 pod 控制器
Kubernetes 提供了多種 pod 控制器來管理 pod 的生命週期。這些控制器可以確保 pod 的數量、狀態和資源分配符合預期。
1. ReplicaSet
ReplicaSet 是一種控制器,確保指定數量的 pod 副本執行在叢集中。它可以自動替換因故障或其他原因而終止的 pod。
示例:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-replicaset
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: my-image
2. Deployment
Deployment 是一種控制器,管理 ReplicaSet 和 pod 的版本更新。它可以自動滾動更新 pod 的版本。
示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: my-image
3. DaemonSet
DaemonSet 是一種控制器,確保每個節點執行一個 pod 副本。它常用於日誌收集、監控和其他需要在每個節點執行的任務。
示例:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: my-daemonset
spec:
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: my-image
4. StatefulSet
StatefulSet 是一種控制器,管理有狀態的應用程式。它可以確保 pod 的順序啟動和終止。
示例:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-statefulset
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: my-image
5. Job
Job 是一種控制器,執行批處理任務。它可以確保任務完成後自動終止。
示例:
apiVersion: batch/v1
kind: Job
metadata:
name: my-job
spec:
completions: 1
parallelism: 1
template:
metadata:
name: my-job
spec:
containers:
- name: my-container
image: my-image
6. CronJob
CronJob 是一種控制器,執行定時任務。它可以確保任務在指定時間執行。
示例:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: my-cronjob
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
metadata:
name: my-cronjob
spec:
containers:
- name: my-container
image: my-image
這些控制器可以幫助您管理 pod 的生命週期,確保您的應用程式執行穩定和高效。
Kubernetes 中的 CronJob 和 Horizontal Pod Autoscaling
Kubernetes 提供了多種方式來管理和自動化佈署應用程式。其中,CronJob 和 Horizontal Pod Autoscaling 是兩個重要的功能,能夠幫助開發者和維運人員更好地管理應用程式。
CronJob
CronJob 是 Kubernetes 中的一種 Job 型別,用於執行週期性的任務。它可以根據指定的時間表執行一次或多次。CronJob 的組態包括 spec.schedule
和 spec.jobTemplate
兩個部分。spec.schedule
指定了 Job 的執行時間表,而 spec.jobTemplate
則定義了 Job 的範本。
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: demo-cronjob
spec:
schedule:
- cron: 0 0 * * *
jobTemplate:
spec:
template:
spec:
containers:
- name: demo-container
image: busybox
command: ["echo", "Hello World"]
Horizontal Pod Autoscaling
Horizontal Pod Autoscaling (HPA) 是 Kubernetes 中的一種功能,用於自動調整 Pod 的數量以滿足變化的負載需求。HPA 可以根據 CPU 使用率、記憶體使用率等指標來調整 Pod 的數量。
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: demo-hpa
spec:
selector:
matchLabels:
app: demo
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 80
PodPreset
PodPreset 是 Kubernetes 中的一種資源,用於在建立 Pod 時注入特定的組態或卷。PodPreset 可以用於為 Pod 新增特定的環境變數、卷或組態。
apiVersion: settings.k8s.io/v1alpha1
kind: PodPreset
metadata:
name: demo-podpreset
spec:
selector:
matchLabels:
app: demo
volumes:
- name: demo-volume
emptyDir: {}
自定義資源和運運算元
Kubernetes 提供了自定義資源 (CRD) 和運運算元 (Operator) 的功能,用於擴充套件 Kubernetes 的功能。CRD 可以用於定義自定義資源,而運運算元可以用於管理這些資源。
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: demo-crd
spec:
group: demo.io
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
replicas:
type: integer
Ingress
Ingress 是 Kubernetes 中的一種資源,用於管理外部存取叢集的流量。Ingress 可以用於將流量路由到不同的服務或 Pod。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo-ingress
spec:
rules:
- host: demo.io
http:
paths:
- path: /api
backend:
serviceName: demo-service
servicePort: 80
總之,Kubernetes 提供了多種功能和資源來幫助開發者和維運人員管理和自動化佈署應用程式。透過瞭解這些功能和資源,可以更好地利用 Kubernetes 來提高應用程式的可靠性、可擴充套件性和安全性。
Kubernetes 中的 TLS 證書和金鑰
在 Kubernetes 中,TLS 證書和金鑰用於安全地連線到叢集。以下是如何在 Kubernetes 中使用 TLS 證書和金鑰的步驟:
- 生成 TLS 證書和金鑰:您可以使用工具如 OpenSSL 生成 TLS 證書和金鑰。
- 建立 Secret 資源:在 Kubernetes 中,建立一個 Secret 資源來儲存 TLS 證書和金鑰。
- 組態 Ingress 資源:在 Ingress 資源中,組態 TLS 證書和金鑰以啟用 HTTPS 連線。
從產業生態圈的動態變化來看,Kubernetes 安全性機制與核心元件的應用已成為雲原生時代的根本。本文涵蓋了runAsGroup
、fsGroup
、安全性機制、Pod、容器、排程、控制器、CronJob、HPA、PodPreset、CRD、Operator 以及 Ingress 等關鍵技術,展現了 Kubernetes 生態的完整性與複雜性。分析 Kubernetes 各項安全機制與 Pod 生命週期管理的整合價值,可以發現根據角色的存取控制、網路策略以及資源限制等機制有效提升了容器化應用的安全性與穩定性。然而,Kubernetes 的複雜性也帶來了管理和維護的挑戰,需要更完善的工具和最佳實務來簡化操作流程。展望未來,隨著 Service Mesh、Serverless 等技術的興起,Kubernetes 將持續演進並與更多雲原生技術深度融合。玄貓認為,深入理解 Kubernetes 的核心概念和安全機制,並掌握相關最佳實務,對於構建和維護現代化雲原生應用至關重要。