AWS EC2 인스턴스 두 개를 사용하여 각각 쿠버네티스 마스터 노드와 워커 노드를 구성하고 연결하는 과정입니다. 이 과정을 통해 쿠버네티스 클러스터를 구성하고, 각 노드가 원활히 통신할 수 있도록 설정할 수 있습니다.
1. EC2 인스턴스 설정
마스터 노드 및 워커 노드 생성
1. AWS EC2 콘솔에서 인스턴스 두 개를 생성합니다. 하나는 마스터 노드(Master Node), 다른 하나는 워커 노드(Worker Node)로 설정합니다.
구분 | 마스터 노드 (Master Node) | 워커 노드 (Worker Node) |
역할 | 클러스터 제어 및 관리 | 애플리케이션 컨테이너 실행 |
EC2 인스턴스 타입 | t2.medium | t2.micro 또는 t2.small 등 |
CPU (vCPU) | 2 vCPU 이상 | 1 vCPU |
메모리 | 4GB 이상 | 1GB 이상 |
필요한 포트 | 6443, 2379-2380, 10250, 10251, 10252, 8285, 8472 | 10250, 30000-32767, 8285, 8472 |
주요 기능 | 클러스터 API 서버, 스케줄러, 컨트롤러, etcd 실행 | 컨테이너(Pod) 배포 및 애플리케이션 구동 |
마스터 노드(Master Node)는 컴포넌트들을 안정적으로 관리하기 위해 충분한 리소스가 필요합니다. 아래와 같이 CPU가 2개 이상인 인스턴스를 선택하여 생성합니다.
2. 인스턴스 보안 그룹 설정을 통해 쿠버네티스가 필요한 포트를 개방합니다.
• 마스터 노드(Master Node) : 6443, 2379-2380, 10250, 10251, 10252, 8285, 8472
포트 | 설명 |
6443 | API 서버 포트: 클러스터 내에서 kubectl 명령어를 통해 API 서버와 통신하거나, 워커 노드가 API 서버와 연결할 때 사용 |
2379-2380 | etcd 포트: 쿠버네티스 클러스터의 상태 데이터를 저장하는 etcd와의 통신에 사용 |
10250 | Kubelet 포트: 마스터 노드와 워커 노드 간의 통신에 사용되며, 노드 상태와 리소스 정보를 모니터링하기 위해 필요 |
10251 | 스케줄러 포트: 마스터 노드에서 실행되는 스케줄러의 상태를 확인하고 관리하기 위해 개방 |
10252 | 컨트롤러 매니저 포트: 클러스터의 리소스를 모니터링하고 유지하는 컨트롤러 매니저의 상태 확인에 사용 |
8285, 8472 | Flannel 네트워크 플러그인 포트: 쿠버네티스 네트워킹을 위해 Flannel 플러그인이 사용할 포트 |
• 워커 노드(Worker Node) : 6443, 26443, 30000-32767, 8285, 8472
포트 | 이유 및 설명 |
6443 | 마스터 노드 API 서버와의 통신 포트: 워커 노드는 마스터 노드의 API 서버(6443 포트)와 연결되어 클러스터 명령을 수신 |
26443 | kube-proxy 포트: 서비스 로드 밸런싱을 위해 kube-proxy가 마스터 노드와 통신할 때 사용 |
30000-32767 | NodePort 서비스 포트: 쿠버네티스에서 NodePort 타입 서비스를 외부에 노출할 때 사용하는 포트 범위 |
8285, 8472 | Flannel 네트워크 플러그인 포트: 쿠버네티스 네트워킹을 위한 플러그인(Flannel)이 사용하며, Pod 간 통신을 위해 필수 |
2. 쿠버네티스 설치
시스템 업데이트 및 패키지 설치
https://hostnextra.com/learn/tutorials/how-to-install-kubernetes-k8s-on-ubuntu
How to Install Kubernetes (K8s) on Ubuntu 24.04 - HostnExtra
Learn how to install and configure Kubernetes (K8s) on Ubuntu 24.04 with this step-by-step guide. Ensure seamless Kubernetes setup with Docker, kubeadm.
hostnextra.com
마스터 노드와 워커 노드 두 인스턴스에서 각각 접속하여 아래 명령어로 시스템을 업데이트하고 Docker, Kubernetes 관련 패키지를 설치합니다.
# 시스템 업데이트 및 업그레이드
sudo apt update && sudo apt upgrade -y
# Docker 설치
sudo apt install -y docker.io
# Docekr 설치 확인
sudo docker --version
# Kubernetes 구성 요소 설치
sudo apt install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
Swap 비활성화
쿠버네티스는 스왑을 비활성화해야 합니다. (Master Node 인스턴스, Worker Node 인스턴스에서 모두 비활성화)
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
3. 마스터 노드 초기화
마스터 노드에서 kubeadm init 명령어를 실행하여 쿠버네티스 클러스터를 초기화합니다. Flannel 네트워크를 사용할 경우 --pod-network-cidr=10.244.0.0/16 옵션을 추가합니다.(Master Node 인스턴스에서 진행)
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
초기화가 완료되면 아래와 같이 출력되는 것을 확인할 수 있습니다.
kubeadm join 명령어를 복사합니다. 해당 명령어는 워커 노드가 클러스터에 조인할 때 필요한 명령어로, 워커 노드에서 명령어를 실행시켜 줍니다.
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join <master-node-ip>:6443 --token <your-token> \
--discovery-token-ca-cert-hash sha256:<hash-value>
kubeconfig 설정
마스터 노드에서 kubectl 명령을 사용하기 위해 kubeconfig 파일을 설정합니다. (Master Node 인스턴스에서 진행)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
아래 명령어로 클러스터 상태를 확인합니다.
kubectl get nodes
4. 네트워크 플러그인 설치
쿠버네티스 클러스터 내 파드가 서로 통신할 수 있게 하기 위해 Flannel을 설치하여 네트워크 플러그인으로 사용합니다. (Master Node 인스턴스에서 진행)
참고) AWS EC2 인스턴스는 기본적으로 특정 포트가 제한되어 있어, 보안 그룹 설정 외에도 우분투 기본 방화벽(UFW)을 비활성화해야 합니다. 다음 명령어로 방화벽을 해제하여 포트 통신을 원활하게 합니다. (Master Node와 Worker Node 모두에서 수행)
sudo systemctl stop ufw
sudo systemctl disable ufw
마스터 노드에서 아래 명령어를 실행하여 Flannel을 설치합니다:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
아래 명령어로 모든 노드가 잘 실행 되는지 확인하고, 마스터 노드 ROLES 가 control-plane으로 뜨는 것을 확인합니다.
kubectl get nodes
5. 워커 노드 클러스터 조인
워커 노드에서 마스터 노드에서 제공된 kubeadm join 명령어를 사용하여 클러스터에 조인합니다.(Worker Node 인스턴스에서 진행)
sudo kubeadm join <master-ip>:6443 --token <your-token> --discovery-token-ca-cert-hash sha256:<hash-value>
6. 노드 상태 확인 및 문제 해결
마스터 노드에서 kubectl get nodes 명령어를 사용해 마스터 노드 인스턴스에서 노드 상태를 확인합니다. (Master Node 인스턴스에서 진행)
kubectl get nodes
몇 분 후 기다렸다가 다시 확인해보면 마스터 노드(Master Node) , 워커 노드(Woker Node) STATUS가 모두 Ready로 바뀐 것을 확인할 수 있습니다.
위와 같이 모든 노드가 Ready 상태여야 정상적으로 구성된 것입니다.
문제 : 워커 노드가 NotReady 상태로 표시됨
만약 마스터 노드와 워커 노드를 연결하고 kubectl get nodes 명령어를 실행했을 때 워커 노드가 계속 NotReady 상태로 표시되어 있다면
kubectl describe node <worker-node-name>
명령을 통해 워커 노드의 상태를 확인합니다. container runtime network not ready 및 NetworkPluginNotReady 메시지가 표시되면서 네트워크 플러그인이 초기화되지 않은 것을 확인할 수 있습니다.
원인
쿠버네티스는 CNI(컨테이너 네트워크 인터페이스) 플러그인을 통해 네트워크 통신을 관리합니다. 워커 노드에서 Flannel 네트워크 플러그인이 정상적으로 설치되지 않았거나 삭제 중인 상태로 남아 있었기 때문에 네트워크가 준비되지 않은 상태였습니다. 또한
kube-flannel 네임스페이스가 Terminating 상태로 남아 있어서 Flannel 플러그인을 재설치할 수 없는 상황이었습니다.
해결 과정
1. kube-flannel 네임스페이스 강제 삭제
kubectl delete namespace kube-flannel --grace-period=0 --force
명령어를 사용하여 네임스페이스를 강제로 삭제했습니다.
• 만약 네임스페이스가 삭제되지 않고 여전히 Terminating 상태로 남아 있다면
2. 남아 있는 리소스 강제 삭제
kubectl get all -n kube-flannel
명령어로 kube-flannel 네임스페이스 내에 남아 있는 리소스를 확인합니다.
kubectl delete pod <pod-name> -n kube-flannel --grace-period=0 --force
위 명령어를 사용하여 남아 있는 Pod를 강제로 삭제했습니다.
3. kube-flannel 네임스페이스 삭제 확인
kubectl get namespaces
위의 명령어로 kube-flannel 네임스페이스가 완전히 삭제되었는지 확인했습니다.
• kube-flannel 네임스페이스가 삭제되었고, 새로운 네임스페이스를 생성할 준비가 완료되었습니다.
4. Flannel 네트워크 플러그인 재설치
• Flannel 네트워크 플러그인을 재설치하기 위해 다음 명령어를 실행했습니다.
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
이 명령어를 통해 kube-flannel 네임스페이스가 생성되고 Flannel 리소스들이 정상적으로 배포되었습니다.
몇 분 정도 시간을 기다리고 마스터 노드에서 kubectl get nodes 명령어를 실행하여 워커 노드의 상태를 확인했습니다.
워커 노드 상태가 Ready로 변경되어 마스터 노드와 정상적으로 연결되었음을 확인했습니다.
1. kube-flannel 네임스페이스 강제 삭제 및 남아 있는 리소스 삭제
2. Flannel 네트워크 플러그인 재설치
3. 워커 노드에서 kubelet 재시작
'BackEnd > DEVOPS' 카테고리의 다른 글
[AWS] AWS ECS와 ECR을 활용한 CI/CD 구현 (1) | 2024.11.18 |
---|---|
[ArgoCD] ArgoCD 설치 (1) | 2024.11.15 |
[Kubernetes] Spring Boot 애플리케이션 배포: CNI, SDN, NodePort 서비스 설정 (1) | 2024.10.29 |
[Kubernetes] 쿠버네티스 클러스터 구성 및 관리 (0) | 2024.10.29 |
[Docker] Dockerfile 작성 및 이미지 빌드 (5) | 2024.10.16 |