[Kubernetes] 쿠버네티스 Ec2(Kubeadm) 환경에서 Master-Worker Node 구축
쿠버네티스 환경을 구축하는 방식에는 다양한 방법들이 존재하는데, 그중에서도 kubeadm을 이용하여 ubuntu 서버 내에 설치하고 직접 클러스터를 구축하는 방식을 다루어 볼 것이다.
1. EC2 인스턴스 생성
쿠버네티스는 기본적인 컴퓨터 자원의 사용량이 많기 때문에 인스턴스 사양의 CPU는 2 core 이상, RAM은 2 GB 이상을 필요로 한다.
ubuntu 서버 기준으로 t2.medium이나 t3.medium이 최소 사양이라고 볼 수 있다.
위와 같이 마스터 노드 1개, 워커 노드 1개로 구성할 것이다.
2. 인스턴스 보안그룹 생성
쿠버네티스는 노드 간 다양한 포트를 통하여 통신을 하는데, 컨트롤 플레인(마스터 노드)과 워커 노드의 각각의 필요한 포트를 이용하기 위하여 보안 그룹 설정을 필요로 한다.
+ 마스터 노드에 연결된 워커 노드에서는 Private IP를 기반으로 통신을 하기 때문에 이 부분도 추가적으로 개방이 필요하다.
마스터 노드의 보안 그룹을 예시로 들었고, 필요한 포트를 다른 노드에서 이용할 수 있게 개방해 주었고 특이한 부분은 네 번째 줄에 있는 172.0.0.0/8이다.
ubuntu 서버에 접속하게 된다면 Hostname으로 기본적으로 Private IP를 이용하고 있고, 이를 노드 간의 통신을 하는데 이용하기 때문에 해당 IP도 개방이 필요하다. (VPC와 Subnet을 지정하여 네트워크를 정확히 분리하여 이용할 수 있으나 해당 글에서는 다루지 않음)
위의 Private IP(사설 IP)에서 172.0.0.0/8은 172.0~255.0~255.0~255의 아이피를 모두 포함하는 것으로, 아이피 마지막의 /8이 해당 부분을 나타낸 것이고, 이러한 표기를 CIDR(사이더)라고 한다.
CIDR 표기를 토대로 마스터 노드와 워커 노드의 Private IP를 확인하고, 상호의 Private IP도 개방해주어야 한다.
유사한 방식으로 워커 노드의 보안 그룹까지 생성해주고, 각각의 인스턴스에 생성한 보안 그룹을 지정해주면 된다.
※ 편의상 모든 TCP에 Private IP를 개방해주었는데, 보안 이슈가 있기 때문에 개인의 정책에 맞는 부분으로 수정이 필요하다.
3. 설치
인스턴스 내부에 접속해서 다음의 명령어로 설치한다.
### Bash ###
# 패키지 업데이트
sudo apt-get update
# 필수 패키지 설치
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
# containerd 설치
sudo apt-get install containerd
# containerd 시스템에 등록
systemctl enable containerd
# Ipv4 포워딩
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 필요한 sysctl 파라미터를 설정하면, 재부팅 후에도 값이 유지된다.
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
# 재부팅하지 않고 sysctl 파라미터 적용하기
sudo sysctl --system
# 메모리 스왑 off
sudo swapoff -a
# containerd 설정
sudo mkdir /etc/containerd
# 기본 config 설정 파일 생성
sudo containerd config default > /etc/containerd/config.toml
# cgroup 드라이버 환경 설정
sudo vi /etc/containerd/config.toml
config.toml 파일에서 SystemdCgroup이 기본 설정에서는 false로 되어 있는데, 이를 true로 바꿔준다.
# 패키지 업데이트
sudo apt-get update
# 필요 패키지 설치
sudo apt-get install -y apt-transport-https ca-certificates curl
# 구글 클라우드 공개 키 다운로드
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 쿠버네티스 apt 리포지토리 추가
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/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
# containerd / kubelet 재시작
systemctl restart containerd
systemctl restart kubelet
# runtime 지정
crictl config --set runtime-endpoint=unix:///var/run/containerd/containerd.sock
위 과정에서 공개 키 다운로드 -> 쿠버네티스 apt 리포지토리 추가 -> 패키지 업데이트 시 아래와 같은 에러가 발생한다면, 공개 키에 관하여 문제가 발생한 것이다.
위 에러가 발생 시 https://github.com/kubernetes/release/issues/2862 해당 깃허브를 참고하면 될 것이다.
설치를 완료했다면 아래 명령어를 통해 쿠버네티스 설치를 확인해보자.
# 쿠버네티스 컨트롤
kubectl
# 쿠버네티스 어드민
kubeadm
지금 과정까지는 마스터 노드와 워커 노드 동일하게 해주어야 하고, 이 다음 부터는 서로 다른 세팅을 하게 된다.
4. 마스터 노드 설정
4-1. Kubeadm 초기화
마스터 노드에서는 kubeadm을 이용하여 클러스터를 구축하는데 다양한 기능을 제공해준다.
# kubeadm 초기화 - calico 이용
kubeadm init --pod-network-cidr=192.168.0.0/16
여기서 --pod-network-cidr은 다음 순서인 4-2의 CNI 플러그인에서 사용할 네트워크를 의미한다.
초기화 명령을 실행하면 ,
위와 같이 나올 것이다.
여기 나온 명령어 중 상단의 명령어를 실행한다.
# 쿠버네티스 conf 설정
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
authentication 관련 에러가 발생 시, 아래 명령어를 통해 해결이 가능하고,
export KUBECONFIG=/etc/kubernetes/admin.conf
kubeadm join ~의 명령어들은 추후에 워커 노드에서 클러스터에 합류할 때 이용할 예정이니 바로 명령어를 실행하지는 않고 별도로 빼두어 저장한다.
kubeadm join ~이 두 번 나와있는데, 위의 명령어는 마스터 노드의 join이고, 아래 명령어는 워커 노드의 join이다.
4-2. CNI 플러그인 설치
쿠버네티스 클러스터를 구축하는데 있어서 네트워크 모델을 구현하는데 있어, 워커 노드를 관리하려면 플러그인이 필요하다.
아래는 플러그인의 목록을 볼 수 있다.
여기서 Calico, Flannel 및 Weave Net이 대중적으로 많이 쓰이며, 본문에서는 calico를 설치해 볼 것이다.
다음은 calico 공식 사이트의 설치 가이드다.
https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart
# tigera operator 설치
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
# 추가 커스텀 설치 (default)
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml
위 명령어를 통해 CNI 플러그인을 설치할 수 있으며, 전부 설치하면 아래 명령어를 통해 확인할 수 있다.
# 모든 네임스페이스의 모든 자원 확인
kubectl get all -A
5. 워커 노드 (Join)
워커 노드에서 마스터 노드에 합류하는 것은 아주 간단한데, 마스터 노드의 kubeadm 초기화 시 출력되었던 아래의 명령어를 워커 노드에서 실행시키기만 하면 된다.
6. 결과 확인
마스터 노드에서 아래 명령어를 통해 각 노드 상태가 Ready가 된다면 구축이 완료된 것이다.
# 노드 확인
kubectl get nodes