전체 구조
설치할 환경은 아래와 같다.

컴퓨터에 직접 가상화 환경을 생성할 것이다.
지금 이렇게 진행하지만 추후에 AWS, NCP, GCP 등 다양한 퍼블릭 클라우드를 사용할 수 있다.
만약 퍼블릭 클라우드를 사용한다면, Guest OS 부분이 대체될 것이다.
인프라 환경 설치

Mac은 Viturl Box를 설치할 수 없다. Mac에서 사용할 수 있는 가상화 환경인 UTM을 다운로드하고, 거기서 Rocky Linux를 실행한다.
Rocky Linux에 들어가서 Kubernetes Cluster를 설치하고 Pod를 확인한다.
나의 데스크탑에서 대시보드에 접속한다.
UTM + Rocky linux 설치
Rocky linux iso 설치
https://dl.rockylinux.org/vault/rocky/9.2/isos/aarch64/Rocky-9.2-aarch64-minimal.iso
UTM 설치
https://github.com/utmapp/UTM/releases/download/v4.4.4/UTM.dmg
이후 UTM을 연다.

1. 가상머신 생성 후 Virtualize를 선택한다.
2. 다양한 OS 중 linux를 선택한다.
3. Boot ISO Image를 아까 다운받은 Rocky linux image를 선택한다.
4. 메모리는 여유롭게 4096MB, CPU Cores는 4를 선택한다.
5. 디스크 Size는 32 GB를 선택한다.
6. 공유 폴더는 따로 설정하지 않고, Summary 이름을 k8s-master로 시작한다.
7. open VM Settings 체크 후 SAVE
8. 네트워크를 선택하고 Show Advanced Settings를 선택 후 IP에 192.168.56.0/24를 선택한다.
9. 생성된 VM을 실행하고, Rocky linux 초기 세팅을 시작한다.
10. root 비밀번호를 생성하고, root 계정 잠금을 헤제하고 root가 비밀번호로 SSH 로그인하도록 허용을 체크한다.
11. 네트워크와 호스트 이름을 선택해야한다.
12. 호스트 이름은 k8s-master로 입력 후 적용한다.
13. 이더넷 설정의 IPv4 설정을 누르고 Method를 수동으로 설정한다.
14. 주소에서 Add를 눌러 주소(192.168.56.30), 넷마스크(255.255.255.0), 게이트웨이(192.168.56.1)를 추가한다.
15. 설치 시작을 클릭 후 설치 완료 후 재시작을 한다.
16. CD/DVD에서 empty로 해야 한다. (윈도 포맷 후 재설치한 후 iso가 깔려있는 usb를 제거하는 것과 같은 원리)
17. 터미널로 접속한다. (Mac 터미널 사용)
ssh root@192.168.56.30
The authenticity of host '192.168.56.30 (192.168.56.30)' can't be established.
ED25519 key fingerprint is SHA256:+grKMOsgQHDF0lTTZTD65khFhnk5Q56wvNSFV4+NsnA.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
[root@192.168.56.30's password: (비번입력)
터미널에서 쿠버네티스 설치(arm64 버전)
쿠버네티스 설치 공식 문서 가이드라인
https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
kubeadm 설치하기
이 페이지에서는 kubeadm 툴박스 설치 방법을 보여준다. 이 설치 프로세스를 수행한 후 kubeadm으로 클러스터를 만드는 방법에 대한 자세한 내용은 kubeadm으로 클러스터 생성하기 페이지를 참고한다.
kubernetes.io
모든 노드에서 쿠버네티스 설치
5. kubeadm 설치 전 사전작업 포트 개방, 스왑 비활성화
쿠버네티스 구성들끼리 서로 통신할 특정 포트를 개방해야 한다고 나와있다.
하지만 아래 설정에서는 방화벽을 모두 내려 학습해 볼 것이다.
스왑을 비활성화한다.

6 - 1. iptables 세팅
공식문서에 나와있는 대로 컨테이너 런타임 설치 전 사전작업으로 iptables를 세팅한다.

6 - 2. containerd 패키지 설치
컨테이너 런타임 중 하나인 containerd를 설치한다.

컨테이너 시작하기 링크를 따라가라고만 나와있고 설치 후에는 파일이 있는지만 확인하라고 나온다.
containerd 설치하기에 들어가면 아래와 같은 Github 링크가 나온다.
option1은 따로 설치해야 할 것이 너무 많아 그냥 넘어가고, option2에 있는 containerd.io를 설치한다면 containerd와 runC를 한 번에 설치할 수가 있다.
우리는 Locky linux를 사용하고 있기 때문에 CentOS를 설치하면 된다.

Cent OS를 클릭하면 docker 다운로드 창으로 넘어간다.
containerd 1.6.21 설치
명령어를 사용하여 우리가 사용할 containerd 버전인 1.6.21 버전으로 설치한다.
yum install -y containerd.io-1.6.21-3.1.el9.aarch64
패키지를 통해서 설치했으므로 CRI가 비활성화되어있다고 공식문서에 나와있다
그래서 containerd config 파일 안에 disabled_plugins가 포함 안되도록 수정하고 containerd를 재시작해야 한다
containerd 재실행
systemctl daemon-reload
systemctl enable --now containerd
CRI 활성화
그 후 CRI가 비활성화되어있으므로 꼭 활성화를 해준다.
containerd config default > /etc/containerd/config.toml
sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd
이제 containerd를 완벽하게 설치했다.
7. 쿠버네티스 설치
1.27 버전에 맞는 kubelet, kubeadm, kubectl, selinux 설치
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
Master Node 세팅

8-1 클러스터 초기화
kubeadm init --pod-network-cidr=20.96.0.0/16 --apiserver-advertise-address 192.168.56.30
위에서 패키지 설치 후 7번에 있는 kubeadm, (Rocky Linux에) kubelet(Master node에), kubectl(Master node에)이 설치가 된다.
8번에 kuberadm 클러스터를 초기화하면 사진 5본에 있는 5가지의 쿠버네티스 컴포넌트들이 만들어진다.
모두 Pod 형태로 기동이 되고 이미지를 인터넷으로 받아오기 때문에 시간이 좀 걸린다.
8-2 Kubectl 설정
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
cidr 즉 pod network 설정을 하면 쿠버네티스에 접속할 수 있는 인증서가 만들어져 있다.
8-2의 kubectl 설정이 인증서를 가져와 Kubectl이 사용할 수 있게 설정을 하는 것이다.
이렇게 까지 설정이 되었다면 kubectl로 kube-apiserver에 API를 날리면서 CLI통신을 할 수 있게 된다.
8-3 CNI 설정
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
CNI Plugin으로 calico을 설치하는 내용이 있는데 Container Network Interface의 약자로 컨테이너들 간의 통신을 관리하는 부분에 대한 쿠버네티스와 네트워크 간의 인터페이스이다.
8-4 Master에 Pod를 생성할 수 있도록 설정
kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane-
kubeadm에서 생성되는 컴포넌트들이나 대시보드는 이 Pod들이 마스터에 올라고도 되도록 설정이 있다.
일반적으로 Master에 유저가 만든 Pod는 올리지 않는 게 정석이지만 필자는 Master만 만들 거니까 App1과 App2가 별다른 설정을 하지 않아도 Master Node에 Pod가 생성되도록 하는 설정이다.
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
kubectl 키워드와 'd' 까지만 치고 tab을 누르면 'd'로 시작하는 키워드가 조회된다.
9-2 Dashboard 설치
kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/dashboard-2.7.0/dashboard.yaml
사람 눈에 잘 보이는 대시보드 설치
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
컨테이너에 대한 CPU나 메모리는 컨테이너 런타임에 의해서 기본적으로 관리가 되고 있다.
하지만 Metrics Server를 설치하면 Metric정보를 조회해 주고 Dashboard에 CPU랑 메모리 정보가 표시된다.
이렇게 설치하게 될 경우 CPU와 Memory에 대한 정보를 그래프로 볼 수 있다.
명령어 모음
위 설명에 대한 모든 명령어를 합친 것
echo '======== [4] Rocky Linux 기본 설정 ========'
echo '======== [4-1] 패키지 업데이트 ========'
# 강의와 동일한 실습 환경을 유지하기 위해 Linux Update 주석 처리
# 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
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
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 '======== [8-4] Master에 Pod를 생성 할수 있도록 설정 ========'
kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane-
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
대시보드 접속
그 후 대시보드에 접속하여 상태를 확인한다.
https://192.168.56.30:30000/#/login

출처
위 사진들은 일프로님 강의에 나온 화면이며 강의를 수강하며 학습했습니다.
https://www.inflearn.com/course/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%96%B4%EB%82%98%EB%8D%94-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%A7%80%EC%83%81%ED%8E%B8-sprint1/dashboard
쿠버네티스 어나더 클래스 (지상편) - Sprint 1, 2 강의 | 일프로 - 인프런
일프로 | ⚓쿠버네티스, 🙇♀️아직 망설이시나요? 🙋♂️저만 믿고 따라오세요! 당신의 실력을 ⭐어나더 레벨로 만들어 드리겠습니다., ✅ 광범위한 쿠버네티스 기술을 A~Z까지 넓고
www.inflearn.com
'Infra > Kubernetes' 카테고리의 다른 글
Kubernetes 1. Container 한방정리 (Kubelet, Container runtime) (0) | 2024.08.27 |
---|