[k8s] Kubernetes Cluster 구축하기 (v1.31)

2024. 10. 10. 12:04·DevOps/Kubernetes

1. 구성 환경 

GCE VM 인스턴스 3개를 생성하고, Master 1개, Worker 2개 구성으로 Kubernetes 클러스터를 구축했습니다.

  • GCE VM 유형: e2-medium
  • Master OS: ubuntu 22.04
  • Worker1 OS: ubuntu 22.04
  • Worker2 OS: ubuntu 22.04
  • Kubernets version: 1.31.1-1.1
  • Containerd version: 1.7.12
  • 네트워크 플러그인: WeaveNet 

2. 환경 설정

모든 노드에서 기본적인 Kubernetes 및 컨테이너 런타임 설치를 먼저 진행합니다.

1. 포트 허용

각 노드 별로 사용하는 port를 개방합니다.

  • master node: "6443/tcp", "2379-2380/tcp", "10250-10252/tcp", "10257/tcp", "10259/tcp", "8285/udp", "8472/udp"
  • worker1 node: "10250/tcp", "30000-32767/tcp" , "8285/udp", "8472/udp"
  • worker2 node: "10250/tcp", "30000-32767/tcp" , "8285/udp", "8472/udp"

 

2.  Swap 메모리 비활성화

Swap 메모리를 비활성화합니다. 

  •  Swap 메모리가 활성화되어 있으면 컨테이너의 성능이 일관되지 않을 수 있기 때문에, 대부분의 쿠버네티스 설치 도구(kubeadm)는 Swap 메모리를 허용하지 않습니다. 
sudo swapoff -a

 

만약 시스템 재부팅이 잦다면, 해당 명령으로 재부팅 시에도 Swap 메모리가 활성화되지 않도록 설정합니다. 

해당 명령어는 /etc/fstab 파일에서 "swap"이라는 단어가 포함된 줄을 찾아 주석 처리하여, 시스템 부팅 시 스왑 파티션이 자동으로 마운트되지 않도록 설정합니다.

sudo sed -i '/swap/s/^/#/' /etc/fstab

 

3. IPv4 패킷 포워딩 활성화

IPv4 패킷 포워딩을 활성화합니다. IPv4 패킷 포워딩이 활성화되면, 호스트 머신이 패킷을 다른 네트워크 인터페이스로 전달할 수 있습니다.

  • 쿠버네티스에서는 노드 간 통신과 Pod 간 네트워크 트래픽 전송을 위해 IPv4 패킷 포워딩이 필요합니다.
  • IPv4 패킷 포워딩이 비활성화된 상태에서는 이러한 네트워크 트래픽이 제대로 전달되지 않아, 쿠버네티스 클러스터 내 통신이 차단되거나 지연될 수 있습니다.
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF

sudo sysctl --system

 

4. 컨테이너 런타임 설치 (containerd)

패키지 업데이트를 하고, 컨테이너 런타임으로 containerd을 설치합니다. 

  • Kubernetes v1.24부터는 docker와 Kubernetes의 중간 레이어 역할을 하는 Docker Shim가 삭제되어, Kubernetes의 CRI(Container Runtime Interface)가 docker와 호환되지 않습니다. 따라서 컨테이너 런타임으로 containerd나 CRI-O를 사용합니다.
sudo apt-get update
sudo apt install -y containerd=1.7.12-0ubuntu2~22.04.1

 

containerd 설정을 초기화하고, Cgroup을 Systemd로 변경합니다.

sudo mkdir -p /etc/containerd && containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

 

containerd를 재시작하고, 시스템 재부팅 시 자동실행되도록 설정합니다.

sudo systemctl restart containerd
sudo systemctl enable containerd

 

5. Kubernetes 패키지 설치

구글 클라우드의 공개 사이닝 키 다운로드하고, Kubernetes Reposiotry 추가합니다.

sudo apt-get install -y apt-transport-https ca-certificates curl gpg
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

 

kubelet, kubeadm, kubectl를 설치하고, 버전을 고정합니다.

  • 버전을 고정하는 이유? apt-get upgrade 명령으로 시스템 업데이트를 수행할 때, 쿠버네티스 관련 패키지가 의도치 않게 최신 버전으로 업그레이드될 수 있습니다. 이는 업그레이드된 버전이 현재 클러스터와 호환되지 않으면 서비스 중단이나 오류가 발생할 위험이 있습니다. 따라서 apt-mark hold으로 패키지 버전을 고정하여 클러스터의 안정성을 보장합니다.
VERSION=1.31.1-1.1
sudo apt-get install -y kubelet=$VERSION kubeadm=$VERSION kubectl=$VERSION
sudo apt-mark hold kubelet kubeadm kubectl

 

kubelet를 실행하고, 시스템 재부팅 시 자동실행되도록 설정합니다.

sudo systemctl start kubelet
sudo systemctl enable kubelet

2. Master 노드에서 Kubernetes 클러스터 초기화

1. Master 노드에서 Kubeadm을 사용하여 클러스터 초기화

Master 노드에서 클러스터를 초기화합니다. 이를 통해 Kubernetes 클러스터의 control plane(제어부)을 구성하고 필요한 설정 및 구성 파일을 생성합니다.

여기서는 WeaveNet을 사용할 예정이기에 "--pod-network-cidr" 옵션을 주지않고 클러스터를 초기화 했습니다.

  • WeaveNet는 기본적으로 Pod 네트워크의 CIDR 범위를 자동으로 설정하며, 이 범위를 수동으로 지정할 필요가 없습니다.
  • 하지만, 네트워크 플러그인으로 Calico나 Flannel를 설치하는 경우 CIDR 설정이 필요합니다. "--pod-network-cidr" 옵션을 주어 Kubernetes에서 사용될 Pod 네트워크의 IP 주소 범위를 지정합니다.
sudo kubeadm init  # WeaveNet
sudo kubeadm init --pod-network-cidr=192.168.0.0/16  # Calico

 

클러스터 초기화가 성공적으로 완료되면 kubeadm join 명령이 출력됩니다. 해당 명령은 Worker 노드를 클러스터에 추가할 때 사용되기 때문에 복사해둡니다.

kubeadm join <MASTER_IP>:6443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH>

 

2. kubectl을 사용할 수 있도록 사용자 설정

kubectl 명령어를 실행할 때 필요한 클라이언트 인증 파일을 올바른 위치에 복사하고 권한을 설정합니다.

루트가 아닌 사용자가 kubectl을 사용하기 위해서는 해당 명령을 실행해야 합니다.

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

3. WeaveNet 네트워크 플러그인 설치

WeaveNet을 사용해 Pod 간 네트워크를 설정합니다. Master 노드에서 아래 명령을 실행합니다.

WeaveNet 플러그인이 설치되고 나면, 클러스터 내의 모든 Pod가 서로 통신할 수 있습니다.

kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

4. Worker 노드를 클러스터에 추가

이제 두 개의 Worker 노드를 클러스터에 추가합니다. 각 Worker 노드에서 Master 노드에서 출력된 kubeadm join 명령을 실행하여 노드를 클러스터에 추가합니다.
sudo kubeadm join <MASTER_IP>:6443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH>

5. 클러스터 상태 확인

모든 노드가 클러스터에 정상적으로 추가되었는지 확인하기 위해, Master 노드에서 다음 명령어를 실행합니다.

kubectl get nodes

 

Master 노드와 두 개의 Worker 노드가 출력되면 성공적으로 클러스터가 구성된 것입니다.

NAME          STATUS   ROLES           AGE     VERSION
k8s-master    Ready    control-plane   3m17s   v1.31.1
k8s-worker1   Ready    <none>          70s     v1.31.1
k8s-worker2   Ready    <none>          66s     v1.31.1

6. 테스트용 Pod 띄우기

정상적으로 쿠버네티스 클러스터가 만들어졌는지 확인하기 위해서 간단한 Pod를 띄어보도록 하겠습니다. 아래 명령을 마스터 노드에서 실행합니다.

kubectl run test-nginx --image=nginx:1.14

 

이후 정상적으로 띄어졌는지 확인하기 위해 아래 명령을 실행합니다.

kubectl get pods -o wide

 

 pod가 worker 노드 1번에서 정상적으로 Running인 것을 확인할 수 있습니다.

NAME         READY   STATUS    RESTARTS   AGE   IP          NODE          NOMINATED NODE   READINESS GATES
test-nginx   1/1     Running   0          83s   10.36.0.1   k8s-worker1   <none>           <none>

 

 

 

참고:

https://kubernetes.io/docs/setup/production-environment/container-runtimes/

https://cavecafe.medium.com/kubernetes-cluster-setup-9227ea68a762

https://dongle94.github.io/kubernetes/kubernetes-cluster-build/#저장소-추가-및-kubeadm-설치

https://littlemobs.com/blog/kubernetes-package-repository-deprecation/

https://inganyoyo.tistory.com/53

https://jbground.tistory.com/107

'DevOps > Kubernetes' 카테고리의 다른 글

[k8s] Service  (2) 2025.01.09
[k8s] Deployment  (0) 2025.01.09
[k8s] Pod  (0) 2025.01.09
[k8s] minikube 설치 & kubectl 사용하기  (1) 2025.01.09
[k8s] Kubernetes 개념 및 구성요소  (1) 2024.10.21
'DevOps/Kubernetes' 카테고리의 다른 글
  • [k8s] Deployment
  • [k8s] Pod
  • [k8s] minikube 설치 & kubectl 사용하기
  • [k8s] Kubernetes 개념 및 구성요소
Doodo
Doodo
  • Doodo
    Doodo
    Doodo
  • 전체
    오늘
    어제
    • 분류 전체보기 (192)
      • CS (17)
        • Network (11)
        • Database (6)
      • Language (19)
        • Python (11)
        • SQL (6)
        • R (2)
      • Linux (17)
      • DevOps (35)
        • Git (7)
        • Docker (8)
        • Kubernetes (9)
        • GCP (4)
        • AWS (7)
      • Data Engineering (50)
        • 책 리뷰 (14)
        • Airflow (35)
        • Redis (1)
      • DBMS (21)
        • CUBRID (21)
      • ML & DL (2)
      • 코딩테스트 (24)
      • 프로젝트 (7)
        • 서울시 대기현황 데이터 적재 프로젝트 (4)
        • CryptoStream (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Doodo
[k8s] Kubernetes Cluster 구축하기 (v1.31)
상단으로

티스토리툴바