- Ansible Molecule은 Ansible roles를 가상화 기술을 통해 환경을 고립시켜서 환경 구성을 테스트할 수 있게 도와주는 도구.
- KIND는 Kubernetes 클러스터를 도커 컨테이너로 동작시켜주는 도구. 쿠버네티스 클러스터 위에서 리소스를 배치하고 리소스를 확인하거나 어플리케이션 동작을 검증하는 용도로 사용함. (ex, Helm Chart)
제약사항
- Docker Engine 설치
- KIND 설치
- Python libraries 설치
pip install molecule[docker,lint] molecule-docker!=0.3.4 openshift
- Ansible collections 설치
ansible-galaxy collection install community.kubernetes community.docker
테스트 시나리오 작성 및 실행
- 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
- 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
- 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
- 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
- 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
- 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
- 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"
- 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"
- 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 문서를 참고해서 직접 만들어야 함.