Ansible Molecule with Kind - 도커를 활용한 쿠버네티스 자동화 테스트 작성

Ansible Molecule with KIND (Kubernetes IN Docker)

  • Ansible Molecule은 Ansible roles를 가상화 기술을 통해 환경을 고립시켜서 환경 구성을 테스트할 수 있게 도와주는 도구.
  • KIND는 Kubernetes 클러스터를 도커 컨테이너로 동작시켜주는 도구. 쿠버네티스 클러스터 위에서 리소스를 배치하고 리소스를 확인하거나 어플리케이션 동작을 검증하는 용도로 사용함. (ex, Helm Chart)

제약사항

테스트 시나리오 작성 및 실행

  1. Ansible role 생성
 1$ ansible-galaxy role init myrole
 2- Role myrole was created successfully
 3
 4$ tree myrole
 5myrole
 6├── README.md
 7├── defaults
 8│   └── main.yml
 9├── files
10├── handlers
11│   └── main.yml
12├── meta
13│   └── main.yml
14├── tasks
15│   └── main.yml
16├── templates
17├── tests
18│   ├── inventory
19│   └── test.yml
20└── vars
21    └── main.yml
22
23$ vi myrole/meta/main.yml
24---
25collections:
26  - community.kubernetes
27    
28$ vi myrole/tasks/main.yml
29---
30- name: Ensure the K8S Namespace exists.
31  k8s:
32    api_version: v1
33    kind: Namespace
34    name: "myrole-ns"
35    kubeconfig: "{{ kube_config }}"
36    state: present
  1. Molecule default 시나리오 초기화
 1$ cd myrole
 2
 3$ molecule init scenario --dependency-name galaxy --driver-name delegated --provisioner-name ansible --verifier-name ansible default
 4INFO     Initializing new scenario default...
 5INFO     Initialized scenario in /path/to/myrole/molecule/default successfully.
 6
 7$ tree molecule
 8molecule
 9└── default
10    ├── INSTALL.rst
11    ├── converge.yml
12    ├── create.yml
13    ├── destroy.yml
14    ├── molecule.yml
15    └── verify.yml
16
171 directory, 6 files
  1. KIND Config 매니페스트 파일 생성
 1$ mkdir -p molecule/default/manifests
 2$ vi molecule/default/manifests/kindconfig.yaml
 3---
 4kind: Cluster
 5apiVersion: kind.x-k8s.io/v1alpha4
 6networking:
 7  kubeProxyMode: ipvs
 8nodes:
 9  - role: control-plane
10    image: kindest/node:v1.19.7@sha256:a70639454e97a4b733f9d9b67e12c01f6b0297449d5b9cbbef87473458e26dca
11  - role: worker
12    image: kindest/node:v1.19.7@sha256:a70639454e97a4b733f9d9b67e12c01f6b0297449d5b9cbbef87473458e26dca
  1. Molecule default 시나리오 설정 수정
 1$ vi molecule/default/molecule.yml
 2---
 3dependency:
 4  name: galaxy
 5driver:
 6  name: delegated
 7platforms:
 8  - name: instance
 9provisioner:
10  name: ansible
11  inventory:
12    host_vars:
13      localhost:
14        kind_name: myk8s
15        kind_config: manifests/kindconfig.yaml
16        kube_config: /tmp/kind/kubeconfig.yaml
17verifier:
18  name: ansible
  1. Molecule default 시나리오 생성 플레이북 수정
 1$ vi molecule/default/create.yml
 2---
 3- name: Create
 4  hosts: localhost
 5  connection: local
 6  gather_facts: false
 7  tasks:
 8    - name: Create Kubernetes in Docker
 9      command: >-
10        kind create cluster
11          --name {{ kind_name }}
12          --config {{ kind_config }}
13          --kubeconfig {{ kube_config }}
14      changed_when: true
  1. Molecule default 시나리오 삭제 플레이북 수정
 1$ vi molecule/default/destory.yml
 2---
 3- name: Destroy
 4  hosts: localhost
 5  connection: local
 6  gather_facts: false
 7  tasks:
 8    - name: Delete Kubernetes in Docker
 9      command: >-
10        kind delete cluster
11          --name {{ kind_name }}
12          --kubeconfig {{ kube_config }}
13      changed_when: true
  1. Molecule default 사나리오 환경 구축 플레이북 수정
 1$ vi molecule/default/converge.yml
 2---
 3- name: Converge
 4  hosts: localhost
 5  connection: local
 6  gather_facts: false
 7  collections:
 8    - community.kubernetes
 9  tasks:
10    - include_role:
11        name: "myrole"
  1. Molecule default 시나리오 검증 플레이북 수정
 1$ vi molecule/default/verify.yml
 2---
 3- name: Verify
 4  hosts: localhost
 5  connection: local
 6  gather_facts: false
 7  collections:
 8    - community.kubernetes
 9  tasks:
10    - k8s_info:
11        kind: Namespace
12        name: "myrole-ns"
13        kubeconfig: "{{ kube_config }}"
14      register: k8s_info_result
15
16    - assert:
17        that: not k8s_info_result.failed
18        fail_msg: "K8S Namespace not exists"
19        success_msg: "K8S Namspace exists"
  1. Molecule default 시나리오 테스트
 1# Molecule default 시나리오 테스트 수행
 2$ molecule test
 3
 4# Molecule default 시나리오 환경 구축 (Optional)
 5## 쿠버네티스 클러스터와 환경 구축까지만 진행한 상태에서 직접 확인해보고 싶을 때 사용 가능
 6$ molecule converge
 7
 8# Molecule default 시나리오 환경 제거 (Optional)
 9## 수동으로 쿠버네티스 클러스터와 환경 구축을 진행한 경우 직접 삭제를 해줘야 함.
10$ molecule destory

주의사항

  • KIND는 base/node 이미지로 구성
    • base 이미지는 ubuntu, systemd, containers 등의 쿠버네티스가 동작할 수 있는 기반 프로그램이 설치되는 이미지
    • node 이미지는 base 이미지를 기준으로 kubernetes 클러스터 동작을 위한 이미지
    • Ubuntu 버전 등의 기반 패키지의 버전을 실 환경과 동일하게 맞추려면, base/node 이미지를 KIND 문서를 참고해서 직접 만들어야 함.
comments powered by Disqus