返回文章列表

Ansible Kubernetes叢集自動化管理

本文探討如何使用 Ansible 自動化管理 Kubernetes 叢集,涵蓋 kOps 建立叢集、Ansible kubernetes.core 集合應用、認證錯誤處理、kubeconfig 設定、Python 虛擬環境建置及 Ansible 集合安裝等導向,提供最佳實踐與操作,有效提升 Kubernetes

Web 開發 DevOps

Ansible 與 Kubernetes 的整合為現代 DevOps 帶來更便捷的叢集管理方案。本文除了介紹使用 kOps 快速佈署 Kubernetes 叢集外,更探討 Ansible kubernetes.core 集合的運用,包含 k8s、helm 等模組的實務操作。同時,針對常見的 Kubernetes 與 OpenShift 認證錯誤,提供詳盡的解決方案,並說明 kubeconfig 檔案的設定與重要性,以確保 Ansible 能夠順利與叢集互動。最後,文章也引導讀者建立 Python 虛擬環境,安裝必要的 Python 函式庫和 Ansible 集合,建立完善的 Ansible Kubernetes 自動化管理環境。

使用kOps建立叢集

Kubernetes Operations(kOps)能夠佈署生產級別的Kubernetes叢集,提供安裝、升級和管理功能,並允許您指定喜好的雲端服務提供商。kOps與雲端服務提供商的獨特功能緊密整合,因此如果您確定將在可預見的未來只使用一個雲端服務提供商平台,那麼它可能是一個更好的選擇。

kOps的優勢

  • 支援dry-runs和自動冪等性
  • 根據YAML清單的組態
  • 多架構支援,包括ARM64

組態Ansible for Kubernetes

幸運的是,有一個Ansible集合設計用於與任何Kubernetes叢集互動。在底層,所有這些資源都透過Python程式語言與Kubernetes API互動並建立Ansible資源。

使用kubernetes.core Ansible集合

您可以使用kubernetes.core Ansible集合與Kubernetes叢集互動。目前可用的資源包括:

  • helm:使用Helm套件管理器新增、更新和刪除Kubernetes套件
  • k8s:與Kubernetes(K8s)物件互動
  • k8s_info:取得有關Kubernetes物件的資訊

等等。這些模組使得使用Ansible管理Kubernetes資源變得更加容易和靈活。

內容解密:

kubernetes.core集合提供了豐富的模組,用於管理Kubernetes資源。例如,使用k8s模組可以建立、更新或刪除Kubernetes物件,而k8s_info模組則用於取得有關這些物件的資訊。這大大簡化了Kubernetes叢集的管理工作。

使用Ansible與Kubernetes的整合管理

Ansible與Kubernetes的結合

在現代的DevOps與自動化維運中,Ansible與Kubernetes的結合成為了一種強大的工具組合。Ansible是一種流行的自動化工具,而Kubernetes則是容器協調的標準。透過將兩者結合,可以實作對Kubernetes叢集的高效管理和自動化操作。

kubernetes.core.k8s模組的重要性

kubernetes.core.k8s模組是Ansible集合中一個非常重要的組成部分。它提供了對Kubernetes API的完整存取能力,使得使用者可以透過Ansible Playbooks來管理和操作Kubernetes資源。

安裝kubernetes.core Ansible集合

要使用kubernetes.core.k8s模組,首先需要確保kubernetes.core Ansible集合已經安裝在系統中。可以使用以下命令來檢查已安裝的Ansible集合:

$ ansible-galaxy collection list

如果kubernetes.core集合未安裝,可以透過以下兩種方式進行安裝:

  • 手動安裝:直接使用ansible-galaxy命令安裝指定的集合。

    $ ansible-galaxy collection install kubernetes.core
    
  • 自動安裝:透過建立一個requirements.yml檔案,列出需要安裝的Ansible集合,然後使用-r引數執行安裝。


collections: - name: cloud.common - name: kubernetes.core

```bash
$ ansible-galaxy install -r collections/requirements.yml

Python依賴安裝

kubernetes.core集合需要Python 3以及kubernetes Python函式庫的支援。可以使用pip3來安裝所需的依賴:

$ pip3 install PyYAML jsonpatch kubernetes

對於需要與Helm套件管理器互動的情況,還需要安裝helm Python函式庫。需要注意的是,helm函式庫使用的是遺留的setup.py安裝方法,對於pip 23.1及以後版本可能需要使用額外的引數:

$ pip3 install --use-pep517 helm

內容解密:

  1. PyYAML:用於處理YAML格式的資料,在Ansible Playbooks中經常用到。
  2. jsonpatch:提供JSON Patch操作,用於處理JSON資料的變更。
  3. kubernetes:Kubernetes官方提供的Python客戶端函式庫,用於與Kubernetes API互動。
  4. --use-pep517引數:由於helm函式庫使用的是非標準的安裝方法,因此需要這個引數來確保安裝過程順利進行。

與Kubernetes叢集的驗證

成功安裝所需的Python和Ansible依賴後,需要對Kubernetes叢集進行驗證,以便透過命令列工具執行API請求。

kubectl與oc命令列工具

  • kubectl:用於與Kubernetes叢集互動的命令列工具,可以透過多種方式安裝,如二進位制檔案、Macports或Homebrew。

    $ brew install kubernetes-cli
    
  • oc:用於與OpenShift叢集互動的命令列工具,同樣有多種安裝方式。

    $ brew install openshift-cli
    

Ansible組態與疑難排解

使用Ansible與Kubernetes互動通常不需要修改Ansible的組態檔案ansible.cfg,但瞭解其組態選項可以幫助自定義和最佳化Ansible的使用。

常見錯誤處理

在使用Ansible管理Kubernetes資源時,可能會遇到諸如401 unauthorized等錯誤,這通常是由於認證問題引起的。確保使用有效的授權令牌或正確的認證組態可以解決這些問題。

Turbo模式的使用

kubernetes.core Ansible集合支援Turbo模式,該模式可以顯著提高效能。要啟用Turbo模式,需要設定環境變數ENABLE_TURBO_MODEtrue1

---
- name: Enable Turbo Mode
  hosts: localhost
  environment:
    ENABLE_TURBO_MODE: true

圖表翻譯:

此圖示呈現了啟用Turbo模式後,Ansible與Kubernetes互動的流程圖。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Ansible Kubernetes叢集自動化管理

package "Kubernetes Cluster" {
    package "Control Plane" {
        component [API Server] as api
        component [Controller Manager] as cm
        component [Scheduler] as sched
        database [etcd] as etcd
    }

    package "Worker Nodes" {
        component [Kubelet] as kubelet
        component [Kube-proxy] as proxy
        package "Pods" {
            component [Container 1] as c1
            component [Container 2] as c2
        }
    }
}

api --> etcd : 儲存狀態
api --> cm : 控制迴圈
api --> sched : 調度決策
api --> kubelet : 指令下達
kubelet --> c1
kubelet --> c2
proxy --> c1 : 網路代理
proxy --> c2

note right of api
  核心 API 入口
  所有操作經由此處
end note

@enduml

圖表翻譯:

此圖示說明瞭在啟用Turbo模式後,Ansible如何透過減少Python模組的載入時間和重複使用已認證的會話來提升效能。

Kubernetes 與 OpenShift 認證錯誤處理及最佳實踐

在利用 Ansible 管理 Kubernetes(K8s)或 OpenShift 叢集時,經常會遇到認證相關的問題。這些問題通常與 Kubernetes 認證機制有關,而非 Ansible Playbook 或其組態問題。本文將探討這些常見錯誤及其解決方案,並提供詳細的操作。

Kubernetes 認證錯誤處理

當使用 Ansible 與 Kubernetes 叢集互動時,常見的錯誤訊息如下:

fatal: [localhost]: FAILED! => {"changed": false, "error": 401, "msg": "Namespace example: Failed to retrieve requested object: b'{\"kind\":\"Status\",\"apiVersion\":\"v1\",\"metadata\":{},\"status\":\"Failure\",\"message\":\"Unauthorized\",\"reason\":\"Unauthorized\",\"code\":401}\\n'", "reason": "Unauthorized", "status": 401}

此錯誤表示未授權存取指定的名稱空間或資源。解決此問題的第一步是確保你已正確設定 Kubernetes 認證。

設定 Kubernetes 認證

  1. 設定憑證:使用 kubectl 命令列工具設定使用者憑證。

    $ kubectl config set-credentials developer/foo.example.com --username=developer --password=developer
    

    這裡建立了一個名為 developer/foo.example.com 的憑證。

  2. 設定叢集連線:組態叢集伺服器資訊。

    $ kubectl config set-cluster foo.example.com --insecure-skip-tls-verify=true --server=https://foo.example.com
    

    這一步驟設定了叢集的連線資訊。

  3. 建立上下文:將叢集和憑證資訊結合到一個上下文中。

    $ kubectl config set-context default/foo.example.com/developer --user=developer/foo.example.com --namespace=default --cluster=foo.example.com
    

    這裡建立了一個名為 default/foo.example.com/developer 的上下文。

  4. 使用上下文:切換到新建立的上下文。

    $ kubectl config use-context default/foo.example.com/developer
    

    之後,所有 kubectl 命令都將在這個上下文中執行。

OpenShift 認證處理

對於 OpenShift 叢集,可以使用 oc 命令列工具進行認證。

使用使用者名稱和密碼登入

$ oc login -u developer -p developer https://api.openshift.example.com:6443

使用 Token 登入

你也可以透過 OpenShift 控制檯取得 Token 進行登入。首先,在控制檯中選擇「Copy Login Command」,然後使用獲得的 Token 進行登入。

$ oc login --token=sha256~xxxxxx --server=https://api.openshift.example.com:6443

成功登入後,認證 Token 將被儲存在本地 .kube 目錄下的 config 檔案中。你可以透過設定 KUBECONFIG 環境變數來指定不同的組態檔案路徑。

$ export KUBECONFIG=/home/devops/.kube/config-developer

並在 Ansible Playbook 中參照此環境變數:

environment:
  KUBECONFIG: "/home/devops/.kube/config-developer"

x509 錯誤處理

當客戶端和伺服器之間的認證機構不匹配時,可能會出現 x509 錯誤。解決方案是使用 --certificate-authority 引數指定認證機構檔案。

$ oc login -u developer -p developer --server=https://api.openshift.example.com:6443 --certificate-authority=/path/to/ca.crt

kubeconfig 檔案

kubectlkubernetes.core Ansible collection 都需要一個有效的 kubeconfig 檔案來連線到 Kubernetes 叢集。該檔案包含叢集的認證資訊,如叢集 CA 證書、端點和叢集名稱等。

kubeconfig 檔案重要性

  • 叢集 CA 證書:用於驗證叢集的身份。
  • 端點:Kubernetes 叢集的主節點 IP 或 DNS 名稱。
  • 叢集名稱:K8s 叢集的名稱。

確保你的 kubeconfig 檔案正確無誤,以避免連線問題。

組態Kubernetes與Ansible的運作環境

在進行Kubernetes(K8s)的自動化管理時,Ansible是一個非常有用的工具。要有效地使用Ansible與K8s互動,需要正確組態相關環境。

設定Kubeconfig檔案

Kubeconfig檔案是Kubernetes叢集組態的關鍵檔案,通常位於~/.kube/config。該檔案包含叢集的認證資訊、叢集名稱、使用者名稱和秘密令牌等。

Kubeconfig檔案結構範例

apiVersion: v1
kind: Config
current-context: <cluster-name>
clusters:
- name: <cluster-name>
  cluster:
    certificate-authority-data: <cluster-ca-cert>
    server: <endpoint>
contexts:
- name: <cluster-name>
  context:
    cluster: <cluster-name>
    user: <cluster-username>
preferences: {}
users:
- name: <cluster-username>
  user:
    token: <secret-token>

設定Kubeconfig路徑

可以透過KUBECONFIG環境變數自定義Kubeconfig檔案的路徑。

$ export KUBECONFIG=$HOME/.kube/config

在Ansible程式碼中,可以使用kubeconfig模組引數或K8S_AUTH_KUBECONFIG環境變數指定自定義路徑。

在Ansible中使用Kubeconfig

kubernetes.core.k8s:
  kubeconfig: '~/.kube/config'

組態Python虛擬環境

Python虛擬環境是保持應用程式環境與系統環境分離的重要工具。為了安裝Ansible及其依賴項,需要建立虛擬環境。

建立虛擬環境

$ python3 -m venv venv

啟動虛擬環境

$ source venv/bin/activate

啟動後,命令提示符前會顯示虛擬環境的名稱。

更新套件管理器

(venv) $ pip3 install --upgrade pip setuptools

安裝必要套件

(venv) $ pip3 install PyYAML jsonpatch kubernetes

對於與Helm套件管理器互動的Ansible模組,需要額外安裝helm Python函式庫。

(venv) $ pip3 install --use-pep517 helm

儲存依賴項到requirements.txt

(venv) $ pip3 freeze > requirements.txt

這將列出所有已安裝的Python函式庫及其依賴項,方便在其他系統上重現相同的環境。

requirements.txt範例

ansible-builder==1.2.0
ansible-runner==2.3.1
bindep==2.11.0
cachetools==5.2.0
certifi==2022.12.7
charset-normalizer==2.1.1
distro==1.8.0
docutils==0.19
google-auth==2.15.0
helm==0.4
idna==3.4
kubernetes==25.3.0
lockfile==0.12.2
oauthlib==3.2.2
packaging==22.0
Parsley==1.3
pbr==5.11.0
pexpect==4.8.0
ptyprocess==0.7.0
pyasn1==0.4.8
pyasn1-modules==0.2.8
python-daemon==2.3.2
python-dateutil==2.8.2
PyYAML==6.0
requests==2.28.1
requests-oauthlib==1.3.1
requirements-parser==0.5.0
rsa==4.9
six==1.16.0
types-setuptools==65.6.0.2
urllib3==1.26.13
websocket-client==1.4.2

安裝Ansible集合

要使用Ansible Turbo功能,需要安裝cloud.common Ansible集合。

(venv) $ ansible-galaxy collection install cloud.common

同樣,執行Kubernetes自動化任務需要kubernetes.core Ansible集合。

(venv) $ ansible-galaxy collection install kubernetes.core

離開虛擬環境

完成工作後,可以離開虛擬環境,傳回系統主控台。

$ deactivate

下次需要使用時,再次執行activate指令碼即可。

虛擬環境的優勢

虛擬環境能夠保留所有已安裝的函式庫和集合,方便重複使用。當Python虛擬環境的複雜度增加時,可以考慮使用Ansible執行環境來簡化管理。