Air-Gapped 쿠버네티스 클러스터 구축 with kubeasz

오프라인 패키지 준비

인터넷 연결 가능한 환경에서 설치에 필요한 모든 구성요소를 미리 다운로드합니다. 아래 예시는 kubeasz 3.6.0 기준입니다.

# 릴리즈 버전 지정
export release=3.6.0

# ezdown 스크립트 다운로드
wget https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown
chmod +x ./ezdown

# 기본 구성요소 다운로드 (코드, 바이너리, 컨테이너 이미지)
./ezdown -D

# 추가 컴포넌트 이미지 확보 (필요시)
./ezdown -X cilium
./ezdown -X flannel
./ezdown -X prometheus

# OS 패키지 미러 구축 (yum/apt 미사용 환경용)
./ezdown -P centos_7

다운로드 완료 후 /etc/kubeasz 디렉터리에 다음과 같이 구성됩니다:

경로내용
/etc/kubeaszkubeasz 릴리즈 코드
/etc/kubeasz/bink8s, etcd, containerd, CNI 바이너리
/etc/kubeasz/down오프라인 컨테이너 이미지
/etc/kubeasz/down/packagesOS 기본 패키지

타겟 서버 환경 구성

오프라인 설치 대상 서버에서 사전 준비 작업을 수행합니다.

# 방화벽 비활성화
systemctl stop firewalld && systemctl disable firewalld

# SELinux 해제
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

# 스왑 영역 해제
sed -ri 's/.*swap.*/#&/' /etc/fstab
swapoff -a

오프라인 모드 설정

설치 소스를 오프라인으로 전환합니다.

sed -i 's/^INSTALL_SOURCE.*$/INSTALL_SOURCE: "offline"/g' /etc/kubeasz/example/config.yml

kubeasz 컨테이너 기동

cd /etc/kubeasz

# 패키지 무결성 재확인
./ezdown -D

# kubeasz 컨테이너 실행
./ezdown -S

컨테이너 실행 실패 시 Docker 수동 설치 후 재시도하거나, 명령어를 반복 실행해보세요.

클러스터 정의 및 설정

컨테이너 내부로 진입하여 새 클러스터를 생성합니다.

docker exec -it kubeasz /bin/bash
ezctl setup my-cluster

생성된 설정 파일을 노드 구성에 맞게 수정합니다.

hosts 파일 수정

/etc/kubeasz/clusters/my-cluster/hosts 파일에서 다음 항목을 IP 주소 기반으로 설정합니다.

[etcd]
10.0.1.10
10.0.1.11
10.0.1.12

[kube_master]
10.0.1.10

[kube_node]
10.0.1.11
10.0.1.12

# 런타임 및 네트워크 플러그인 지정
CONTAINER_RUNTIME="containerd"
CLUSTER_NETWORK="calico"

hostname 대신 반드시 IP 주소를 사용해야 합니다.

스토리지 경로 커스터마이징

config.yml에서 데이터 저장 경로를 환경에 맞게 조정합니다.

ETCD_DATA_DIR: /data/etcd
CONTAINERD_STORAGE_DIR: /data/containerd
KUBELET_ROOT_DIR: /data/kubelet

SSH 무인 접속 설정

ssh-copy-id 10.0.1.10
ssh-copy-id 10.0.1.11
ssh-copy-id 10.0.1.12

클러스터 배포

docker exec -it kubeasz ezctl setup my-cluster all

Python 인터프리터 이슈

다음과 같은 오류 발생 시 hosts 파일의 파이썬 경로를 수정합니다.

# 오류 메시지 예시
"/usr/bin/python3: No such file or directory"

# 해결: hosts 파일 내 다음 항목 변경
ansible_python_interpreter=/usr/bin/python

Calico 관련 커널 요구사항

Calico 3.23 이상은 Linux 커널 5.1+가 필요합니다. CentOS 7 등 구버전 커널 환경에서는 업그레이드가 필요합니다.

# 현재 커널 확인
uname -r

# ELRepo 커널 패키지 다운로드 및 설치
yum install -y perl wget

cd /tmp
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-5.4.278-1.el7.elrepo.x86_64.rpm
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.278-1.el7.elrepo.x86_64.rpm
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-tools-5.4.278-1.el7.elrepo.x86_64.rpm
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-tools-libs-5.4.278-1.el7.elrepo.x86_64.rpm

# 기존 tools 패키지 충돌 방지
yum remove kernel-tools kernel-tools-libs -y

# 새 커널 설치
rpm -ivh kernel-lt-tools-libs-*.rpm
rpm -ivh kernel-lt-tools-*.rpm
rpm -ivh kernel-lt-5.4*.rpm
rpm -ivh kernel-lt-devel-*.rpm

# 부팅 우선순위 설정
grub2-set-default 0
reboot

재부팅 후 커널 버전을 확인합니다.

uname -r
# 5.4.278-1.el7.elrepo.x86_64

설치 결과 검증

# 노드 상태 확인
kubectl get nodes

# Control Plane 컴포넌트 상태
kubectl get cs

# 전체 파드 상태
kubectl get pods -A

# 서비스 목록
kubectl get svc -A

대시보드 접근

관리자 토큰을 확인하여 Kubernetes Dashboard에 로그인합니다.

# Secret 목록 조회
kubectl get secret -n kube-system | grep admin

# 토큰 값 추출
kubectl describe secret -n kube-system admin-user

출력된 token 필드 값을 복사하여 Dashboard 로그인 화면에 입력합니다.

클러스터 제거

docker exec -it kubeasz ezctl destroy my-cluster

태그: kubeasz kubernetes air-gapped-install containerd calico

5월 28일 18:13에 게시됨