쿠버네티스 환경 구성시 발생하는 문제들과 해결방법 🚀
안녕하세요, 여러분! 오늘은 제가 물뮤(MoolMeow) 프로젝트를 위한 쿠버네티스 환경을 구성하면서 마주친 다양한 이슈들과 해결 방법에 대해 공유하려고 해요. 🐱 + 💧 = 물뮤!
프로젝트 소개 🌟
물뮤(MoolMeow)는 수영(Mool, 물)과 고양이(Meow, 야옹)를 주제로 하는 통합 온라인 커뮤니티 서비스입니다. 하나의 도메인(moolmeow.com) 아래 두 가지 컨셉의 커뮤니티를 운영하는 재미있는 프로젝트예요!
저는 이를 위해 온프레미스 환경에서 쿠버네티스 클러스터를 구축했는데, 그 과정에서 몇 가지 도전적인 상황들이 있었어요. 지금부터 이 여정을 함께 살펴볼까요? 💪
인프라 구성 환경 🖥️
- 하드웨어: Mac Mini Pro (M2, 16GB RAM, 512GB SSD)
- 가상화: Vagrant + VMware Fusion을 사용한 VM 구성
- 쿠버네티스: kubeadm으로 설치 (마스터 노드 1개, 워커 노드 1개)
- 자동화: Ansible을 사용한 설치 자동화
- 스토리지: Rook-Ceph을 사용한 분산 스토리지
발생한 이슈들과 해결 방법 🔧
1. 아키텍처 불일치 문제 (Architecture Mismatch) 😵
이슈: Helm 설치 과정에서 Exec format error
발생
/bin/sh: 1: helm: Exec format error
원인: 다운로드한 Helm 바이너리가 VM 아키텍처와 맞지 않았습니다.
해결방법: 타겟 시스템의 아키텍처를 확인하고 그에 맞는 바이너리를 다운로드하도록 수정했습니다.
# 적절한 아키텍처의 Helm 다운로드
- name: Download Helm for the appropriate architecture
get_url:
url: "https://get.helm.sh/helm-v3.12.3-linux-{{ 'arm64' if 'aarch64' in vm_arch.stdout else 'amd64' }}.tar.gz"
dest: /tmp/helm.tar.gz
2. 네트워크 플러그인 설치 실패 🌐
이슈: Calico 네트워크 플러그인 설치 URL이 유효하지 않음
error: error validating "calico.yaml": error validating data: invalid object to validate
해결방법: 로컬에 저장된 매니페스트 파일을 사용하도록 변경했습니다.
- name: Copy local Calico manifest to master node
copy:
src: ./calico.yml
dest: /home/vagrant/calico.yml
- name: Apply Calico network plugin
shell: |
kubectl apply -f /home/vagrant/calico.yml
3. 중복 설치 문제 (Idempotency Issues) 🔄
이슈: Helm 차트가 이미 설치되어 있을 때 발생하는 오류
Error: INSTALLATION FAILED: cannot re-use a name that is still in use
해결방법: 설치 전에 먼저 확인하고, 이미 설치된 경우 업그레이드하도록 로직 추가
- name: Check if Rook-Ceph is already installed
shell: helm list -n rook-ceph | grep rook-ceph
register: rook_ceph_check
failed_when: false
- name: Install Rook-Ceph Operator
shell: helm install --create-namespace --namespace rook-ceph rook-ceph rook-release/rook-ceph
when: rook_ceph_check.rc != 0 # 설치되지 않은 경우에만 실행
- name: Upgrade Rook-Ceph if already installed
shell: helm upgrade rook-ceph rook-release/rook-ceph --namespace rook-ceph
when: rook_ceph_check.rc == 0 # 이미 설치된 경우에만 실행
4. 파드 준비 대기 시간 초과 (Pod Readiness Timeout) ⏱️
이슈: MetalLB 파드가 준비되는 데 시간이 너무 오래 걸려 타임아웃 발생
timed out waiting for the condition on pods/controller-5f56cd6f78-fghps
해결방법: 더 긴 타임아웃과 주기적인 상태 확인 로직 추가
- name: Wait for MetalLB pods with extended timeout
shell: |
# 최대 10분 동안 1분 간격으로 확인
timeout=600
elapsed=0
interval=60
while [ $elapsed -lt $timeout ]; do
echo "Checking MetalLB pods status (elapsed time: ${elapsed}s / ${timeout}s)"
kubectl get pods -n metallb-system
if kubectl get pods -n metallb-system -o jsonpath='{.items[*].status.conditions[?(@.type=="Ready")].status}' | grep -v False; then
echo "All MetalLB pods are ready!"
break
fi
sleep $interval
elapsed=$((elapsed + interval))
done
배운 점 & 교훈 📚
아키텍처 차이를 항상 고려하세요: 특히 Apple Silicon 같은 ARM 기반 시스템에서 작업할 때 VM의 아키텍처를 확인하는 습관을 들이세요!
멱등성(Idempotency)이 중요합니다: Ansible 플레이북은 여러 번 실행해도 문제가 없어야 해요. 항상 상태를 확인하고 그에 맞게 행동하도록 설계하세요.
충분한 대기 시간을 제공하세요: 쿠버네티스 컴포넌트, 특히 로드밸런서나 스토리지 솔루션은 초기화에 생각보다 많은 시간이 필요할 수 있어요.
오류 처리를 세심하게 구현하세요: 플레이북이 중간에 멈추지 않도록 예상 가능한 모든 오류 상황에 대처 방법을 마련해두세요.
디버깅 정보를 충분히 수집하세요: 문제 해결에 필요한 정보(파드 상태, 로그 등)를 자동으로 수집하도록 플레이북을 구성하면 트러블슈팅이 훨씬 쉬워집니다.
결론 🎯
온프레미스 환경에서 쿠버네티스 클러스터를 구축하는 것은 결코 쉬운 일이 아니지만, 위와 같은 문제들을 하나씩 해결해나가면서 많은 것을 배울 수 있었어요. 특히 Ansible을 활용한 자동화는 반복적인 작업을 크게 줄여주고, 일관된 환경을 유지하는 데 큰 도움이 됩니다.
물뮤 프로젝트를 위한 이 인프라는 앞으로도 계속 개선해 나갈 예정이에요. 여러분도 비슷한 프로젝트를 진행하고 계시다면, 이 글이 조금이나마 도움이 되었으면 좋겠습니다! 💖
해피 쿠버네팅! Happy Kuberneting! 🎉
#쿠버네티스 #Ansible #DevOps #Vagrant #RookCeph #MetalLB #물뮤 #MoolMeow
Troubleshooting Kubernetes Environment Setup: Challenges and Solutions 🚀
Hello everyone! Today I’d like to share the various issues I encountered while setting up a Kubernetes environment for my MoolMeow project, along with the solutions I found. 🐱 + 💧 = MoolMeow!
Project Introduction 🌟
MoolMeow is an integrated online community service centered around swimming (Mool, 물) and cats (Meow, 야옹). It’s an exciting project that operates two concept-based communities under a single domain (moolmeow.com)!
I built a Kubernetes cluster in an on-premises environment for this project, and along the way, I faced several challenging situations. Let’s explore this journey together! 💪
Infrastructure Setup 🖥️
- Hardware: Mac Mini Pro (M2, 16GB RAM, 512GB SSD)
- Virtualization: VM configuration using Vagrant + VMware Fusion
- Kubernetes: Installed with kubeadm (1 master node, 1 worker node)
- Automation: Installation automated with Ansible
- Storage: Distributed storage using Rook-Ceph
Issues Encountered and Solutions 🔧
1. Architecture Mismatch Problem 😵
Issue: Exec format error
occurred during Helm installation
/bin/sh: 1: helm: Exec format error
Cause: Helm binary didn’t match the VM architecture.
Solution: Modified the script to check the target system’s architecture and download the appropriate binary.
# Download Helm for the appropriate architecture
- name: Download Helm for the appropriate architecture
get_url:
url: "https://get.helm.sh/helm-v3.12.3-linux-{{ 'arm64' if 'aarch64' in vm_arch.stdout else 'amd64' }}.tar.gz"
dest: /tmp/helm.tar.gz
2. Network Plugin Installation Failure 🌐
Issue: Invalid URL for Calico network plugin installation
error: error validating "calico.yaml": error validating data: invalid object to validate
Solution: Modified the approach to use a locally stored manifest file.
- name: Copy local Calico manifest to master node
copy:
src: ./calico.yml
dest: /home/vagrant/calico.yml
- name: Apply Calico network plugin
shell: |
kubectl apply -f /home/vagrant/calico.yml
3. Idempotency Issues 🔄
Issue: Error when Helm chart was already installed
Error: INSTALLATION FAILED: cannot re-use a name that is still in use
Solution: Added logic to check first and then either install or upgrade based on the current state.
- name: Check if Rook-Ceph is already installed
shell: helm list -n rook-ceph | grep rook-ceph
register: rook_ceph_check
failed_when: false
- name: Install Rook-Ceph Operator
shell: helm install --create-namespace --namespace rook-ceph rook-ceph rook-release/rook-ceph
when: rook_ceph_check.rc != 0 # Only run if not already installed
- name: Upgrade Rook-Ceph if already installed
shell: helm upgrade rook-ceph rook-release/rook-ceph --namespace rook-ceph
when: rook_ceph_check.rc == 0 # Only run if already installed
4. Pod Readiness Timeout ⏱️
Issue: MetalLB pods took too long to become ready, causing timeouts
timed out waiting for the condition on pods/controller-5f56cd6f78-fghps
Solution: Added longer timeout and periodic status check logic.
- name: Wait for MetalLB pods with extended timeout shell: | # Check every minute for up to 10 minutes timeout=600 elapsed=0 interval=60 while [ $elapsed -lt $timeout ]; do echo "Checking MetalLB pods status (elapsed time: ${elapsed}s / ${timeout}s)" kubectl get pods -n metallb-system if kubectl get pods -n metallb-system -o jsonpath='{.items[*].status.conditions[?(@.type=="Ready")].status}' | grep -v False; then echo "All MetalLB pods are ready!" break fi sleep $interval elapsed=$((elapsed + interval)) done
Lessons Learned 📚
Always Consider Architecture Differences: Especially when working on ARM-based systems like Apple Silicon, make it a habit to verify your VM’s architecture!
Idempotency is Critical: Ansible playbooks should run multiple times without issues. Always design them to check the current state and act accordingly.
Provide Sufficient Wait Times: Kubernetes components, especially load balancers or storage solutions, may need more initialization time than expected.
Implement Error Handling Carefully: Prepare handling methods for all foreseeable error situations so your playbook doesn’t stop in the middle of execution.
Collect Ample Debugging Information: Configure your playbook to automatically collect information needed for troubleshooting (pod status, logs, etc.), which makes resolving issues much easier.
Conclusion 🎯
Building a Kubernetes cluster in an on-premises environment is certainly not an easy task, but I learned a lot by solving these problems one by one. In particular, automation with Ansible significantly reduces repetitive work and helps maintain a consistent environment.
I plan to continue improving this infrastructure for the MoolMeow project. If you’re working on a similar project, I hope this post helps you in some way! 💖
Happy Kuberneting! 🎉
#Kubernetes #Ansible #DevOps #Vagrant #RookCeph #MetalLB #MoolMeow