본문 바로가기

쿠버네티스

RKE2를 이용한 쿠버네티스 클러스터 구축

설치 환경 개요

※ 본 글에서는 실제 회사 내부 테스트 환경에서 RKE2를 설치하며 사용한 사양과 구성 정보를 바탕으로 작성되었습니다.
운영 환경 구성 시 참고용으로 활용하시되, 환경에 맞게 적절한 조정을 권장합니다.

서버 사양 

  • 모델: HPE ProLiant DL160 Gen10
  • CPU: Intel(R) Xeon(R) Silver 4210R @ 2.40GHz
  • RAM: 32GB
  • 이더넷: Embedded 2-port 1GbE

클러스터 노드 구성

노드 이름 IP 주소
cluster-node-1 172.16.0.1
cluster-node-2 172.16.0.2
cluster-node-3 172.16.0.3
 

운영 체제 및 RKE2 버전

  • OS: Ubuntu Server 22.04 LTS (Minimized Installation)
  • RKE2: v1.31.4+rke2r1

사전 준비

네트워크 설정 (3대 노드에 설정, 아래 예시는 1대 기준)

아래의 내용을 3대 노드에 각각 IP에 맞게 적용합니다.

$ sudo vi /etc/netplan/00-installer-config.yaml

# 설정 시작
# This is the network config written by 'subiquity'
network:
  ethernets:
    eno1:
      addresses:
      - 172.16.0.1/24
      nameservers:
        addresses:
        - 8.8.8.8
        search:
        - cluster-node-2
      routes:
      - to: default
        via: 172.16.0.254
    eno2:
      dhcp4: true
      # 네트워크 설정 확인 및 연결되지 않은 경우에 바로 부팅 되도록 설정
      optional: true
  version: 2
 # 설정 끝

 

 

서버 업데이트 및 기본 구성요소 설치, Swap 제거 및 최신 커널 적용 후 재부팅

# 업데이트 및 구성요소 설치
$ sudo apt update && sudo apt upgrade -y
$ sudo apt install ubuntu-standard ubuntu-server curl wget git -y

# 설치시 유저를 생성하였다면 진행하지 않아도 됨
$ sudo useradd -m -s /bin/bash -G sudo locate && passwd locate

# 스왑 제거
$ swapoff -a

$ sudo vi /etc/fstab
# 설정 부분 - 해당 부분 찾아서 주석 처리
#/swap.img      none    swap    sw      0       0
# 설정 끝

# 재부팅
$ sudo reboot

 

 

 

sshd 포트 변경

$ sudo vi /etc/ssh/sshd_config

# 설정 부분 - 해당 부분 찾아서 다음과 같이 변경
Port 50000
# 설정 끝

# sshd 서비스 재기동
$ sudo systemctl restart sshd

 

 

시간설정

# 한국으로 시간대 변경
$ sudo timedatectl set-timezone Asia/Seoul

# ntp 서비스 설치
$ sudo apt install ntp -y
vi /etc/ntp.conf

# 설정 파일안에 기존 pool 주소 주석 처리 후 한국 pool 주소 추가
#pool 0.ubuntu.pool.ntp.org iburst
#pool 1.ubuntu.pool.ntp.org iburst
#pool 2.ubuntu.pool.ntp.org iburst
#pool 3.ubuntu.pool.ntp.org iburst
server 3.kr.pool.ntp.org
server 1.asia.pool.ntp.org
server 3.asia.pool.ntp.org


# ntp 서비스 재기동
$ sudo systemctl enable ntp
$ sudo systemctl restart ntp

 


k8s 마스터 노드 설정

고가용성을 위해 마스터노드는 최소 3대로 설치 합니다.

RKE2에서 노드끼리 연결하기 위한 IP 주소에 대한 고가용성 설정

 

keepalived 설치 - 모든 노드에 동일하게 적용 (고가용성 처리)

$ sudo apt-get update && apt-get install -y keepalived 

# rke2-server 프로세스 확인 스크립트 작성
$ sudo vi /etc/keepalived/check_rke2.sh

#!/bin/bash
systemctl is-active --quiet rke2-server
if [ $? -eq 0 ]; then
    exit 0  # 정상 실행
else
    exit 1  # 실패
fi

 

 

keepalived 설정, 스크립트 작성 - 노드마다 다르게 설정

# 다음 내용은 각각의 node에 다르게 작성
$ sudo vi /etc/keepalived/keepalived.conf

# -----------------------------------------------------------------------------
# 172.16.0.1(cluster-node-1) 적용
vrrp_script check_rke2_script {
    script "/etc/keepalived/check_rke2.sh"  # 절대 경로 지정
    interval 10 # 10초마다 체크
    weight -30  # RKE2가 죽으면 priority 낮춰서 VIP 반납
}
vrrp_instance VI_1 {
    state MASTER                   # MASTER, BACKUP 중에서만 가능
    interface eno1                 # 네트워크 인터페이스
    virtual_router_id 51           # VRRP 그룹 ID
    priority 100                   # 마스터노드는 우선순위 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass locate-cluster
    }
    virtual_ipaddress {
        **172.16.0.42**
    }
    track_script {
        check_rke2_script  # RKE2 상태 감지 스크립트 연결
    }
}
# 적용 끝

# -----------------------------------------------------------------------------
# 172.16.0.2(cluster-node-2) 적용
vrrp_script check_rke2_script {
    script "/etc/keepalived/check_rke2.sh"  # 절대 경로 지정
    interval 10 # 10초마다 체크
    weight -30  # RKE2가 죽으면 priority 낮춰서 VIP 반납
}
vrrp_instance VI_1 {
    state BACKUP
    interface eno1                 # 네트워크 인터페이스
    virtual_router_id 51           # VRRP 그룹 ID
    priority 90                    # 우선순위 지정
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass locate-cluster
    }
    virtual_ipaddress {
        172.16.0.42
    }
    track_script {
        check_rke2_script  # RKE2 상태 감지 스크립트 연결
    }
}

# -----------------------------------------------------------------------------
# 172.16.0.3. (cluster-node-3)
vrrp_script check_rke2_script {
    script "/etc/keepalived/check_rke2.sh"  # 절대 경로 지정
    interval 10 # 10초마다 체크
    weight -30 # RKE2가 죽으면 priority 낮춰서 VIP 반납
}
vrrp_instance VI_1 {
    state BACKUP
    interface eno1                 # 네트워크 인터페이스
    virtual_router_id 51           # VRRP 그룹 ID
    priority 80                    # 우선순위 지정
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass locate-cluster
    }
    virtual_ipaddress {
        172.16.0.42
    }
    track_script {
        check_rke2_script  # RKE2 상태 감지 스크립트 연결
    }
}

# 설정 끝

# keepalived 시작
$ sudo systemctl enable keepalived --now

 

 

RKE2 설치 - 모든 노드에 동일하게 적용

관리자 권한으로 실행하여야 합니다.

# 관리자로 로그인 후 모든 노드에 설치해야 함
$ sudo su -
password:
root@cluster-node-1:~# curl -sfL <https://get.rke2.io> --output install.sh && chmod +x install.sh
root@cluster-node-1:~# INSTALL_RKE2_CHANNEL=v1.31.4+rke2r1 ./install.sh
root@cluster-node-1:~# systemctl enable rke2-server

 

 

(단독실행) REK2 사전 실행 - cluster-node-1에서 실행

노드끼리 연결을 위한 토큰을 위해 사전 실행 합니다.

# 제일 처음 설치하는 마스터노드 172.16.0.1(cluster-node-1)에서만 실행
root@cluster-node-1:~# systemctl start rke2-server

# 토큰 확인
root@cluster-node-1:~# cat /var/lib/rancher/rke2/server/node-token

 

 

RKE2 설정 생성 (공통) - 모든 노드에 동일하게 저장

root@cluster-node-1:~# mkdir -p /etc/rancher/rke2/
root@cluster-node-1:~# vi /etc/rancher/rke2/config.yaml

# 설정 파일

# keepalived에서 설정한 VIP
server: https://172.16.0.42:9345

# cluster-node-1에서 cat /var/lib/rancher/rke2/server/node-token 명령 결과 삽입
token:  

tls-san:
  - "172.16.0.1"
  - "172.16.0.2"
  - "172.16.0.3"

disable:
  - rke2-ingress-nginx

# prometheus를 연결하기 위한 설정 
kube-controller-manager-arg:
  - "bind-address=0.0.0.0"

kube-scheduler-arg:
  - "bind-address=0.0.0.0"

etcd-arg:
  - "listen-metrics-urls=http://0.0.0.0:2381"
  
# 설정 끝

 

 

REK2 실행 - 모든 노드에 순차 실행

# cluster-node-2에서 실행
root@cluster-node-2:~# systemctl start rke2-server

# cluster-node-3에서 실행
root@cluster-node-3:~# systemctl start rke2-server

# 제일 처음 설치하는 172.16.0.1(cluster-node-1)는 이미 기동중이므로 재시작
root@cluster-node-1:~#  systemctl restart rke2-server

# 로그 확인
root@cluster-node-1:~# sudo journalctl -u rke2-server -f

 

k8s 관리도구 설정 - cluster-node-1에서 실행

# kubectl 명령 추가
root@cluster-node-1:~# echo 'export PATH=$PATH:/var/lib/rancher/rke2/bin' >> ~/.bashrc
root@cluster-node-1:~# source ~/.bashrc

# kubectl 실행을 위한 인증파일 추가
root@cluster-node-1:~# mkdir ~/.kube
root@cluster-node-1:~# cp /etc/rancher/rke2/rke2.yaml .kube/config

 

설치된 노드 확인

root@cluster-node-1:~# kubectl get nodes -o wide

 


k8s 워커노드 설정 (선택사항 -  추가 노드가 있을 경우) 

워커 노드 에이전트 설치

# curl -sfL <https://get.rke2.io> | INSTALL_RKE2_TYPE="agent" sh -

 

 

마스터 노드 연결을 위한 설정 생성

# mkdir -p /etc/rancher/rke2/
# vi /etc/rancher/rke2/config.yaml

# 설정 시작
server: https://172.16.0.42:9345 # keepalived에서 설정한 VIP
token: K10b... # 마스터노드의 토큰 등록
# 설정 끝

 

 

RKE2 에이전트 서비스 실행 (워커노드 설치)

# systemctl enable rke2-agent.service
# systemctl start rke2-agent.service

 


k8s 설치 확인( 마스터 노드에서 확인)

 

컨트롤 & 워커 노드 확인 - 관리자 권한으로 cluster-node-1에서 실행

root@cluster-node-1:~# kubectl get nodes -o wide
NAME             STATUS   ROLES                       AGE    VERSION          INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
cluster-node-1   Ready    control-plane,etcd,master   135d   v1.31.4+rke2r1   172.16.0.1    <none>        Ubuntu 22.04.5 LTS   5.15.0-134-generic   containerd://1.7.23-k3s2
cluster-node-2   Ready    control-plane,etcd,master   135d   v1.31.4+rke2r1   172.16.0.2    <none>        Ubuntu 22.04.5 LTS   5.15.0-134-generic   containerd://1.7.23-k3s2
cluster-node-3   Ready    control-plane,etcd,master   135d   v1.31.4+rke2r1   172.16.0.3    <none>        Ubuntu 22.04.5 LTS   5.15.0-134-generic   containerd://1.7.23-k3s2

 

 

k8s 필수 요소 설치 확인

root@cluster-node-1:~# kubectl get pods -A
NAMESPACE     NAME                                                   READY   STATUS      RESTARTS   AGE
kube-system   cloud-controller-manager-cluster89                     1/1     Running     0          2d11h
kube-system   etcd-cluster89                                         1/1     Running     0          2d11h
kube-system   helm-install-rke2-canal-zphfl                          0/1     Completed   0          2d11h
kube-system   helm-install-rke2-coredns-mvrkg                        0/1     Completed   0          2d11h
kube-system   helm-install-rke2-metrics-server-92g5t                 0/1     Completed   0          2d11h
kube-system   helm-install-rke2-snapshot-controller-crd-qmqpk        0/1     Completed   0          2d11h
kube-system   helm-install-rke2-snapshot-controller-qbks8            0/1     Completed   1          2d11h
kube-system   helm-install-rke2-snapshot-validation-webhook-qkt58    0/1     Completed   0          2d11h
kube-system   kube-apiserver-cluster89                               1/1     Running     0          2d11h
kube-system   kube-controller-manager-cluster89                      1/1     Running     0          2d11h
kube-system   kube-proxy-cluster84                                   1/1     Running     0          19m
kube-system   kube-proxy-cluster85                                   1/1     Running     0          19m
kube-system   kube-proxy-cluster89                                   1/1     Running     0          2d11h
kube-system   kube-scheduler-cluster89                               1/1     Running     0          2d11h
kube-system   rke2-canal-9fzvq                                       2/2     Running     0          19m
kube-system   rke2-canal-tcqhq                                       2/2     Running     0          2d11h
kube-system   rke2-canal-zgzfz                                       2/2     Running     0          19m
kube-system   rke2-coredns-rke2-coredns-867d6d5c55-jh79z             1/1     Running     0          19m
kube-system   rke2-coredns-rke2-coredns-867d6d5c55-x9qbt             1/1     Running     0          2d11h
kube-system   rke2-coredns-rke2-coredns-autoscaler-54cfb678f-ttdwb   1/1     Running     0          2d11h
kube-system   rke2-metrics-server-75866c5bb5-88629                   1/1     Running     0          2d11h
kube-system   rke2-snapshot-controller-577cdd5b98-cq774              1/1     Running     0          2d11h
kube-system   rke2-snapshot-validation-webhook-855f5f7d76-4d2n8      1/1     Running     0          2d11h