在 Kubernetes 環境中管理資源是一項重要的任務,Cloud Custodian 提供了有效的方法來實作這個目標。透過 Python 套件和 YAML 政策檔,可以輕鬆地定義和執行資源管理策略。首先,在虛擬環境中安裝 c7nc7n_kube 套件,確保環境的獨立性和穩定性。接著,利用 c7n schema k8s 指令檢視 Kubernetes 資源的結構定義,以便撰寫符合規範的 YAML 政策。政策中可以使用篩選器精確選取目標資源,並使用操作執行特定的管理任務,例如刪除或標記 Pod。使用 c7n run 指令執行政策,並透過 --output-dir 引數指定輸出目錄,以便收集執行結果和日誌資訊。為了避免非預期變更,建議使用 --dry-run 引數進行測試,確認策略的行為符合預期。Cloud Custodian 也提供了快取機制,可以減少 API 呼叫次數,提高執行效率。在除錯過程中,可以透過日誌檔 custodian-run.log 以及 metadata.jsonresources.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 將操作的結果輸出到指定的目錄中,包括執行的日誌、元資料和資源資訊等。這些輸出結果對於後續的稽核和分析非常有幫助。