본문 바로가기

Cloud/k8s

[k8s] Mac M1 UTM Ubuntu22.04 쿠버네티스 구축

  • Mac M1 UTM을 사용해 k8s를 구축한다.
  • 각 VM은 Ubuntu22.04LTS 이미지를 기반으로 한다.
  • 마스터노드*1, 워커노드*2로 클러스터를 구성한다.
  • 각 노드에 쿠버네티스를 설치하고 워커노드를 마스터노드에 연결한다.

 

k8s 설치 전 노드 환경 구성

#마스터노드
<k8s-master>
- Memory: 4096MB
- CPU Cores: 4
- Disk Size: 24GB
- Address: 192.168.56.30

#워커노드
<k8s-worker1>
- Memory: 2048MB
- CPU Cores: 2
- Disk Size: 24GB
- Address: 192.168.56.31

<k8s-worker2>
- Memory: 2048MB
- CPU Cores: 2
- Disk Size: 24GB
- Address: 192.168.56.32

 

네트워크 설정값

설치 시 기본으로 설정되어있는 dhcp에서 ipv4 static으로 변경

#k8s-master
Subnet 192.168.56.0/24
Address 192.168.56.30
Gateway 192.168.56.1
Name Server 8.8.8.8

#k8s-worker1
Subnet 192.168.56.0/24
Address 192.168.56.31
Gateway 192.168.56.1
Name Server 8.8.8.8

#k8s-worker2
Subnet 192.168.56.0/24
Address 192.168.56.32
Gateway 192.168.56.1
Name Server 8.8.8.8

 


k8s 설치 명령어

공통 설정 (k8s-master, k8s-worker1, k8s-worker2)

1. 커널 기본 설정

1.1 호스트명 설정

# 각 노드에 맞게 설정
sudo hostnamectl set-hostname k8s-master
sudo hostnamectl set-hostname k8s-worker1
sudo hostnamectl set-hostname k8s-worker2

 

1.2 각 노드에 고정 IP 할당

1.3 /etc/hosts에 각 노드의 IP 및 호스트명 추가

echo "192.168.56.30 k8s-master" | sudo tee -a /etc/hosts
echo "192.168.56.31 k8s-worker1" | sudo tee -a /etc/hosts
echo "192.168.56.32 k8s-worker2" | sudo tee -a /etc/hosts

 

1.4 타임존 설정

sudo timedatectl set-timezone Asia/Seoul

 

2. kubeadm 설치를 위한 사전 작업

2.1 방화벽 비활성화

sudo systemctl stop ufw && sudo systemctl disable ufw

 

2.2 swap 비활성화 (쿠버네티스 요구사항)

# 현재 세션에서 swap 비활성화
sudo swapoff -a

# 영구적으로 swap 비활성화 (fstab 파일에서 swap 항목 주석 처리)
sudo sed -i '/ swap / s/^/#/' /etc/fstab
sudo sed -i '/swap.img/s/^/#/' /etc/fstab

 

3. 컨테이너 런타임 설치 전 사전 작업

3.1 overlay, br_netfilter 활성화

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

 

3.2 iptables 세팅

cat <<EOF | sudo 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

sudo sysctl --system

 

4. 컨테이너 런타임 설치(containerd)

4.1 패키지 설치

sudo apt update
sudo apt install -y containerd

 

4.2 containerd 설정 수정 및 활성화

sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd

 

5. Kubernetes 패키지 설치

5.1 쿠버네티스 리포지토리 추가

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | \
  gpg --dearmor | sudo tee /etc/apt/keyrings/kubernetes-archive-keyring.gpg > /dev/null

echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] \
https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /" | \
sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt update

 

5.2 kubelet, kubeadm, kubectl 패키지 설치

sudo apt install -y kubelet kubeadm kubectl
sudo systemctl enable kubelet && sudo systemctl start kubelet

 

마스터 노드 설정 (k8s-master)

1. kubeadm으로 클러스터 생성

1.1 클러스터 초기화(Pod Network 세팅 및 토큰 생성)

sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=192.168.56.30
sudo kubeadm token create --print-join-command > ~/join.sh

 

1.2 kubectl 사용 설정

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

1.3 pod network 설치

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/calico.yaml

 

2. Pod 상태 확인(워커노드 조인 후)

kubectl get nodes
kubectl get pods -A

 

3. Dashboard 설정

3.1 dashboard 설치

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

 

3.2 로그인 토큰 생성

# 관리자용 ServiceAccount 생성
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
EOF

 

# 관리자 클러스터 권한 부여
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF

 

 

3.3 토큰 생성

kubectl -n kubernetes-dashboard create token admin-user

 

3.4 터미널 터널링 접속

ssh -L 8001:localhost:8001 k8s-master@192.168.56.30

 

3.5 프록시 실행

kubectl proxy --address=127.0.0.1 --accept-hosts='^localhost$'

 

3.6 브라우저 접근

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

 

워커 노드 설정 (k8s-worker1, k8s-worker2)

마스터에서 cat ~/join.sh 실행 후 해당 명령어를 워커 노드에서 실행 

1. 워커 노드를 클러스터에 조인

1.1 마스터 노드에서 조인 명령어 확인

cat ~/join.sh

 

1.2 워커 노드에서 조인 명령어 실행

-> 1.1에서 출력된 명령어를 워커 노드에서 실행

# 예시 (sudo 붙여줘야 함!)
sudo kubeadm join 192.168.56.30:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:1234...

 

2. 노드 연결 확인

마스터 노드에서 다음 명령어로 노드 상태를 확인

kubectl get nodes

-> 모든 노드가 Ready 상태로 표시되면 클러스터 구성이 완료된 것~

 

문제 해결

-> kubelet 재시작

sudo systemctl restart kubelet

 

-> 노드가 NotReady 상태인 경우

노드 상태 확인

kubectl describe node <노드이름>

 

kubelet 로그 확인

sudo journalctl -u kubelet -n 100 --no-pager

UTM 노드 설치 참고 스크린샷

새 가상머신 만들기 클릭
Virtualize 클릭
Linux 클릭
탐색 > 이미지 iso 업로드
메모리, CPU 설정
Disk 크기 설정
k8s-master 구성(나머지 워커노드도 이런 식으로 생성)
master노드 네트워크 설정(worker 노드는 안 해도 됨)

세팅 완료 후 실행 > Ubuntu 초기 세팅값 입력(네트워크 설정값은 위에 적힌대로) > docker, ssh는 미리 설치하는게 좋음 > 재부팅 > 종료 > 디CD/DVD에 있는 부트이미지 초기화 > 재실행

 

 

설치 완료 후 대시보드 화면

마스터노드에 아래와 같이 입력하면 생성되는 토큰을 로그인 시 복붙하면 됩니당

kubectl -n kubernetes-dashboard create token admin-user

 

'Cloud > k8s' 카테고리의 다른 글

[k8s] ConfigMap, Secret으로 DB 서버 접속  (0) 2025.03.19
[k8s] Pod 생성 및 볼륨 설정  (1) 2025.03.13