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

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

2022년 5월 26일 · 4 분 · Sung-Kyu Yoo

Ansible Molecule으로 테스트 작성하기

Molecule ansible-community 에서 관리하는 Ansible role용 테스트 프레임워크. Molecule는 여러 인스턴스, 운영 체제 및 배포, 가상화 공급자, 테스트 프레임 워크 및 테스트 시나리오를 사용한 테스트를 지원. 설치하기 Pip 설치 시, 시스템 파이썬의 의존성을 꼬이게할 수 있으므로 가급적 Virtualenv로 가상 환경을 만들거나 Pipenv, Poetry 등의 의존성 관리 도구 사용하는 것을 권장. 1 2 # docker 및 yamllint, ansible-lint 패키지 추가로 설치. (podman, vagrant, azure, hetzer 도 지원) $ pip install molecule[docker,lint] 테스트 작성 /path/to/role/molecule/default 경로에 디렉토리 생성. (default 는 기본 시나리오. 다른 이름으로 시나리오 추가 가능함) /path/to/role/molecule/default/molecule.yml 파일 생성 후 아래 내용 입력. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 --- dependency: name: galaxy options: requirements-file: ../../requirements.yml driver: name: docker platforms: - name: instance image: docker.io/python:3.6-slim-buster pre_build_image: true provisioner: name: ansible verifier: name: ansible lint: | set -e yamllint -c ../../.yamllint . ansible-lint -c ../../.ansible-lint /path/to/role/molecule/default/converge.yml 생성 후 환경 구성 코드 추가 도커 컨테이너를 만들고 난 이후에 Role 수행으로 환경을 구성하기 위한 코드를 삽입. (웹 서버 배포 등) ...

2022년 5월 26일 · 2 분 · Sung-Kyu Yoo