오늘은 쿠버네티스를 베어메탈 환경에 구축해보려고한다.
소프트웨어 마에스트로 연수생일때 쿠버네티스를 다뤄본 경험이있는데, 회사에서 쿠버네티스 경험자인 나에게 사내 서버를 싹 쿠버네티스로 전환하는 작업을 맡게되었다.
물론 나는 평소에도 이런 서버 관리가 재미있어서 만드는 과정에서 너무 재밌었다
본론으로 돌아와서 깡통 서버에 쿠버네티스를 설치하는 법을 포스팅을 진행하겠습니다.
혹시나 따라하게 되신다면 총 3대의 리눅스 Ubuntu 22.04 버전을 준비해주세요.
1. Iptables 활성화
쿠버네티스는 기본적으로 Iptables를 이용하기 때문에 iptables가 정상 작동하도록 해주세요.
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# sysctl params required by setup, params persist across reboots
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
# Apply sysctl params without reboot
sudo sysctl --system
2. Swap 메모리 비활성화
성능을 최대한으로 쓰기 위해 스왑 메모리를 비활성화 해주자!
## swap 영역 비활성화
sudo sed -i '/swap/d' /etc/fstab
sudo swapoff -a
free -h
3. 방화벽 설정
사용할 포트만 방화벽을 풀어주면 되는데 사내에서만 접속가능하기 때문에 나는 이 설정은 건너띄었다.
### 방화벽 비활성화
### 실제로는 Service Port 만 allow
systemctl stop firewalld
systemctl disable firewalld
4. 컨테이너 런타임 인터페이스(CRI) 설치
CRI는 클러스터 컴포넌트를 다시 컴파일하지 않아도 다양한 컨테이너 런타임을 사용할 수 있도록 하는 플러그인 인터페이스이다.
말이 어려워서 그렇지 쉽게 말해 Docker같은 기능을 설치하는 거다 k8s의 1.24? 버전인가 부터는 도커 의존성을 해제했기 때문에 알맞은 CRI를 설치해야한다.
초기 버전에는 도커를 이용해서 쿠버네티스 파드를 띄웠지만, 도커엔진에 대한 의존성이 너무 강해서 도커가 업그레이드 되면 쿠버네티스도 같이 영향을 받았기에 이를 해결하기 위해 OCI 표준을 준수하는 containered를 만들게 된것이다.
### root권한으로 진행해야 명령어가 먹힘
sudo -s
apt update && sudo apt upgrade
sudo apt-get install \
ca-certificates \
apt-transport-https \
curl \
gnupg \
lsb-release
K8S_VERSION_MINOR=1.29
# Repo for Kubernetes tools/components
curl -fsSL https://pkgs.k8s.io/core:/stable:/v${K8S_VERSION_MINOR}/deb/Release.key |
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:/v${K8S_VERSION_MINOR}/deb/ /" |
tee /etc/apt/sources.list.d/kubernetes.list
apt update
sudo apt install -y containerd
# 기본 설정 파일 생성
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
# Systemd cgroup 사용으로 설정
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# containerd 시작 및 활성화
sudo systemctl restart containerd
sudo systemctl enable containerd
apt-get install -y kubelet kubeadm kubectl
kubeadm까지 같이 설치하면 된다!
이후 쿠버네티스를 켜주자!
#해당 명령어 시 나오는 kubeadm join ~~ 어쩌고를 잘 저장해놓자
kubeadm init --apiserver-advertise-address ${Control Plane의 사설 ip}
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
그리고 이제 CNI를 설정해야하는데 CNI가 뭐냐면은 Cloud Native Computing Foundation로써 컨테이너 간의 네트워킹을 제어할 수 있는 플로그인을 만들기 위한 표준이다.
쉽게 말하자면 기본적으로 도커는 다들 사용해봤을테니 도커에 비유해보겠다.
도커에서 여러개의 컨테이너를 띄우면 서로간 통신이 안된다. MSA 구조로 프로젝트를 진행해보면 무조건 겪을 문제다.. 이를 해결하기 위해서는 도커 네트워크를 설정해줘야하는데, 한 호스트에 있으면 문제가 안되지만 쿠버네티스 같은 경우는 여러개의 노드에 띄워지고 어떤 노드에 배치될지 개발자는 고려하지 않아도 된다. 하지만 이때 각 띄워진 파드끼리의 통신이 되야하기 때문에 이 CNI를 설치해주는 것이다.
요 그림을 보면 노란 석이 CNI를 뜻한다. 서로 다른 노드간의 통신을 원활히 도와준다!
종류를 보면 굉장히 다양한데 아래 표를 확인해보고 원하는 것을 채택하면 된다
5. CNI 설정 (Control Plane 만 시도!)
나는 제일 유명ㅁ한 calico를 채택했다.
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/calico.yaml
vi calico.yaml
## vi 편집기를 이용해서 검색
:/CALICO_IPV4POOL_CIDR
## 해당 부분에 원하는 네트워크 대역을 사이더 표기법으로 표시
- name: CALICO_IPV4POOL_CIDR
value: "172.16.0.0/12"
## 저장 후 나가기
:wq
kubectl apply -f calico.yaml
여기까지가 ControlPlane의 설정이다. 해당 설정을 나머지 2대의 서버에 고대로 5번을 제외하고 작업해준다.
6. Data Plane 설정
Control Plane에서 kubeadm init~ 어쩌고를 복사해놔야했는데, 혹시나 날라가거나 까먹었다면 Control Plane에서 다음 명령어를 치면 다시 볼 수 있다.
kubeadm token create --print-join-command
자 그럼 이제 Data Plane 에서 다음 명령어만 치면 끝이다
kubeadm join ${control plane 해당하는 ip:port} --token ${token값} \
--discovery-token-ca-cert-hash sha256:9f6ccd16d2826512ae8f2d6a8925205aaf008d13f2dbaf14a8c3721a2433ae32 \
--node-name worker1
7. 최종적으로 control plane에서 다음 명령어를 쳤을때 내가 붙인 data plane이 나오면 성공!
kubectl get node
이때 node 라벨을 바꾸고싶으면 control plane에서 아래 명령어 치기
kubectl label node worker1 node-role.kubernetes.io/worker=worker
'쿠버네티스' 카테고리의 다른 글
ELK 구축하기 (0) | 2024.07.16 |
---|---|
쿠버네티스 이해하기 (0) | 2024.07.16 |