ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [K8S][폐쇄망]Kubespray로 Kubernetes 설치하기 - CentOS7/Rocky8
    Kubernetes 2025. 3. 20. 20:08

    설치 환경

    • OS : Rocky8.9
    • Kubernetes : v1.27.7
    • Kubespray : v2.23
      • ansible-core : v2.12.5
      • docker : v20.10
      • Kubernetes 설치 최소 버전 : v1.25
      • Python 필요 버전 : v3.9 - v3.11

     

     

    설치 파일

    설치 디렉토리 (ex. install/)에 필요 파일들 준비

    (GPU를 사용하지 않는다면 epel.tar.gz 파일을 제외해도 Kubernetes 설치에는 문제가 없습니다.)

    [K8S][폐쇄망] Kubespray 폐쇄망 설치 파일 준비하기

    [CentOS7/Rocky8] local-repo + docker-ce repo 생성하기

    https://www.python.org/downloads/

    install/

    🤐 kubespray_cache_2.23.0.tgz
    🤐 kubespray-2.23.0.tgz
    🤐 k9s_Linux_amd64.tar.gz
    🤐 Python-3.10.12.tgz

    📁 repo
      ㄴoffline-files.tar.gz
      ㄴ📁 repos

           ㄴ🤐 docker-ce.tar.gz
           ㄴ🤐 baseos.tar.gz
           ㄴ🤐 appstream.tar.gz
           ㄴ🤐 epel.tar.gz              
           ㄴ📄 docker-ce.repo
           ㄴ📄 rocky8.repo

    📁 pip
      ㄴ📁 kubespray
            ㄴ🤐 ansible-5.7.1.tar.gz
            ㄴ🤐 ansible-core-2.12.5.tar.gz
            ㄴ📄 ansible 필요 패키지들.whl
      ㄴ📁 virtualenv
            ㄴ📄 virtualenv 패키지들.whl

     

     

     

    환경 설정

    • 방화벽 및 SELINUX 끄기 (모든 노드에 설정)
    # 방화벽
    systemctl disable firewalld
    
    # swapoff
    swapoff -a
    
    # SELINUX off
    vi /etc/sysconfig/selinux
    '''
    SELINUX=disabled
    '''
    
    reboot

     

     

    Repo 설정) 1. python 설치하기

    • install/repo → tar 파일들 모두 압축 해제
    cd repo
    tar xvf offline-files.tar.gz
    
    cd repos
    # 현재 폴더에 tar파일 한번에 압축 해제 명령어
    find . -name '*.tar.gz' -exec tar xvf {} \;

     

     

    • yum repository 설정
      • baseurl → 폴더 경로 입력
    # nvidia-docker.repo
    baseurl= file:///root/install/repo/repos/libnvidia-container
    baseurl= file:///root/install/repo/repos/nvidia-container-runtime
    baseurl= file:///root/install/repo/repos/nvidia-docker
    
    # rocky8.repo
    baseurl= file:///root/install/repo/repos/appstream/
    baseurl= file:///root/install/repo/repos/baseos/
    baseurl= file:///root/install/repo/repos/epel/

     

     

    • /etc/yum.repos.d에 있는 기존 Centos.repo 파일들 backup 폴더로 이동
    mkdir -p /etc/yum.repos.d/backup
    mv /etc/yum.repos.d/Rocky-* /etc/yum.repos.d/backup/

     

     

    • yum.repos.d/에 있는 .repo 파일들 /etc/yum.repos.d로 복사
    cp docker-ce.repo nvidia-docker.repo rocky8.repo /etc/yum.repos.d/

     

     

    • python 3.10 설치
    # 필요 패키지 설치
    yum install -y curl gcc openssl-devel bzip2-devel libffi-devel zlib-devel tar wget make
    
    # 압축해제 및 폴더 이동
    tar xvf Python-3.10.12.tgz
    cd Python-3.10.12
    
    # 빌드 및 컴파일
    ./configure --enable-optimizations
    make altinstall
    
    # 심볼릭 링크 설정
    ln -s /usr/local/bin/python3.10 /usr/bin/python3
    ln -s /usr/local/bin/pip3.10 /usr/bin/pip3
    
    # 확인
    python3 --version

     

     

    Repo 설정) 2. local-repo를 webserver로 띄워서 사용하기

    • /etc/yum.repo.d/ 경로에 .repo파일 수정 (모든 노드에 설정)
    # docker-ce.repo
    baseurl= http://{Master IP}:50000/repos/docker-ce
     
    # nvidia-docker.repo
    baseurl= http://{Master IP}:50000/repos/libnvidia-container
    baseurl= http://{Master IP}:50000/repos/nvidia-container-runtime
    baseurl= http://{Master IP}:50000/repos/nvidia-docker
    
    # rocky8.repo
    baseurl= http://{Master IP}:50000/repos/appstream
    baseurl= http://{Master IP}:50000/repos/baseos
    baseurl= http://{Master IP}:50000/repos/epel

     

     

    • local-repo 파일이 있는 디렉토리에서 다음 명령어 실행 (/repos의 상위폴더 = /repo)
    cd repo
    python3 -m http.server 50000 &

     

     

    • repo webserver 접속 확인
      • http://IP:PORT

     

     

     

     

    Kubernetes 설치

    • /tmp 디렉토리에 kubespray_cache.tgz 파일 풀기
    tar xvf kubespray_cache_2.23.0.tgz -C /tmp

     

     

    • kubespray 압축해제 및 이동
    tar xvf kubespray-2.23.0.tgz
    
    cd kubespray-2.23.0/

     

     

    • 필수 패키지 설치
    yum install -y sshpass

     

     

    • +) Roky8에서는 kubespray 실행 중 runc 패키지 충돌 에러가 발생할 수 있다...! 미리 제거
    yum remove runc

     

     

    • virtualenv 설치
    # 오프라인 설치 명령 --no-index -f [파일 찾을 경로] [찾을 파일]
    pip3 install --no-index -f /root/install/pip/virtualenv virtualenv

     

     

    • virtualenv 생성 및 활성화
    # 생성
    virtualenv  --python=$(which python3) kubespray-venv
    
    # 활성화
    source kubespray-venv/bin/activate
    
    ### 비활성화 시 deactivate

     

     

    • ansible 설치
    pip3 install -U --no-index -f /root/install/pip/kubespray pip
    pip3 install -U --no-index -f /root/install/pip/kubespray -r /root/install/kubespray-2.23/requirements.txt

     

     

    • inventory 폴더 복사 및 스크립트 실행
      • IP : 구성할 노드 ip (ex. 192.168.0.100 192.168.0.101 192.168.0.102)
      • HOST_PREFIX : hosts명
      • KUBE_CONTROL_HOSTS : Master 갯수
      • CONFIG_FILE : 설정할 hosts.yaml 파일 경로
    # 복사
    cp -rfp inventory/sample inventory/mycluster
    
    # 환경변수 지정 및 스크립트 실행
    # Update Ansible inventory file with inventory builder
    # declare -a IPS=(Master_IP Node1_IP Node2_IP)
    declare -a IPS=(IP)
    HOST_PREFIX=test KUBE_CONTROL_HOSTS=1 CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}

     

     

    • hosts.yaml 파일 수정
      • vars : 모든 hosts에 공통변수 작성 (공통변수가 아닐 경우 hosts아래에 개별 작성)
      • ansible_user : 앤서블 실행 유저
      • ansible_password : 실행 유저 비밀번호
      • ansible_become_password: root계정 비밀번호
      • master, etcd는 홀수로 구성
    all:
      vars:
        ansible_user: 'root'
        ansible_password: 1234
        ansible_become_password: 1234
      hosts:
        master-name:
          ansible_host: {Master_IP}
          ip: {Master_IP}
          access_ip: {Master_IP}
        node1-name:
          ansible_host: {Node1_IP}
          ip: {Node1_IP}
          access_ip: {Node1_IP}
        node2-name:
          ansible_host: {Node2_IP}
          ip: {Node2_IP}
          access_ip: {Node2_IP}
      children:
        kube_control_plane:
          hosts:
            master-name:
        kube_node:
          hosts:
            master-name:
            node1-name:
            node2-name:
        etcd:
          hosts:
            master-name:
        k8s_cluster:
          children:
            kube_control_plane:
            kube_node:
        calico_rr:
          hosts: {}

     

     

    • +) pem키 사용 방법
      • ansible_ssh_private_key_file : pem 키 경로
    all:
      vars:
        ansible_user: "centos"
        ansible_ssh_private_key_file: '/home/centos/test.pem'

     

     

    • +) label 추가
      • hosts.yaml에서 전체(vars에 기재) 또는 개별로 node label 부여 가능
        node1-name:
          ansible_host: {Node1_IP}
          ip: {Node1_IP}
          access_ip: {Node1_IP}
          node_labels:
            nodetype: 'worker'
        node2-name:
          ansible_host: {Node2_IP}
          ip: {Node2_IP}
          access_ip: {Node2_IP}
          node_labels:
            gputype: 'V100'

     

     

    • inventory/mycluster/group_vars/all/offline.yml 파일 수정
    files_repo: "http://{Master 1번 IP}:50000/offline-files"
    ### If using CentOS, RedHat, AlmaLinux or Fedora
    yum_repo: "http://{Master 1번 IP}:50000/repos"
    
    rhel_enable_repos: false
    ### Docker / Containerd
    docker_rh_repo_base_url: "{{ yum_repo }}/docker-ce"
    docker_rh_repo_gpgkey: ""
    
    # {files_repo} 포함하는 부분 전부 주석 해제!!!

     

     

    • 설치 (cluster.yml 파일이 위치한 kubespray 디렉토리 안에서 명령어 실행)
      • ansible-playbook : ansible 실행 명령어
      • -i 경로 : hosts파일 경로 지정 
      • --become  : root 권한으로 수행
      • cluster.yml : kubernetes 배포 yml
    ansible-playbook -i inventory/mycluster/hosts.yaml  --become cluster.yml

     

     

    • 설치 확인
    # 노드 확인
    kubectl get nodes
    
    # 모든 파드 확인
    kubectl get pod -A

Designed by Tistory.