쿠버네티스를 설치하는 방법은 수십가지가 넘을정도로 많습니다.
가장 일반적이고 핵심적인 방법은 다음과 같습니다.
- Kubeadm : 쿠버네티스 공식 프로젝트에서 제공하는 설치/부트스트랩 도구 클러스터 구성에 필요한 핵심 컴포넌트(API Server, etcd, Controller Manager, Kubelet 등)을 초기화하고 설정해줍니다.
- 장점 : 쿠버네티스 공식 프로젝트에서 지원하므로, 문서와 커뮤니티 정보가 많고 신뢰성이 높음.
- 단점 : 네트워크 플러그인(CNI)설정, 로드밸런서 구성, OS 종속정인 설정은 별도로 작업이 필요.
- Kubespray : Ansible 플레이북을 활용하여 쿠버네티스 클러스터를 설치하고 구성하는 프로비저닝 자동화 도구 다양한 환경(AWS, GCE, Azure, OpenStack, 베어메탈 등)에 대해 리프팅 스크립트를 공통으로 제공합니다.
- 장점 : 네트워킹(CNI), 스토리지, 로드밸런서, 보안 등 다양한 설정이 엔서블 플레이북으로 자동화되어 재사용성이 높음
- 단점 : 엔서블에 대한 사전지식이 없으면 세팅이 다소 복잡할 수 있고, kubeadm을 단독으로 사용하는 것보다 무거울 수 있음
- kOps : AWS 상에서 Kuberntes 클러스터를 손쉽게 생성, 운영, 업그레이드 할 수 있도록 돕는 도구 Route53, S3, EC2, VPC 등 AWS 리소스와 밀접하게 통합되어 쿠버네티스 클러스터를 생성합니다.
- 장점 : 테라폼과 연계하여 IaC(Infrastructure as Code)를 구현하기 쉬워서 클러스터 및 인프라 버전 관리가 편하며, AWS 리소스(VPC, Auto Scaling Group) 생성부터 관리까지 한번에 자동화 가능
- 단점 : AWS에 종속되어 있으므로 다른 클라우드를 사용할 경우에는 어렵거나 제한적이며 클라우드 비용문제와 AWS 리소스에 대한 이해가 필요하여 진입장벽이 조금 있는 편이다.
- minikube : 로컬 환경에서 단일노드 클러스터를 손쉽게 실행해볼 수 있는 도구
- 장점 : 빠른 개발, 테스트, 학습용 목적으로 사용할 수 있고 설치가 간편하다.
- 단점 : 단일노드 기반이라 고가용성(HA)이나 실제 운영 환경 시나리오를 모두 재현하기는 어려움
Kubeadm은 쿠버네티스 설치의 표준적인 기본기를 익히기 좋으며, 다양한 환경을 직접 구성해야해서 초기 쿠버네티스 학습용으로 좋습니다. 때문에 공식문서를 참고하여 Kubeadm 설치를 진행해보겠습니다.
초기환경
VMware 또는 Oracle Virtual Box를 통해 VM1,2를 구성해놓습니다.
VM환경은 Ubuntu22.0 버전이고, 스왑메모리 비활성화, 각 VM마다 SSH 접속이 가능해야합니다.
또한 VM은 브릿지 네트워크로 동작하도록 설정합니다.
모든 노드 공통 설정
sudo -i
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
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
위는 컨테이너 -> 가상 이더넷(veth) -> 브리지 -> iptables -> 호스트/외부 네트워크 이런 식의 흐름을 만들기 위해 필요한 설정입니다.
sudo modprobe overlay
sudo modprobe br_netfilter
sudo sysctl --system
Containerd 설치
쿠버네티스는 v1.20 버전부터 컨테이너 런타임 엔진으로 도커를 사용하지 않습니다. 이유는 쿠버네티스가 여러 컨테이너 런타임을 유연하게 쓸 수 있게 CRI라는 표준 인터페이스를 정의 했지만 도커는 자체적으로 CRI를 직접 구현하지 않았기 때문에 도커를 사용하려면 쿠버네티스 자체에서 dockershim 이라는 중간계층을 개발 했습니다. 이 중간계층을 유지하는 것은 쿠버네티스 프로젝트에서 추가 부담이었습니다.
docker를 사용하면 쿠버 → dockershim → docker → containerd → runc 여러단계를 거치게 됩니다.
containerd를 직접 사용하면 쿠버 → containerd → runc 라서 디버깅도 쉽고, 오버헤드도 적어서 성능이 올라갑니다.
하지만 도커를 아예 사용 안 하는건 아니고 노드에서 빌드되는 컨테이너 런타임 엔진만 바뀐 것일뿐 도커 이미지는 계속 사용할 수 있습니다.
이러한 이유로 Containerd를 런타임 엔진으로 사용하여 설치를 진행하겠습니다.
# 컨테이너 설치
sudo apt-get update
sudo apt install containerd
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
# ✨ SystemdCgroup 값을 true로 설정
# /SystemdCgroup 입력후 빠른 찾기로 수정 -> enter -> i -> true 수정 -> esc : wq!
sudo vi /etc/containerd/config.toml
sudo systemctl status containerd
sudo systemctl restart containerd
sudo systemctl status containerd
Kubeadm 설치
Kubeadm, kubelet, kubectl 도구 설치
- kubeadm : 클러스터를 설치하는데 필요한 부트스트랩 도구
- kubelet : 클러스터의 모든 노드에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행하는 컴포넌트
- kubectl : 클러스터와 통신하기 위한 CLI
# k8s apt 레파지토리 추가
sudo mkdir -p /etc/apt/keyrings
# 구글 클라우드의 공개 String Key 다운로드
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
# 설치된 버전들 확인
$ kubectl version --client --output=yaml
$ kubeadm version
$ kubelet --version
마스터노드 추가설정
Containerd를 사용하여 이미지를 받을 수 있게 설정
$ sudo kubeadm config images pull --cri-socket /run/containerd/containerd.sock
클러스터 초기화 (CNI 드라이버로 Calico를 사용할 것이기에 192.168.0.0/16으로 등록)
sudo kubeadm init --apiserver-advertise-address=10.0.2.21 --pod-network-cidr=192.168.0.0/16 --cri-socket /run/containerd/containerd.sock
위의 명령어를 실행하면 아래와 같이 토큰 해시값이 나온다.
kubeadm join 10.0.2.21:6443 --token vwt859.9xd2bs6bghklfdc9 \
--discovery-token-ca-cert-hash sha256:9a7d8a2f3df1ea809d9a726fe515789e3e99c6bd38fbd54813db63b614b3f4e6
인증파일 생성
root가 아닌 일반 사용자는 반드시 인증이 필요합니다.
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
확인
$ tree .kube/
.kube/
└── config
워커 노드 설치
혹시나 토큰값을 까먹었을 경우 마스터 노드에서 실행
$ sudo kubeadm token create --print-join-command
토큰값을 알았으면 마스터노드에 종속될 워커노드 VM으로 가서 아래 명령어 실행
mkdir -p $HOME/.kube
# 마스터 노드의 config 폴더의 내용을 워커 노드로 copy
scp -p {우분투계정ID}@{마스터노드IP}:~/.kube/config ~/.kube/config
kubeadm join 명령어 예시
sudo kubeadm join {마스터노드IP}:6443 --token ztfys3.lsldqplve1hn07hk --discovery-token-ca-cert-hash sha256:9a7d8a2f3df1ea809d9a726fe515789e3e99c6bd38fbd54813db63b614b3f4e6
# 클러스터에 등록 됐는지 확인
kubectl get nodes
여기까지 진행했으면 노드상태가 NotReady 일텐데 이제 CNI 플러그인을 설치해주면 됩니다.
CNI 플러그인(Calico) 설치
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/calico.yaml
버전은 계속 변경되며 최신 릴리즈 버전으로 변경해도 괜찮습니다.
## calico cni 클러스터에 설치
kubectl apply -f calico.yaml
## 적용하고, calico pod, dns 다 올라왔는지 확인
kubectl get pods -n kube-system -w
마지막으로 모든 노드가 ready 상태인지 확인해줍니다.
$ kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
myserver01 Ready control-plane 10h v1.31 10.0.2.21 <none> Ubuntu 22.04.3 LTS 5.15.0-121-generic containerd://1.7.12
myserver02 Ready <none> 9h v1.31 10.0.2.22 <none> Ubuntu 22.04.3 LTS 5.15.0-121-generic containerd://1.7.12
이렇게하면 kubeadm를 사용한 온프레미스 클러스터 설치가 완료됩니다.
참고
참고로 위의 방법은 어렵지만 쿠버네티스의 동작원리를 이해하는데 좋습니다.
'Kubernetes' 카테고리의 다른 글
[Kubernetes] Kubernetes(K8s)에서 Pod가 생성될 때 내부동작 (0) | 2025.02.02 |
---|---|
[Kubernetes] 쿠버네티스 CNI 플러그인에서 Overlay를 사용하는 이유 (0) | 2025.01.28 |
[Kubernetes] Replica Controller / ReplicaSet 차이점과 잘 사용하는 법 (1) | 2025.01.19 |
[Kubernetes] 쿠버네티스 서비스 디스커버리란? (2) | 2025.01.18 |
[Kubernetes] 쿠버네티스 트래픽 전달방식 아키텍처 (0) | 2025.01.17 |