최근에 회사에서 과제를 받아 Virtualbox에서 쿠버네티스를 설치하는 작업을 계속하고 있었습니다. (지금은 해당 환경을 이용해서 테스트를 해봐야하는 상황이라 또..또.. 설치 중)
완벽하진 않지만,,, 오랜 시간을 쓴 만큼 기억나는대로 적어보겠습니다!
현재 작동해야 하는 조건!
1. OS : Rocky Linux Image
- 회사에서는 Redhat Openshift 를 사용하고 있기 때문에 CentOS를 fork 한 Rocky Linux가 제일 비슷한 이미지의 iso 였습니다
(CentOS를 못쓰는 이유는 여차저차해서 CentOS가 공짜가 안되었기 때문..)
여차저차 : https://m.blog.naver.com/yaki80/222308490674
[무료 리눅스, CentOS 지원종료! 그래서 우리는 어떻게 해야 하는데?
무료 리눅스OS인 CentOS가 2021년 말부터 지원이 중단됩니다. 무료로 사용할 수 있는 서버OS이기 때...
blog.naver.com](https://m.blog.naver.com/yaki80/222308490674)
2. CPU : x86 서버
회사 서버는 (당연히) x86으로 돌아가고 있었기 때문에 제 환경과는 맞지 않았습니다. (저는 M1 Max..)
여기서부터 굉장히 꼬였습니다.. 요구한 환경은 x86 이었기 때문에 사실상 M1 MAX는 사용할 수가 없었습니다. 현재 Virtualbox는 ARM64 환경에서 실행할 수가 없었습니다.
1) UTM (Emulate)
첫번째로 시도한 건 UTM emulate였습니다. UTM은 사이트에 들어가기만 해도 'Virtual machines for MAC' 이라고 적혀있고 VMWare fusion 등 다른 환경도 사용해봤지만 제일 쉬운건 UTM 이었습니다.
그런데 Emulate가 느리다고 경고해서 각오를 좀 하긴했으나.. 너무너무 느렸기 때문에 Master하나이 Worker 3개나 설치해야하는데 할건 많은데 화면만 바라보고 있기에 너무 버거웠기에... 포기했습니다 ㅜ
2) 윈도우 Desktop 사용하기
결국 Window Desktop을 Wake On LAN으로 켜서 맥으로 원격으로 사용하기로 했습니다... (MAC에서 x86환경을 사용해서 하는 방법을 찾으신 분은 제송합니다,,)
조건은 다음과 같았습니다.
구축 환경
- 시스템 구성
- 구성 노드 : 마스터 3대, 워커 3대
- 기본 인터페이스는 VirtualBox의 ‘NAT Network’
- 관리 인터페이스는 ‘Host-Only Network’
- OS : Rocky Linux 8.10
- 커널 모듈 로딩 및 커널 파라미터 설정
- 마스터 3대의 HA 구성
- keepalived 사용
- 아래는 첫 번째 마스터 서버의 ip 주소 및 keepalived 설정 예시
- IP의 끝자리 21은 서버의 주소이고, 20은 keepalived에 의해 관리되는 VIP
- 쿠버네티스 구성 정보
- 사용 버전 : Kubernetes 1.29
- 컨테이너 런타임 : crio-o 1.29
- 저수준 컨테이너 런타임 : crun
- crun 사용을 위해서는 cgroup v2 활성화 필요
- 이미지 레지스트리 검색 순서 설정 : [docker.io](http://docker.io) → [quay.io](http://quay.io)
- cgroup driver : systemd
- 네트워크 구성
- Service CIDR : 10.111.0.0/16
- Pod CIDR : 10.222.0.0/16
- CNI : flannel 사용
- flannel 배포 yaml의 Network 설정에 상기 Pod CIDR을 설정해야 함
- 실제 클러스터 구성
- kmaster1에서 ‘kubeadm init’ 명령으로 k8s 클러스터 신규 생성
- control-plane-endpoint 옵션을 반드시 사용 요망
- kmaster2와 kmaster3을 마스터 노드로 조인
- kworker1~3을 워커 노드로 조인
- Flannel CNI 적용
- 워커 3대 join
VirtualBox에서 네트워크 설정을 위해서 NatNetwork를 새로 만들고 모든 VM에 네트워크 어댑터를 2개씩 붙여주었습니다.
등등.. 여러 시행착오를 겪었고 아래 과정대로 하면 됩니다.
Master를 init하면 해야하는 작업들이 나오고 그 작업대로만 각 VM에서 하면 됩니다. init하기 전은 모든 VM이 같습니다.
(Virtualbox에서 실행하면 복제 기능이 있기 때문에 편합니다. 주의할 점은 모든 어댑터를 새로 생성해야 된다는 걸 선택하기!!!)
Master의 나머지 join, Worker join, 그리고 Master에서 권한 때문에 mkdir, chown 해야되는 것들이 init 실행하면 생기는데 말하는대로 따라하면 됩니다.
중간에 안되면 네트워크는 잘 돌아가는지, crio는 잘 실행되고 있는지 계속해서 체크!
1) Swap Off (Master/Worker)
swapoff -a
2) fstab 수정
# swap 부분 주석
vim /etc/fstab
3) Selinux Disable (Master/Worker)
vim /etc/selinux/config
...
SELINUX=disabled
...
4) Hosts 등록 (Master/Worker)
vim /etc/hosts
5) Firewalld 비활성화 (Master/Worker)
systemctl stop firewalld; systemctl disable firewalld
6) Package Repository 추가 (Master/Worker)
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
EOF
cat <<EOF | tee /etc/yum.repos.d/cri-o.repo
[cri-o]
name=CRI-O
baseurl=https://pkgs.k8s.io/addons:/cri-o:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/addons:/cri-o:/stable:/v1.29/rpm/repodata/repomd.xml.key
EOF
7) 의존성 패키지 설치 (Master/Worker)
dnf install -y conntrack container-selinux ebtables ethtool iptables socat vim bind-utils net-tools tcpdump wget git tar
8) kubernetes, runtime 설치 (Master/Worker)
dnf install -y --repo cri-o --repo kubernetes cri-o kubeadm kubectl kubelet
9) systemd 시작 설정 (Master/Worker)
systemctl start crio
systemctl enable crio
systemctl enable kubelet
10) 커널 파라미터 및 모듈 설정 (Master/Worker)
vim /etc/modules-load.d/crio.conf
overlay
br_netfilter
modprobe br_netfilter
cat <<EOF | sudo tee /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
kubeadm init \
--control-plane-endpoint=10.0.1.20:6443 \
--apiserver-advertise-address=10.0.1.21 \
--upload-certs \
--pod-network-cidr=10.222.0.0/16 \
--service-cidr=10.111.0.0/16
근데 이렇게 잘 설치해도 Network 어댑터가 자주 떨어졌습니다. 항상 Systemctl restart NetworkManager를 해줘서 알려줘야하고... 이런것들이 이상하게 잘 안돌아가서 하나의 호스트 전용 네트워크 어댑터만 사용하고 UTM을 사용하려고 3번 방법으로 다시 설치했습니다!
3) UTM (Virtualize)
꼭 x86 환경을 쓰지 않아도 되고, 테스트 정도만 해보면 된다! + 맥 환경이다 라면 UTM의 Virtualize를 통해서 ARM 버전의 CPU로 사용하는 것이 최고인 것 같습니다. 검사 용으로는 데스크톱을 2번처럼 설치해서 사용했지만 현재는 그냥 여기서 테스트 서버로 다 돌리고 있습니다. 설치하는 방법은 2번과 굉장히 유사하지만 Keepalived나 설정이 필요없기 때문에 아래 링크를 통해서 설치해서 해결하였습니다.
https://cafe.naver.com/f-e/cafes/30725715/articles/91?menuid=15&referrerAllArticles=false
[쿠버네티스 빠른설치 (Mac-m시리즈)
1. [설치] 쿠버네티스 쉽고 빠르게 설치하는 방법 - Mac 버전용 (m시리즈) ▶ 설치 권고 환경 : Mac Arm64(m1,m2), Cpu 8core 이상, Memory...
cafe.naver.com](https://cafe.naver.com/f-e/cafes/30725715/articles/91?menuid=15&referrerAllArticles=false)
참고 1) Rocky Linux 8.10 버전을 사용하려고 했는데 왜인지 모르지만 UTM에서 돌아가지 않았습니다... 버전 업을 해서 9 버전의 Rocky Linux를 사용하니까 쉽게 해결되었습니다..
참고 2) Rocky Linux 설치할 때 다 끝났는데 그대로 두면 또 설치하는 화면으로 넘어가는데, VM 을 종료한 뒤에 boot Image를 공백으로 바꾼 뒤에 다시 실행하면 됩니다.
현재는 3번 환경에서 모두 실행하고 있으며 쿠버네티스 실습을 위해서는 제격인것 같습니다!
엄청많은 시행착오를 겪었는데 쓰다보니 설명이 어렵거나 좀 어이없는 실수들이라.. 여기까지만 기록해두고 생각날때마다 추가해놓도록 하겠습니다. (물론 저는 어이없는 실수 또, 또 하기 때문에)
'클라우드 네이티브' 카테고리의 다른 글
Jenkins, Kubernetes, Helm, ArgoCD 를 이용한 GitOps 적용 (0) | 2024.07.05 |
---|---|
[Kubernetes] kubectl 자동완성 에러 _get_comp_words_by_ref: command not found (0) | 2024.03.13 |