Linux中國

使用 Ansible 的 Kubernetes 模塊實現容器編排自動化

Ansible 是實現自動化工作的優秀工具,而 Kubernetes 則是容器編排方面的利器,要是把兩者結合起來,會有怎樣的效果呢?正如你所猜測的,Ansible + Kubernetes 的確可以實現容器編排自動化。

Ansible 模塊

實際上,Ansible 本身只是一個用於解釋 YAML 文件的框架。它真正強大之處在於它豐富的模塊,所謂 模塊 module ,就是在 Ansible 劇本 playbook 中讓你得以通過簡單配置就能調用外部應用程序的一些工具。

Ansible 中有模塊可以直接操作 Kubernetes,也有對一些相關組件(例如 DockerPodman)實現操作的模塊。學習使用一個新模塊的過程和學習新的終端命令、API 一樣,可以先從文檔中了解這個模塊在調用的時候需要接受哪些參數,以及這些參數在外部應用程序中產生的具體作用。

訪問 Kubernetes 集群

在使用 Ansible Kubernetes 模塊之前,先要有能夠訪問 Kubernetes 集群的許可權。在沒有許可權的情況下,可以嘗試使用一個短期在線試用賬號,但我們更推薦的是按照 Kubernetes 官網上的指引,或是參考 Braynt Son 《入門 Kubernetes》的教程安裝 Minikube。Minikube 提供了一個單節點 Kubernetes 實例的安裝過程,你可以像使用一個完整集群一樣對其進行配置和交互。

在安裝 Minikube 之前,你需要確保你的環境支持虛擬化並安裝 libvirt,然後對 libvirt 用戶組授權:

$ sudo dnf install libvirt
$ sudo systemctl start libvirtd
$ sudo usermod --append --groups libvirt `whoami`
$ newgrp libvirt

安裝 Python 模塊

為了能夠在 Ansible 中使用 Kubernetes 相關的模塊,你需要安裝以下這些 Python 模塊:

$ pip3.6 install kubernetes --user
$ pip3.6 install openshift --user

啟動 Kubernetes

如果你使用的是 Minikube 而不是完整的 Kubernetes 集群,請使用 minikube 命令在本地創建一個最精簡化的 Kubernetes 實例:

$ minikube start --driver=kvm2 --kvm-network default

然後等待 Minikube 完成初始化,這個過程所需的時間會因實際情況而異。

獲取集群信息

集群啟動以後,通過 cluster-info 選項就可以獲取到集群相關信息了:

$ kubectl cluster-info
Kubernetes master is running at https://192.168.39.190:8443
KubeDNS is running at https://192.168.39.190:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

使用 k8s 模塊

Ansible 使用 k8s 這個模塊來實現對 Kubernetes 的操作,在劇本中使用 k8s 模塊就可以對 Kuvernetes 對象進行管理。這個模塊描述了 kubectl 命令的最終狀態,例如對於以下這個使用 kubectl 創建新的命名空間的操作:

$ kubectl create namespace my-namespace

這是一個很簡單的操作,而對這個操作的最終狀態用 YAML 文件來描述是這樣的:

- hosts: localhost
  tasks:
    - name: create namespace
      k8s:
        name: my-namespace
        api_version: v1
        kind: Namespace
        state: present

如果你使用的是 Minikube,那麼主機名(hosts)應該定義為 localhost。需要注意的是,所使用的模塊也定義了可用參數的語法(例如 api_versionkind 參數)。

在運行這個劇本之前,先通過 yamllint 命令驗證是否有錯誤:

$ yamllint example.yaml

確保沒有錯誤之後,運行劇本:

$ ansible-playbook ./example.yaml

可以驗證新的命名空間是否已經被創建出來:

$ kubectl get namespaces
NAME              STATUS   AGE
default           Active   37h
kube-node-lease   Active   37h
kube-public       Active   37h
kube-system       Active   37h
demo              Active   11h
my-namespace      Active   3s

使用 Podman 拉取容器鏡像

容器是個 Linux 系統,幾乎是最小化的,可以由 Kubernetes 管理。LXC 項目和 Docker 定義了大部分的容器規範。最近加入容器工具集的是 Podman,它不需要守護進程就可以運行,為此受到了很多用戶的歡迎。

通過 Podman 可以從 Docker Hub 或者 Quay.io 等存儲庫拉取容器鏡像。這一操作對應的 Ansible 語法也很簡單,只需要將存儲庫網站提供的鏡像路徑寫在劇本中的相應位置就可以了:

   - name: pull an image
      podman_image:
        name: quay.io/jitesoft/nginx

使用 yamllint 驗證:

$ yamllint example.yaml

運行劇本:

$ ansible-playbook ./example.yaml
[WARNING]: provided hosts list is empty, only localhost is available.
Note that the implicit localhost does not match 'all'

PLAY [localhost] ************************

TASK [Gathering Facts] ************************
ok: [localhost]

TASK [create k8s namespace] ************************
ok: [localhost]

TASK [pull an image] ************************
changed: [localhost]

PLAY RECAP ************************
localhost: ok=3 changed=1 unreachable=0 failed=0
           skipped=0 rescued=0 ignored=0

使用 Ansible 實現部署

Ansible 除了可以執行小型維護任務以外,還可以通過劇本實現其它由 kubectl 實現的功能,因為兩者的 YAML 文件之間只有少量的差異。在 Kubernetes 中使用的 YAML 文件只需要稍加改動,就可以在 Ansible 劇本中使用。例如下面這個用於使用 kubectl 命令部署 Web 伺服器的 YAML 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-webserver
spec:
  selector:
    matchLabels:
      run: my-webserver
  replicas: 1
  template:
    metadata:
      labels:
        run: my-webserver
    spec:
      containers:
      - name: my-webserver
        image: nginx
        ports:
        - containerPort: 80

如果你對其中的參數比較熟悉,你只要把 YAML 文件中的大部分內容放到劇本中的 definition 部分,就可以在 Ansible 中使用了:

   - name: deploy a web server
      k8s:
        api_version: v1
        namespace: my-namespace
        definition:
          kind: Deployment
          metadata:
            labels:
              app: nginx
            name: nginx-deploy
          spec:
            replicas: 1
            selector:
              matchLabels:
                app: nginx
            template:
              metadata:
                labels:
                  app: nginx
              spec:
                containers:
                  - name: my-webserver
                    image: quay.io/jitesoft/nginx
                    ports:
                      - containerPort: 80
                        protocol: TCP

執行完成後,使用 kubectl 命令可以看到預期中的的 部署 deployment

$ kubectl -n my-namespace get pods
NAME                      READY  STATUS
nginx-deploy-7fdc9-t9wc2  1/1    Running

在雲上使用模塊

隨著現在越來越多的開發和部署工作往雲上轉移的趨勢,我們必須了解如何在雲上實現自動化。其中 k8spodman_image 這兩個模塊只是雲開發中的其中一小部分。你可以在你的工作流程中尋找一些需要自動化的任務,並學習如何使用 Ansible 讓你在這些任務上事半功倍。

via: https://opensource.com/article/20/9/ansible-modules-kubernetes

作者:Seth Kenlon 選題:lujun9972 譯者:HankChow 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國