在 Kubernetes 環境中管理資源是一項重要的任務,Cloud Custodian 提供了有效的方法來實作這個目標。透過 Python 套件和 YAML 政策檔,可以輕鬆地定義和執行資源管理策略。首先,在虛擬環境中安裝 c7n 和 c7n_kube 套件,確保環境的獨立性和穩定性。接著,利用 c7n schema k8s 指令檢視 Kubernetes 資源的結構定義,以便撰寫符合規範的 YAML 政策。政策中可以使用篩選器精確選取目標資源,並使用操作執行特定的管理任務,例如刪除或標記 Pod。使用 c7n run 指令執行政策,並透過 --output-dir 引數指定輸出目錄,以便收集執行結果和日誌資訊。為了避免非預期變更,建議使用 --dry-run 引數進行測試,確認策略的行為符合預期。Cloud Custodian 也提供了快取機制,可以減少 API 呼叫次數,提高執行效率。在除錯過程中,可以透過日誌檔 custodian-run.log 以及 metadata.json 和 resources.json 檔案分析策略的執行情況和資源的狀態。
在虛擬環境中安裝與設定Cloud Custodian
當虛擬環境啟動後,命令提示字元會標記虛擬環境的名稱:
# 啟動虛擬環境並顯示命令提示字元標籤
(c7n-env) $ ...
建立並啟動c7n-env虛擬環境後,玄貓使用pip(Python套件安裝程式)在虛擬環境中安裝c7n套件。首先,玄貓檢查了pip的版本,確認它已連線到剛建立並啟動的虛擬環境:
# 在虛擬環境中使用pip
$ pip --version
pip 23.0.1 from /Users/.../c7n-env/lib/python3.11/site-packages/pip (python 3.11)
內容解密:
- 這段程式碼用於檢查虛擬環境中的pip版本。
pip --version指令用於顯示目前pip的版本資訊。- 結果顯示pip版本為23.0.1,並且位於虛擬環境的路徑中。
接著,玄貓安裝了c7n核心套件和c7n Kubernetes外掛程式:
# 安裝c7n核心套件
$ pip3 install c7n
Successfully installed argcomplete-3.1.1 attrs-23.1.0 boto3-1.26.157 botocore-1.29.157 c7n-0.9.28 docutils-0.18.1 importlib-metadata-5.2.0 jmespath-1.0.1 jsonschema-4.17.3 pyrsistent-0.19.3 python-dateutil-2.8.2 pyyaml-6.0 s3transfer-0.6.1 six-1.16.0 tabulate-0.9.0 urllib3-1.26.16 zipp-3.15.0
# 安裝c7n Kubernetes外掛程式
$ pip3 install c7n_kube
Successfully installed c7n_kube-0.2.27 cachetools-5.3.1 certifi-2023.5.7 charset-normalizer-3.1.0 google-auth-2.20.0 idna-3.4 jsonpatch-1.33 jsonpointer-2.4 kubernetes-26.1.0 oauthlib-3.2.2 pyasn1-0.5.0 pyasn1-modules-0.3.0 requests-2.31.0 requests-oauthlib-1.3.1 rsa-4.9 setuptools-68.0.0 websocket-client-1.6.0
內容解密:
- 使用
pip3 install c7n安裝c7n核心套件及其依賴項。 - 使用
pip3 install c7n_kube安裝c7n Kubernetes外掛程式及其依賴項。 - 安裝結果顯示了成功安裝的套件及其版本。
安裝完成後,玄貓使用tree指令檢視已安裝的c7n相關套件:
# 檢視已安裝的c7n相關套件
$ tree c7n-env --prune -P 'c7n*' --matchdirs
c7n-env
├── bin
│ └── c7n-kates
└── lib
└── python3.11
└── site-packages
├── c7n
├── c7n-0.9.28.dist-info
├── c7n_kube
└── c7n_kube-0.2.27.dist-info
內容解密:
tree指令用於以樹狀結構顯示目錄內容。--prune選項用於在指定模式匹配時保留目錄。-P 'c7n*'選項用於匹配名稱以c7n開頭的檔案或目錄。- 結果顯示了虛擬環境中安裝的
c7n相關套件的目錄結構。
設定與驗證Cloud Custodian
安裝完成後,玄貓設定了一個別名以便於使用custodian二進位檔案:
# 設定別名以便於使用custodian
$ alias c7n='custodian'
內容解密:
alias指令用於建立命令別名。- 這裡建立了一個名為
c7n的別名,指向custodian命令。
接著,玄貓驗證了c7n是否正確安裝以及c7n_kube外掛程式是否正常運作:
# 驗證c7n是否正確安裝
$ c7n version
0.9.28
# 驗證c7n_kube外掛程式是否正常運作
$ c7n schema k8s
resources:
...
內容解密:
c7n version指令用於顯示目前安裝的c7n版本。c7n schema k8s指令用於顯示Kubernetes資源的結構定義。
Cloud Custodian的政策與應用
政策的基本結構
Cloud Custodian(c7n)的政策是以YAML格式撰寫的。這些政策根據c7n Kubernetes架構,如前所述,在「安裝」一節中提到的Pod架構範例中,我們可以看到可用的篩選器和操作。
# c7n Kubernetes Pod政策架構
$ c7n schema k8s.pod
k8s.pod:
actions:
- auto-label-user
- delete
- event-label
- label
- patch
- webhook
filters:
- event
- list-item
- reduce
- value
內容解密:
這段程式碼顯示了Kubernetes Pod資源可用的操作和篩選器。
在高層級上,c7n政策使用篩選器來選擇(篩選出或篩選進)資源。例如,以下政策根據條件 metadata.labels.test=c7n 篩選出Pod;該政策對所選資源不採取任何行動:
# 蒐集Pod的政策範例
policies:
- name: collect-pods
description: |
蒐集具有標籤test:c7n的Pod
resource: k8s.pod
filters:
- type: value
key: metadata.labels.test
value: c7n
內容解密:
此YAML政策定義了一個名為 collect-pods 的規則,用於選擇具有特定標籤(test=c7n)的Pod資源。
測試與執行
為了測試上述政策,玄貓在minikube叢集中啟動了一個暫停Pod,並執行該政策以蒐集有關該Pod的資訊:
# 在預設名稱空間中啟動暫停Pod
$ kubectl run pause --image=registry.k8s.io/pause:3.1 --labels=test=c7n
# 執行無動作的c7n政策以蒐集資訊
$ c7n run --output-dir=output policies/collect-pods.yaml --cache-period 0 -v
2023-07-02 22:33:16,795: custodian.policy:INFO policy:collect-pods resource:k8s.pod region: count:1 time:0.04
內容解密:
這段程式碼展示瞭如何執行一個測試Pod,並執行一個無動作的Cloud Custodian政策以蒐集有關該Pod的資訊。
執行後,c7n會產生三個輸出檔案,如下所示:
# c7n輸出檔案
$ tree -L 1 output/collect-pods
output/collect-pods
├── custodian-run.log
├── metadata.json
└── resources.json
內容解密:
這段程式碼顯示了執行Cloud Custodian政策後生成的輸出檔案結構,包括日誌檔、元資料檔和資源檔。
Cloud Custodian快取機制與效能最佳化
Cloud Custodian預設使用15分鐘的快取來減少API呼叫和資料流量。可以使用 -f CACHE, --cache CACHE 引數來設定快取檔案。在macOS上,預設路徑是 ~/.cache/cloud-custodian.cache
程式碼範例與說明
雖然快取可以提高Cloud Custodian的操作效能,但在原型設計和測試政策時,停用快取可確保政策處理最新的資源:
# 停用快取以確保處理最新資源
$ c7n run --cache-period 0 ...
內容解密:
這段程式碼展示瞭如何在執行Cloud Custodian時停用快取,以確保處理最新的資源狀態。
Cloud Custodian日誌分析
日誌檔 custodian-run.log 包含了每次執行的日誌記錄。多次執行的日誌範例如下:
# c7n執行日誌範例
2023-07-02 22:33:16,795 - custodian.policy - INFO - policy:collect-pods resource:k8s.pod region: count:1 time:0.
04
2023-07-02 22:39:14,659 - custodian.policy - DEBUG - Running policy:collect-pods resource:k8s.pod region:default c7 n:0.
9.
28
2023-
07-
02
22:
39:
14,
661
-
custodian.k8s.client
-
DEBUG
-
connecting to https://127.
0.
0.
1:
64679
...
圖表說明:Cloud Custodian處理流程圖
graph LR;
A[開始] --> B[載入政策];
B --> C[篩選資源];
C --> D[執行操作];
D --> E[生成報告];
E --> F[結束];
圖表翻譯: 此圖示展示了Cloud Custodian的基本處理流程,包括載入政策、篩選資源、執行操作和生成報告等步驟。
後續步驟與探討
在掌握了Cloud Custodian的基本使用方法後,可以進一步探討以下主題:
多雲端環境管理
研究如何使用Cloud Custodian管理多個雲端服務提供商(如AWS、Azure、GCP)的資源。這包括設定不同的雲端提供商、撰寫跨雲端的政策等。
自動化與整合
探討如何將Cloud Custodian整合到CI/CD流程中,以實作自動化的安全性和合規性檢查。這包括與Jenkins、GitLab CI等工具的整合。
自訂政策開發
開發自訂的Cloud Custodian政策,以滿足特定的安全需求或合規要求。這包括撰寫自訂篩選器和操作,以及測試和驗證這些自訂政策。
效能最佳化與調校
進一步最佳化Cloud Custodian的效能,包括調整快取設定、使用更高效的篩選器和操作等,以提高執行效率和減少資源消耗。
透過這些探討,可以進一步提升Cloud Custodian的使用價值,並更好地滿足複雜雲端環境下的安全管理需求。
Cloud Custodian 與 Kubernetes 的整合應用
Cloud Custodian(c7n)是一種強大的工具,用於管理和最佳化雲端資源。在 Kubernetes 環境中,c7n 能夠有效地選擇和管理 Pod 資源。本文將探討 c7n 在 Kubernetes 中的應用,特別是在資源篩選和操作方面的功能。
瞭解 c7n 的執行日誌
當執行 c7n 命令時,日誌提供了豐富的資訊。首先,日誌顯示了 c7n 連線的叢集位址,這是透過本地的 kubectl 組態實作的。此外,日誌還指出篩選器如何將收集的 Pod 從八個減少到一個,並且提供了策略執行的時間(以秒為單位)。
執行日誌範例
2023-07-02 23:53:07,904: custodian.resources.pod:DEBUG Filtered from 8 to 1 pod
2023-07-02 23:53:07,904: custodian.policy:INFO policy:delete-pods resource:k8s.pod region: count:1 time:0.05
metadata.json 檔案解析
metadata.json 檔案描述了 c7n 策略的執行情況。該檔案包含了命令列設定的引數以及執行的實際屬性。
metadata.json 檔案內容
{
"policy": {
"name": "collect-pods",
"description": "Collects pods with label test:c7n\n",
"resource": "k8s.pod",
"filters": [
{
"type": "value",
"key": "metadata.labels.test",
"value": "c7n"
}
]
},
"version": "0.9.28",
"execution": {
"id": "b74ef210-6225-41f2-84cf-7a87fc363958",
"start": 1688353712.7711701,
"end_time": 1688353712.8165162,
"duration": 0.04534602165222168
}
}
resources.json 檔案解析
resources.json 檔案描述了根據策略 YAML 中設定的篩選條件所選擇的資源。該檔案的格式與 Kubernetes API 物件結構相似,但使用了 Python 風格的蛇形命名法。
resources.json 檔案內容
[
{
"api_version": null,
"kind": null,
"metadata": {
"labels": {
"app": "test",
"billing": "lob-cc",
"env": "dev",
"owner": "jimmy",
"test": "c7n"
},
"name": "test-pod-1",
"namespace": "policy-test"
},
"spec": {
"containers": [
{
"image": "registry.k8s.io/pause:3.1"
}
]
}
}
]
無動作策略的應用
無動作策略允許使用者在不採取任何動作的情況下收集資源資訊。這種方法可以用於報告或評估新策略的影響。
帶有動作的策略
除了篩選資源外,c7n 還支援對資源進行變更。以下是一個刪除帶有特定標籤的 Pod 的策略範例。
刪除 Pod 的策略
policies:
- name: delete-pods
description: Deletes pods with label test:c7n
resource: k8s.pod
filters:
- type: value
key: metadata.labels.test
value: c7n
actions:
- type: delete
使用 dry-run 模式測試策略
在實際執行刪除操作之前,可以使用 dry-run 模式來測試策略的效果。
dry-run 模式命令
$ custodian run -d --output-dir=output policies/delete-pods.yaml --cache-period 0 -v
輸出結果分析
執行完策略後,c7n 會根據輸出目錄設定和策略名稱組織輸出檔案。
輸出檔案結構
output
├── collect-pods
│ ├── custodian-run.log
│ ├── metadata.json
│ └── resources.json
└── delete-pods
├── custodian-run.log
├── metadata.json
└── resources.json
Cloud Custodian
隨著雲原生技術的發展,Cloud Custodian 在 Kubernetes 環境中的應用將會越來越廣泛。未來,c7n 有望整合更多的 Kubernetes 資源和功能,提供更豐富的策略和操作選項。
Cloud Custodian 的安全性考量
在使用 c7n 時,需要注意安全性問題。例如,在使用刪除操作時,務必謹慎評估其影響,以避免意外刪除重要資源。
程式碼範例:自定義篩選器
以下是一個自定義篩選器的範例,用於篩選特定名稱空間中的 Pod。
自定義篩選器程式碼(Python)
from c7n.filters import Filter
class NamespaceFilter(Filter):
def __init__(self, data, manager=None):
super(NamespaceFilter, self).__init__(data, manager)
self.namespace = data.get('namespace')
def process(self, resources, event=None):
return [r for r in resources if r['metadata']['namespace'] == self.namespace]
# 使用自定義篩選器的策略範例
policies:
- name: filter-by-namespace
resource: k8s.pod
filters:
- type: NamespaceFilter
namespace: policy-test
圖表說明:c7n 工作流程
graph LR;
A[開始] --> B[c7n 命令執行];
B --> C[載入策略];
C --> D[篩選資源];
D --> E[執行動作];
E --> F[輸出結果];
圖表翻譯: 此圖示展示了 Cloud Custodian 的工作流程。首先,c7n 命令被執行,接著載入指定的策略。然後,根據策略中的篩選條件選擇相應的資源。最後,執行策略中定義的動作,並輸出結果。
詳細解說
Cloud Custodian 的工作流程可以分為幾個主要步驟:命令執行、策略載入、資源篩選、動作執行和結果輸出。每一步都是整個流程中不可或缺的一部分。
命令執行
當使用者執行 c7n 命令時,程式首先會解析命令列引數,並根據引數載入相應的策略檔案。
策略載入
策略檔案定義了 c7n 的操作邏輯,包括要管理的資源型別、篩選條件和要執行的動作。c7n 支援 YAML 和 JSON 格式的策略檔案。
資源篩選
根據策略中定義的篩選條件,c7n 對 Kubernetes 中的資源進行篩選。這一步驟確保只有符合條件的資源才會被進一步處理。
動作執行
在完成資源篩選後,c7n 將根據策略中定義的動作對篩選出的資源進行操作。這些動作可以包括刪除、標記等。
結果輸出
最後,c7n 將操作的結果輸出到指定的目錄中,包括執行的日誌、元資料和資源資訊等。這些輸出結果對於後續的稽核和分析非常有幫助。