목차
안녕하세요, 13년차 인프라 엔지니어 '13년차의 서버실' 주인장입니다. 오늘은 많은 분들이 고민하시는 쿠버네티스(Kubernetes) 워크플로우 자동화에 대해 이야기해보려고 해요. 특히 AWX를 활용해서 어떻게 복잡한 배포 과정을 효율적으로 관리할 수 있는지, 제가 직접 겪었던 경험과 실전 사례를 중심으로 풀어볼까 합니다. Ansible과 DevOps 문화에 관심 있는 분들이라면 이번 글이 정말 도움이 될 거예요.
저도 처음엔 쿠버네티스 클러스터에 애플리케이션을 배포하는 과정이 꽤나 번거롭더라고요. 매번 kubectl apply -f 명령어를 입력하고, 버전 관리하고, 환경별로 설정 바꾸고… 반복적인 작업은 언제나 실수의 여지를 남기기 마련이잖아요. 그러다 보니 자연스럽게 자동화의 필요성을 느끼게 됐고, 홈랩에서 AWX(Ansible Workflow eXecutor)를 활용한 솔루션을 모색하게 됐습니다. 직접 삽질해가며 구축했던 과정, 지금부터 솔직하게 공유해볼게요.
AWX와 쿠버네티스 연동을 통한 워크플로우 자동화 개요 아키텍처 다이어그램. AWX가 Git 저장소에서 Ansible Playbook을 가져와 쿠버네티스 API를 통해 리소스를 배포하는 과정을 보여줍니다.
AWX와 쿠버네티스, 왜 함께 써야 할까요?
먼저 핵심 개념부터 짚고 넘어갈게요. AWX는 Ansible Automation Platform의 업스트림 오픈소스 프로젝트로, 웹 기반 UI를 통해 Ansible Playbook을 실행하고 관리해주는 도구예요. 쉽게 말해, 터미널에서 명령어로 실행하던 Ansible 작업을 UI로 편하게 스케줄링하고, 권한을 관리하고, 실행 결과를 모니터링할 수 있다는 거죠. 제가 홈랩에서 다양한 자동화 실험을 할 때 정말 유용하게 써먹고 있는 녀석입니다.
그리고 쿠버네티스(Kubernetes, K8s)는 컨테이너화된 워크로드와 서비스를 자동으로 배포, 스케일링 및 관리해주는 오픈소스 시스템이에요. 컨테이너 오케스트레이션(Container Orchestration)의 사실상 표준이 되었죠. 선언적(Declarative) 방식으로 원하는 상태를 정의하면, 쿠버네티스가 그 상태를 유지하도록 알아서 관리해줍니다. 저는 주로 Deployment(디플로이먼트)와 Service(서비스), Ingress(인그레스, 외부 트래픽 진입점) 같은 리소스들을 YAML 파일로 정의해서 사용하고 있어요.
이 둘을 함께 쓰면 어떤 시너지가 생길까요? 바로 선언적 인프라(Declarative Infrastructure) 관리가 가능해진다는 거예요. Ansible Playbook으로 쿠버네티스 리소스의 최종 상태를 정의하고, AWX가 이 Playbook을 실행해서 클러스터에 배포하는 방식이죠. 이렇게 하면 수동 작업으로 인한 오류를 줄이고, 배포 과정을 표준화하며, 지속적인 통합/배포(CI/CD) 워크플로우를 구축하는 데 정말 큰 도움이 돼요. 실제 운영 환경에서 이 조합은 정말 강력하더라고요.
실전 구현: AWX로 쿠버네티스 워크플로우 자동화하기
자, 그럼 이제 제가 직접 구축했던 방법을 단계별로 보여드릴게요. 목표는 AWX를 통해 간단한 Nginx 웹 서버를 쿠버네티스 클러스터에 배포하고, 외부에 노출시키는 거예요.
1단계: AWX 환경 설정
- 인벤토리(Inventory) 생성: AWX에서 Playbook을 실행할 대상(Host)을 정의합니다. 여기서는 쿠버네티스 클러스터의 API 서버에 접근해야 하므로, 로컬 호스트를 대상으로 하거나, 쿠버네티스 API 엔드포인트를 지정해요. 저는 주로
localhost를 대상으로 하고,kubeconfig파일을 통해 클러스터에 접근하는 방식을 선호합니다. - 자격 증명(Credential) 생성: 쿠버네티스 클러스터에 접근하기 위한 자격 증명이 필요해요.
kubeconfig파일을 AWX에 등록하는 방법이 가장 일반적입니다.
# AWX Credential 설정 예시 (Kubeconfig Type)
# --- Kubeconfig 내용 --- (실제 파일 내용)
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: ...
server: https://your-kubernetes-api-server:6443
name: my-cluster
contexts:
- context:
cluster: my-cluster
user: my-user
name: my-context
current-context: my-context
kind: Config
preferences: {}
users:
- name: my-user
user:
client-certificate-data: ...
client-key-data: ...
2단계: Ansible Playbook 작성
쿠버네티스 리소스를 배포하기 위한 Playbook을 작성해요. Ansible이 제공하는 kubernetes.core.k8s 모듈로 쿠버네티스 리소스 관리가 정말 쉬워진다니까요. 저는 Nginx Deployment와 Service를 배포하는 Playbook을 만들었어요.
# playbook.yaml
---
- name: Deploy Nginx to Kubernetes
hosts: localhost
connection: local
collections:
- kubernetes.core
vars:
namespace: default
app_name: my-nginx
image_version: 1.25.3
tasks:
- name: Ensure Namespace exists
kubernetes.core.k8s:
api_version: v1
kind: Namespace
name: "{{ namespace }}"
state: present
- name: Deploy Nginx Deployment
kubernetes.core.k8s:
state: present
definition: |
apiVersion: apps/v1
kind: Deployment
metadata:
name: "{{ app_name }}-deployment"
namespace: "{{ namespace }}"
labels:
app: "{{ app_name }}"
spec:
replicas: 2
selector:
matchLabels:
app: "{{ app_name }}"
template:
metadata:
labels:
app: "{{ app_name }}"
spec:
containers:
- name: "{{ app_name }}"
image: nginx:"{{ image_version }}"
ports:
- containerPort: 80
- name: Expose Nginx Service
kubernetes.core.k8s:
state: present
definition: |
apiVersion: v1
kind: Service
metadata:
name: "{{ app_name }}-service"
namespace: "{{ namespace }}"
labels:
app: "{{ app_name }}"
spec:
selector:
app: "{{ app_name }}"
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort # 또는 LoadBalancer, ClusterIP 등 환경에 맞게
이 Playbook을 Git 저장소(예: GitHub, GitLab)에 커밋해요. AWX가 이 저장소에서 Playbook을 가져와 실행할 거거든요.
3단계: AWX 프로젝트 및 작업 템플릿(Job Template) 설정
AWX UI에서 다음을 설정합니다.
- 프로젝트(Project) 생성: Git 저장소를 연결하여 Playbook을 가져와요.
- 작업 템플릿(Job Template) 생성: 이 템플릿에 위에서 만든 인벤토리, 자격 증명, 프로젝트, 그리고 실행할 Playbook 파일(
playbook.yaml)을 연결합니다.
AWX 작업 템플릿 설정 화면 스크린샷. Git 프로젝트, 인벤토리, 쿠버네티스 자격 증명, 실행할 Playbook 파일을 지정하는 모습을 보여줍니다.
⚠️ 삽질 경험 & 워크플로우 자동화 트러블슈팅
제가 이 AWX와 쿠버네티스 자동화 과정을 진행하면서 겪었던 몇 가지 삽질과 그 해결책을 공유할게요. 혹시 비슷한 문제를 겪는 분들이 있다면 도움이 될 거예요.
- 인증 오류 (Authentication Error): 가장 흔한 문제 중 하나예요.
kubeconfig파일의 권한 문제, 또는 파일 내용 자체가 잘못된 경우가 많았어요. 특히client-certificate-data와client-key-data가 정확한 base64 인코딩 값인지 여러 번 확인했거든요. AWX가 실행되는 컨테이너 환경에서kubeconfig파일에 접근 권한이 없어서 생기는 경우도 있었고요. 💡 팁: AWX 컨테이너 내부에서kubectl get pods를 직접 실행해보며 인증 문제를 디버깅해보세요. - YAML 문법 오류: 쿠버네티스 리소스 정의는 YAML 파일로 하는데, 들여쓰기나 오타 하나로도 워크플로우가 실행 안 돼요. 특히 Ansible Playbook 내
definition블록 안에 YAML을 넣을 때는 더욱 주의해야 합니다. ⚠️ 경고:definition: |다음 줄부터는 반드시 두 칸 이상 들여쓰기 해야 합니다! - Ansible
kubernetes.core.k8s모듈 문제: 처음에는 이 모듈을 쓰는 게 익숙하지 않아서 헤맸어요. 특히state: present로 리소스를 생성하고,state: absent로 삭제하는 방식에 익숙해지는 데 시간이 좀 걸렸거든요. 그리고kubeconfig파일 경로를 명시적으로 지정해야 하는 경우도 있었습니다 (kubeconfig: /path/to/kubeconfig). - 네트워크 연결 문제: AWX가 쿠버네티스 API 서버에 접근할 수 없는 네트워크 환경일 경우 당연히 실패하죠. 방화벽 규칙이나 네트워크 정책을 다시 확인해야 해요.
✅ 결과 검증 및 자동화의 힘!
모든 설정이 끝나면, AWX UI에서 작업 템플릿을 실행(Launch)해요. Playbook이 성공적으로 실행되면 AWX 작업 로그에서 초록색 SUCCESS 메시지를 확인할 수 있어요. 저도 이 메시지를 처음 봤을 때, "드디어 됐다!" 하고 쾌재를 불렀던 기억이 생생해요.
이제 쿠버네티스 클러스터에서 실제로 리소스가 배포되었는지 확인해볼 차례입니다.
kubectl get deployments -n default
# NAME READY UP-TO-DATE AVAILABLE AGE
# my-nginx-deployment 2/2 2 2 2m
kubectl get services -n default
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# my-nginx-service NodePort 10.96.123.456 <none> 80:3xxxx/TCP 2m
정상적으로 Nginx Deployment와 Service가 생성된 걸 확인할 수 있어요. 이제 NodePort로 할당된 포트를 통해 Nginx 웹 서버에 접속하면 "Welcome to Nginx!" 페이지를 볼 수 있을 거예요. 🎉 정말 편리하지 않나요? 몇 번의 클릭만으로 쿠버네티스에 애플리케이션을 배포하는 워크플로우 자동화가 완성된 거죠.
AWX 작업 성공 로그와 kubectl get pods/deployments 명령 결과 비교 화면. AWX의 Job Output에서 Task가 성공적으로 완료된 것을 보여주고, 터미널에서 kubectl 명령어로 배포된 리소스들을 확인하는 모습을 나란히 보여줍니다.
마무리하며: 자동화, 멈추지 않는 여정
이번 AWX와 쿠버네티스 연동 사례를 통해 워크플로우 자동화가 얼마나 강력한지 다시 한번 느꼈어요. 단순한 배포를 넘어, IaC(Infrastructure as Code, 코드형 인프라)의 개념을 실현하고, DevOps 파이프라인의 핵심 구성 요소로 활용할 수 있다는 것이 핵심이죠.
인프라 엔지니어로서 제가 얻은 가장 큰 교훈은 "반복되는 작업은 무조건 자동화하라"는 거예요. 처음엔 자동화 스크립트 작성에 시간이 들지언정, 장기적으로는 시간과 노력을 아끼고, 휴먼 에러를 줄여준다는 걸 뼈저리게 경험했거든요. 이 경험이 여러분의 인프라 관리에도 작은 영감이 되기를 바랍니다.
다음 글에서는 이 워크플로우를 확장해서 Ingress 컨트롤러를 배포하고, 외부 도메인으로 서비스에 접근하는 방법을 다뤄볼까 해요. 기대해주세요!
AWX, Ansible, Kubernetes, DevOps 로고들이 원형으로 배치된 인포그래픽. 각 로고들이 서로 연결되어 워크플로우 자동화를 이루는 모습을 시각적으로 보여줍니다.
'IT > k8s' 카테고리의 다른 글
| [k8s] K3s와 AWX 통합 사례 연구: 경량 Kubernetes 자동화 워크플로우 구축 (0) | 2026.05.24 |
|---|---|
| [k8s] Kubernetes Operator 활용 사례: 데이터베이스 관리 자동화로 운영 효율 높이기 (0) | 2026.05.23 |
| [k8s] Helm 차트 관리의 진화: GitOps 시대의 베스트 프랙티스 분석 (0) | 2026.05.23 |
| [k8s] 쿠버네티스 스토리지: CSI 드라이버를 활용한 영구 스토리지 관리 및 최적화 (0) | 2026.05.20 |
| [k8s] ArgoCD로 멀티 클러스터 GitOps 배포 자동화 완벽 가이드 (0) | 2026.05.20 |
| [k8s] 쿠버네티스 Ingress Controller 비교: Nginx, Traefik, HAProxy 장단점 분석 (0) | 2026.05.18 |