- 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 노드 설치 참고 스크린샷
세팅 완료 후 실행 > 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 |