권장 스펙
로컬에 Virtual Machine으로 Worker Node를 만드는 것이기 때문에 스펙이 높을수록 좋다.
Mac M시리즈, Cpu 8core 이상, Memory 16GB 이상, 인터넷 사용 가능 환경
설치 방법
Rocky Linux ISO 다운로드 (9.2 arm64 버전)
Rocky Linux ISO는 Rocky Linux 운영 체제의 설치 디스크 이미지 파일이다. Rocky Linux는 CentOS의 대안으로, Red Hat Enterprise Linux (RHEL)과 호환되는 무료 오픈 소스 Linux 배포판이다.
쿠버네티스는 주로 리눅스 기반 환경에서 운영되기 때문에, Rocky Linux를 사용하면 실제 클러스터 환경과 유사한 리눅스 환경을 구축할 수 있다. 이를 위해 Rocky Linux를 설치해보자.
Site : https://rockylinux.org
UTM 다운로드 및 설치 (4.4.4 버전)
UTM은 Mac 컴퓨터에서 다양한 운영 체제를 가상화하여 실행할 수 있는 가상화 소프트웨어이다. UTM은 오픈 소스 프로젝트로, QEMU와 Apple의 Hypervisor.framework을 사용하여 가상화를 구현한다. M1 Mac과 같은 ARM 기반 Mac에서도 효율적으로 동작하며, 다양한 운영 체제를 지원한다.
UTM을 사용하면 Rocky Linux를 가상화하여 M1 Mac에서도 리눅스 환경을 구축할 수 있다.
Site : https://mac.getutm.app
UTM로 Master VM 설정
Virtualize으로 설치시 M1이 arm 기반이기 때문에, OS와 쿠버네티스도 arm 기반으로 설치를 해야 한다. 그래도 이렇게 설치해야 속도가 빠르고, Emulate 방식으로 설치할 경우 amd기반으로도 설치가 가능하다. (단, 속도가 느리다고 한다)
VM위에 마우스 우클릭 후 [Edit] > Network > Show Advanced Settings에서 게스트 IP를 바꿔주자.
Rocky Linux의 초기 세팅
이제 생성된 VM을 실행한 후 Rocky Linux의 초기 세팅을 해주자.
1. 언어 : 한국어(대한민국)
2. 사용자 설정
- root 비밀번호(R) : 개인별 root 비밀번호 입력
- root 계정을 잠금 - 체크해제
- root가 비밀번호로 SSH 로그인하도록 허용 - 체크
3. 설치 목적지 (D)
- 저장소 구성 : 자동 설정(A) [체크] 확인 후 완료(D) 클릭
4. 네트워크 및 호스트 이름
- 호스트 이름(H) : k8s-master 입력 후 [적용(A)] 클릭
- 이더넷(enp0s1) : [설정(C)..] 클릭
1) [IPv4 설정] 탭 클릭
2) Method : 수동
3) 주소 : [Add] 클릭 후 -> 주소(192.168.56.30), 넷마스크(255.255.255.0), 게이트웨이(192.168.56.1)
- [완료(D)] 클릭
5. [설치 시작(B)] 클릭
6. 설치 완료 메세지 확인 후 [재시작]
각 단계는 VM이 네트워크에 올바르게 연결되고, 특정 호스트 이름을 가지도록 설정하는 것을 목적으로 한다. 아래는 각 항목에 대한 상세 설명이다.
- 호스트 이름(H) 설정
- 호스트 이름: k8s-master를 입력하고 [적용(A)] 버튼을 클릭한다.
- 호스트 이름은 컴퓨터나 서버의 네트워크 상에서 식별될 수 있는 이름이다.
- k8s-master는 이 VM이 Kubernetes 클러스터의 마스터 노드임을 나타낸다.
- 호스트 이름: k8s-master를 입력하고 [적용(A)] 버튼을 클릭한다.
- 이더넷(enp0s1) 설정
- 이더넷(enp0s1) 인터페이스를 선택하고 [설정(C)...] 버튼을 클릭한다.
- 이더넷 인터페이스는 네트워크 연결을 담당하는 하드웨어 또는 가상 네트워크 인터페이스이다.
- 이더넷(enp0s1) 인터페이스를 선택하고 [설정(C)...] 버튼을 클릭한다.
- IPv4 설정
- [IPv4 설정] 탭을 클릭한다.
- IPv4 설정은 네트워크 인터페이스에 대한 IP 주소, 넷마스크, 게이트웨이를 설정하는 곳이다.
- [IPv4 설정] 탭을 클릭한다.
- Method: 수동
- Method를 수동으로 선택한다.
- 수동 설정은 DHCP(동적 호스트 구성 프로토콜)를 사용하지 않고, IP 주소, 넷마스크, 게이트웨이를 수동으로 입력하는 것을 의미한다.
- Method를 수동으로 선택한다.
- 주소 추가
- [Add] 버튼을 클릭하여 네트워크 설정을 추가한다.
- 주소: 192.168.56.30
- 이 주소는 VM이 네트워크에서 사용할 IP 주소이다.
- 넷마스크: 255.255.255.0
- 넷마스크는 네트워크의 서브넷을 정의하는 데 사용된다. 이 경우, 24비트 서브넷을 나타낸다.
- 게이트웨이: 192.168.56.1
- 게이트웨이는 네트워크 패킷을 다른 네트워크로 라우팅할 때 사용하는 경로이다. 여기서는 로컬 네트워크의 기본 게이트웨이를 설정한다.
- 주소: 192.168.56.30
- [Add] 버튼을 클릭하여 네트워크 설정을 추가한다.
Rocky Linux 실행
원격 접속(mac 터미널 사용)
ssh root@192.168.56.30
master에 클러스터 기본 구성 설치 (arm64 버전)
echo '======== [4] Rocky Linux 기본 설정 ========'
echo '======== [4-1] 패키지 업데이트 ========'
yum -y update
echo '======== [4-2] 타임존 설정 ========'
timedatectl set-timezone Asia/Seoul
echo '======== [4-3] [WARNING FileExisting-tc]: tc not found in system path 로그 관련 업데이트 ========'
yum install -y yum-utils iproute-tc
echo '======= [4-4] hosts 설정 =========='
cat << EOF >> /etc/hosts
192.168.56.30 k8s-master
192.168.56.31 k8s-node1
192.168.56.32 k8s-node2
EOF
echo '======== [5] kubeadm 설치 전 사전작업 ========'
echo '======== [5] 방화벽 해제 ========'
systemctl stop firewalld && systemctl disable firewalld
echo '======== [5] Swap 비활성화 ========'
swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab
echo '======== [6] 컨테이너 런타임 설치 ========'
echo '======== [6-1] 컨테이너 런타임 설치 전 사전작업 ========'
echo '======== [6-1] iptable 세팅 ========'
cat <<EOF |tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
cat <<EOF |tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
echo '======== [6-2] 컨테이너 런타임 (containerd 설치) ========'
echo '======== [6-2-1] containerd 패키지 설치 (option2) ========'
echo '======== [6-2-1-1] docker engine 설치 ========'
echo '======== [6-2-1-1] repo 설정 ========'
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
echo '======== [6-2-1-1] containerd 설치 ========'
yum install -y containerd.io-1.6.21-3.1.el9.aarch64
systemctl daemon-reload
systemctl enable --now containerd
echo '======== [6-3] 컨테이너 런타임 : cri 활성화 ========'
containerd config default > /etc/containerd/config.toml
sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd
echo '======== [7] kubeadm 설치 ========'
echo '======== [7] repo 설정 ========'
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
echo '======== [7] SELinux 설정 ========'
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
echo '======== [7] kubelet, kubeadm, kubectl 패키지 설치 ========'
yum install -y kubelet-1.27.2-150500.1.1.aarch64 kubeadm-1.27.2-150500.1.1.aarch64 kubectl-1.27.2-150500.1.1.aarch64 --disableexcludes=kubernetes
systemctl enable --now kubelet
echo '======== [8] kubeadm으로 클러스터 생성 ========'
echo '======== [8-1] 클러스터 초기화 (Pod Network 세팅) ========'
kubeadm init --pod-network-cidr=20.96.0.0/16 --apiserver-advertise-address 192.168.56.30
kubeadm token create --print-join-command > ~/join.sh
echo '======== [8-2] kubectl 사용 설정 ========'
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
echo '======== [8-3] Pod Network 설치 (calico) ========'
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/calico-3.26.4/calico.yaml
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/calico-3.26.4/calico-custom.yaml
echo '======== [9] 쿠버네티스 편의기능 설치 ========'
echo '======== [9-1] kubectl 자동완성 기능 ========'
yum -y install bash-completion
echo "source <(kubectl completion bash)" >> ~/.bashrc
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -o default -F __start_kubectl k' >>~/.bashrc
source ~/.bashrc
echo '======== [9-2] Dashboard 설치 ========'
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/dashboard-2.7.0/dashboard.yaml
echo '======== [9-3] Metrics Server 설치 ========'
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/metrics-server-0.6.3/metrics-server.yaml
echo '======== [10-1] Pod 상태 확인 ========'
kubectl get pod -A
Node1 VM 세팅
상기와 같은 과정으로 VM 생성 후 노드를 생성해준다.
- VM 생성 시작
- Start: Virtualize 선택
- 운영 체제 설정
- Operating System: Linux 선택
- Linux: Boot ISO Image 선택 후, Browse..를 클릭하여 Rocky Linux ISO 파일을 선택
- 하드웨어 설정
- Memory: 2048 MB
- CPU Cores: 2
- 디스크 크기 설정
- Size: 24 GB
- 공유 디렉토리 설정
- Shared Directory: 설정 안 함
- 요약 및 이름 설정
- Summary:
- Name: k8s-node1
- Summary:
Rocky Linux의 초기 세팅
- 언어 설정
- 언어: 한국어(대한민국) 선택
- 사용자 설정
- Root 비밀번호(R): 개인별 root 비밀번호 입력
- Root 계정을 잠금: 체크 해제
- Root가 비밀번호로 SSH 로그인하도록 허용: 체크
- 설치 목적지
- 저장소 구성: 자동 설정(A) 선택
- 확인 후 완료(D) 클릭
- 네트워크 및 호스트 이름
- 호스트 이름(H): k8s-node1 입력 후 [적용(A)] 클릭
- 이더넷(enp0s1): [설정(C)...] 클릭
- [IPv4 설정] 탭 클릭
- Method: 수동 선택
- 주소 추가:
- [Add] 클릭 후
- 주소: 192.168.56.31
- 넷마스크: 255.255.255.0
- 게이트웨이: 192.168.56.1
- 설정 완료 후 완료(D) 클릭
- 설치 시작
- [설치 시작(B)] 클릭
- 설치 완료 및 재시작
- 설치 완료 메시지 확인 후 [재시작] 클릭
원격 접속(mac 터미널 사용)
$ ssh root@192.168.56.31
Node1에 기본 구성 설치 (arm64 버전)
echo '======== [4] Rocky Linux 기본 설정 ========'
echo '======== [4-1] 패키지 업데이트 ========'
yum -y update
echo '======== [4-2] 타임존 설정 ========'
timedatectl set-timezone Asia/Seoul
echo '======== [4-3] [WARNING FileExisting-tc]: tc not found in system path 로그 관련 업데이트 ========'
yum install -y yum-utils iproute-tc
echo '======= [4-4] hosts 설정 =========='
cat << EOF >> /etc/hosts
192.168.56.30 k8s-master
192.168.56.31 k8s-node1
192.168.56.32 k8s-node2
EOF
echo '======== [5] kubeadm 설치 전 사전작업 ========'
echo '======== [5] 방화벽 해제 ========'
systemctl stop firewalld && systemctl disable firewalld
echo '======== [5] Swap 비활성화 ========'
swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab
echo '======== [6] 컨테이너 런타임 설치 ========'
echo '======== [6-1] 컨테이너 런타임 설치 전 사전작업 ========'
echo '======== [6-1] iptable 세팅 ========'
cat <<EOF |tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
cat <<EOF |tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
echo '======== [6-2] 컨테이너 런타임 (containerd 설치) ========'
echo '======== [6-2-1] containerd 패키지 설치 (option2) ========'
echo '======== [6-2-1-1] docker engine 설치 ========'
echo '======== [6-2-1-1] repo 설정 ========'
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
echo '======== [6-2-1-1] containerd 설치 ========'
yum install -y containerd.io-1.6.21-3.1.el9.aarch64
systemctl daemon-reload
systemctl enable --now containerd
echo '======== [6-3] 컨테이너 런타임 : cri 활성화 ========'
containerd config default > /etc/containerd/config.toml
sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd
echo '======== [7] kubeadm 설치 ========'
echo '======== [7] repo 설정 ========'
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
echo '======== [7] SELinux 설정 ========'
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
echo '======== [7] kubelet, kubeadm, kubectl 패키지 설치 ========'
yum install -y kubelet-1.27.2-150500.1.1.aarch64 kubeadm-1.27.2-150500.1.1.aarch64 --disableexcludes=kubernetes
systemctl enable --now kubelet
Node2 VM 세팅(상기와 동일하게 진행)
Worker Node 연결 및 Master 상태 확인
[root@k8s-master ~]# cat ~/join.sh
join 192.168.56.30:6443 --token bver73.wda72kx4afiuhspo --discovery-token-ca-cert-hash sha256:7205b3fd6030e47b74aa11451221ff3c77daa0305aad0bc4a2d3196e69eb42b7
Node1에서 Master에 조인
Node2에서 Master에 조인
Master에서 노드 목록 확인
kubectl get nodes
대시보드 접근
트러블 슈팅
UTM으로 Virtual Machine을 실행하는 과정에서 하기와 같은 에러가 날 수 있다.
macOS에서는 ISO 파일을 더블 클릭하면 자동으로 마운트되어 데스크탑에 디스크 이미지처럼 나타난다. 이 상태에서는 다른 프로그램이 그 파일을 액세스할 때 잠금 문제를 일으킬 수 있다. 이를 해결하기 finder에서 추출해주면 된다
참고
'기술 탐구 > k8s' 카테고리의 다른 글
(k8s) Volume이란 무엇일까? (emptyDir, hostPath, PVC/PV) (0) | 2024.08.13 |
---|---|
(k8s) Service의 정의와 3가지 타입(ClusterIP, NodePort, LoadBalaner) (0) | 2024.08.04 |
(CKA) MOCK 1 풀이와 관련 공식 문서 (0) | 2024.07.18 |
(k8s) Pod에 대한 정의와 각종 속성 (2) | 2024.06.14 |
(k8s) 쿠버네티스 명령어 (2) | 2024.06.13 |