Node 를 추가하는 방법

작성자 이경미 수정일 2022-12-16 16:11

#SparklingSoDA, #BakingSoDA, #TwinDoc, #TwinReader, #스파클링소다

아티클 관련 제품: SparklingSoDA

목록


이 글을 읽으면

  • 제품에 node 를 추가하는 방법에 대하여 알 수 있습니다. 



사전 작업 및 준비

  • 새로운 Node 에 제품 설치 파일이 준비되어야 합니다.
  • Image 들이 구성되는 Directory 가 준비되어야 합니다.
    sudo mkdir -p /k8s_images/docker 
    sudo mkdir -p /k8s_images/k8s 
    sudo chown -R <USER ID>:<USER GROUP> /k8s_images 


내용

ADD SparklingSoDA repo

  1. 패키지 설치를 위한 Local Yum Repository를 설정합니다.
    sudo vi /etc/yum.repos.d/sodaflow.repo 

    sodaflow.repo 에 다음과 같이 입력합니다. 

    [sodaflow] 
    name=sodaflow repo 
    baseurl=file:///<SETUP_HOME>/etc/localrepo/sodaflow 
    enable=1 
    gpgcheck=0 
    <SETUP_HOME> 은 설치파일이 존재하는 위치를 뜻합니다. 


  2. 설정한 repo 를 확인합니다. 
    불필요한 디스크 공간을 정리하고, 모든 파일을 삭제하기 위해 다음 명령어를 실행합니다. 
    sudo yum clean all 
    repository 설정을 위해 다음 명령어를 입력합니다. 
    sudo yum repolist 
    아래와 같이 추가된 repository 를 확인할 수 있습니다. 
    sudo yum repolist
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
    Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was
    14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"
    Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=extras&infra=stock error was
    14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"
    Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=updates&infra=stock error was
    14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"
     * base: mirror.navercorp.com
     * epel: mirrors.bfsu.edu.cn
     * extras: mirror.navercorp.com
     * updates: mirror.navercorp.com
    repo id                                                                             repo name                                                                                                        status
    !base/7/x86_64                                                                      CentOS-7 - Base                                                                                                  10,072
    !epel/x86_64                                                                        Extra Packages for Enterprise Linux 7 - x86_64                                                                   13,756
    !extras/7/x86_64                                                                    CentOS-7 - Extras                                                                                                   516
    !sodaflow                                                                           sodaflow repo                                                                                                        15
    !updates/7/x86_64                                                                   CentOS-7 - Updates                                                                                                4,160
    repolist: 28,519

Install Docker

  1. Install RPM
    docker 설치 파일은 제품 설치 파일에 포함되어있습니다.
    docker 패키지 설치를 위한 rpm 을 설치합니다.
    cd <SETUP_HOME>/etc/localrepo/docker 

    Total size: 592 k 
Installed size: 592 k 
Downloading packages: 
Running transaction check 
Runnin transaction test 
ITransact ion test succeeded 
Runn ing transact ton 
Install ing 
Install ing 
Install ing 
Install ing 
Ver ify ing 
Verify ing 
Verify ing 
Ver ify ing 
Installed: 
Complete ! 
fuse3-1ibs-3.6.1-4.e17. x86 64 
. fuse-overlayfs-0.7.2-6.e17 8. x86 64 
: 2:container-seIinux-2.74-1.e17 .noarch 
2:container-se1 inux-2.74-1. e17 .noarch 
fuse-overlayfs-Ø.7.2-6. et7_8. x86_64 
. fuse3-libs-3.6.1-4.e17.x86 64 
container-selinux.noarch 2:2.74-1.e17 
fuse-overlayfs.x86_64

  2. Install Docker
    sudo yum install -y docker-ce 


  3. Confirm Docker Version
    docker --version
    Docker version 20.10.7, build f0df350

  4. Setting Docker
    sudo vi /etc/docker/daemon.json 

    GPU 유무에 따라 daemon.json 의 작성이 달라집니다.

    - GPU 가 포함된 node

    {
        "log-opts": {
            "max-size": "10m",
            "max-file": "5"
        },
        "data-root": "/k8s_images/docker",
        "exec-opts": ["native.cgroupdriver=cgroupfs"],
        "storage-driver": "overlay2",
        "insecure-registries": ["hub.sparklingsoda.io:80", "devainexus:80"],
        "default-runtime": "nvidia",
        "runtimes": {
            "nvidia": {
                "path": "nvidia-container-runtime",
                "runtimeArgs": []
            }
        }
    }


    - GPU 가 포함되지 않은 node

    {
        "log-opts": {
            "max-size": "10m",
            "max-file": "5"
        },
        "data-root": "/k8s_images/docker",
        "exec-opts": ["native.cgroupdriver=cgroupfs"],
        "storage-driver": "overlay2",
        "insecure-registries": ["hub.sparklingsoda.io:80", "devainexus:80"]
    }


  5. Start Docker
    sudo systemctl daemon-reload 
    sudo systemctl enable docker 
    sudo systemctl start docker 


  6. Build Docker Image
    제품을 사용하기 위한 image 파일을 build 합니다.
    cd <SETUP_HOME>/etc/k8s_images 
    bash ./load_k8s_images.sh 


    build 한 image 를 확인합니다. 

    sudo docker images
    REPOSITORY                                                         TAG              IMAGE ID       CREATED         SIZE
    spsd.docker.io:15001/nexus3                                        3.29.2           879ce3886011   10 months ago   629MB
    spsd.docker.io:15001/kube-proxy                                    v1.18.19         a5cae4db9292   16 months ago   117MB
    spsd.docker.io:15001/kube-apiserver                                v1.18.19         d26f380d3e93   16 months ago   173MB
    spsd.docker.io:15001/kube-controller-manager                       v1.18.19         4b0bf89255ad   16 months ago   162MB
    spsd.docker.io:15001/kube-scheduler                                v1.18.19         916efc2e1cec   16 months ago   96.1MB
    spsd.docker.io:15001/calico/node                                   v3.19.0          b0744cc52c19   16 months ago   153MB
    spsd.docker.io:15001/calico/pod2daemon-flexvol                     v3.19.0          a5decf77918d   16 months ago   21.7MB
    spsd.docker.io:15001/calico/cni                                    v3.19.0          3d17cd6307a4   16 months ago   146MB
    spsd.docker.io:15001/calico/kube-controllers                       v3.19.0          c51610d08fdf   16 months ago   60.6MB
    spsd.docker.io:15001/k8s-artifacts-prod/ingress-nginx/controller   v0.34.1          6fb0739a741f   2 years ago     329MB
    spsd.docker.io:15001/pause                                         3.2              80d28bedfe5d   2 years ago     683kB
    spsd.docker.io:15001/coredns                                       1.6.7            67da37a9a360   2 years ago     43.8MB
    spsd.docker.io:15001/etcd                                          3.4.3-0          303ce5db0e90   2 years ago     288MB
    spsd.docker.io:15001/docker                                        18.09            074f1687a41c   3 years ago     192MB
    spsd.docker.io:15001/defaultbackend-amd64                          1.5              b5af743e5984   3 years ago     5.13MB
    spsd.docker.io:15001/external_storage/nfs-client-provisioner       v3.1.0-k8s1.11   16d2f904b0d8   4 years ago     45.5MB

Install Kubernetes

  1. Install RPM
    Kubernetes 설치 파일은 제품 설치 파일에 포함되어있습니다.
    Kubernetes 패키지 설치를 위한 rpm 을 설치합니다.
    cd <SETUP_HOME>/etc/localrepo/k8s 
    sudo yum install -y *.rpm 

    Total 
Running transaction check 
Runn Inq_vgpygction test 
Transaction test succeeded 
Running transaction 
Installing 
Install ing 
Install ing 
Install Ing 
Install Lng 
Install ing 
Verifying 
Verifying 
Verifying 
verifying 
Ver ifying 
Ver ifying 
Installed: 
: 1 ibnetfi1ter_cthe1per-1.O.0-11.e17.x86 64 
: libnetfilter cttüneout-1.O.Ø-7.e17.x86 64 
: 64 
. conntrack-t001s-1.4.4-7.e17.x86 64 
. socat-1.7.3.2-2.e17.x86 64 
: cri-tooIs-1.13.9-9.x86 64 
. conntrack-t001s-1.4.4-7.e17.x86 64 
: cri-t001s-1.13.9-9.x86 64 
: libnetfilter cttüneout-1.Ø.Ø-7.e17.x86 64 
: socat-1.7.3.2-2.e17.x86 64 
: Iibnetfilter_ctheIper-1.O.0-11.e17.x86 64 
conntrack-toots.x86 64 0:1.4 
Dependency Installed: 
1 ibnetfilter cthetper.x86_64 
C(MnDlete ! 
-7. 
o:1.o.o-11.e17 
cri-t001s.x86 64 0: 1.13.Ø-9 
Iibnetfilter cttüneout.x86 64 0:1.O.O-7.e17


  2. Install K8s
    sudo yum install -y kubelet-1.18.19-0 kubeadm-1.18.19-0 kubectl-1.18.19-0 


  3. Confirm K8s Version
    kubelet --version 
    Kubernetes v1.18.19
    kubectl version 
    Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.19", GitCommit:"ac0cc736d0018d817c763083945e4db863168d12", GitTreeState:"clean", BuildDate:"2021-05-12T11:29:07Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}
    Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.19", GitCommit:"ac0cc736d0018d817c763083945e4db863168d12", GitTreeState:"clean", BuildDate:"2021-05-12T11:21:54Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}
    kubeadm version 
    kubeadm version: &version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.19", GitCommit:"ac0cc736d0018d817c763083945e4db863168d12", GitTreeState:"clean", BuildDate:"2021-05-12T11:26:59Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}

  4. Setting K8s
    sudo vi /etc/sysconfig/kubelet 

    아래와 같이 추가합니다. 

    KUBELET_EXTRA_ARGS=--root-dir="/k8s_images/k8s" 


  5. Enable Kubelet
    sudo systemctl enable kubelet


환경 설정

kubernetes 의 정상적인 작동을 위해서 설정하는 부분입니다. 

  1. /etc/hosts
    : 모든 서버에서 추가되는 node 의 정보를 작성합니다.
    sudo vi /etc/hosts

    /etc/hosts 에 node 정보를 입력한 뒤 :wq 를 이용하여 저장합니다. 

    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    
    <<master1 IP Address>> master1
    <<worker1 IP Address>> worker1
    <<worker1 IP Address>> worker2
    <<master1 IP Address>> hub.sparklingsoda.io
    <<master1 IP Address>> devainexus 
    
    

  2. Disabled SELINUX
    sudo setenforce 0 
    sudo sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config 
    cat /etc/selinux/config 

  3. Swap Off
    sudo swapoff -a 
    sudo sed -i "s/^.*swap.*$/#\0/" /etc/fstab 
    sudo modprobe rbd 

  4. Disabled firewalld
    sudo systemctl stop firewalld 
    sudo systemctl disable firewalld 
    sudo systemctl status firewalld 

  5. Setting Iptables
    sudo vi /etc/sysctl.d/k8s.conf 

    k8s.conf 에 iptable 정보를 입력 후 :wq 를 이용하여 저장합니다. 

    net.bridge.bridge-nf-call-ip6tables=1 
    net.bridge.bridge-nf-call-iptables=1 
    net.ipv4.ip_forward=1 

    설정한 작업을 적용합니다. 

    sudo sysctl –system 

Join

join 을 위해서는 대표 master 에 기록된 token.txt 를 활용합니다. 

token 이 없는 경우에는 새로 발급받은 후 진행합니다. 

master node 와 worker node 는 join 하는 key 가 다르기 때문에 추가되는 node 의 용도를 파악한 뒤 진행합니다. 


Join Master

  • token 발급
    대표 master 에서 진행합니다. 
    1. certificate key 발급 
    sudo kubeadm init phase upload-certs --upload-certs
    [upload-certs] Using certificate key: a67776a6280eb84743a28229cb78f2ca40fe85c365f5071156b2d55dd1222732


    2. Join 명령어 생성
    sudo kubeadm token create --print-join-command
    kubeadm join 10.1.1.245:6443 --token 4cdcf6.njpveoooh7q7m834     --discovery-token-ca-cert-hash sha256:169aa2dbf9a1eb643e99a34b60ac2a57386d22dc51d92c16e826f3355a38dfde


  • Join
    추가한 node 에서 진행합니다.
    sudo kubeadm join 10.1.1.245:6443 --token 4cdcf6.njpveoooh7q7m834     --discovery-token-ca-cert-hash sha256:169aa2dbf9a1eb643e99a34b60ac2a57386d22dc51d92c16e826f3355a38dfde --control-plane --certificate-key a67776a6280eb84743a28229cb78f2ca40fe85c365f5071156b2d55dd1222732


Join Worker

  • token 발급
    대표 master 에서 진행합니다. 
    sudo kubeadm token create --print-join-command
    kubeadm join 10.1.1.245:6443 --token 4cdcf6.njpveoooh7q7m834     --discovery-token-ca-cert-hash sha256:169aa2dbf9a1eb643e99a34b60ac2a57386d22dc51d92c16e826f3355a38dfde


  • Join
    추가한 node 에서 진행합니다. 
    sudo kubeadm join 10.1.1.245:6443 --token 4cdcf6.njpveoooh7q7m834     --discovery-token-ca-cert-hash sha256:169aa2dbf9a1eb643e99a34b60ac2a57386d22dc51d92c16e826f3355a38dfde --control-plane --certificate-key a67776a6280eb84743a28229cb78f2ca40fe85c365f5071156b2d55dd1222732



추가된 node 확인

추가된 node 는 모든 master node 에서 확인할 수 있습니다.

kubectl get nodes
NAME      STATUS   ROLES    AGE   VERSION
master1   Ready    master   69d   v1.18.19
worker1   Ready    <none>   33d   v1.18.19
worker2   Ready    <none>   69d   v1.18.19


Create NameSpace

: 추가한 node 에 

kubectl create namespace sodaflow
kubectl config set-context sodaflow --namespace=sodaflow --cluster=kubernetes --user=kubernetes-admin
kubectl config use-context sodaflow


Set Node Label

: pod scheduling 을 위해 sodaflow 에서 제공하는 shell 을 실행합니다. 

cd <SETUP_HOME>/setup/envs.sh
vi envs.sh

설치 시 대표 master node 에서 작업합니다. (SETUP FILE 이 있는 master node)

추가된 node 의 정보를 입력한 뒤 :wq 를 이용하여 저장합니다.

#!/bin/bash

K8S_LIB_PATH="/k8s_images/k8s"

NFS_HOST_VOL=false
NFS_VERSION=v4
NFS_SERVER=<nfs_server>
NFS_PATH=<nfs_path>
EXTERNAL_IPS="<external_IP>"
SODAFLOW_DNS_NAME="<UI_Domain>"
SODAFLOW_MASTER_NODES="master1"
SODAFLOW_WORKER_NODES="worker1 worker2"
SODAFLOW_PROXY_NODES="master1 worker1 worker2"
SODAFLOW_GPU_NODES="<GPU NODE 작성>"

envs.sh 을 이용하여 label 을 생성합니다. 

다음 set_node_label.sh 을 실행합니다. 

bash set_node_label.sh
kubectl get nodes --show-labels

아티클이 유용했나요?

훌륭합니다!

피드백을 제공해 주셔서 감사합니다.

도움이 되지 못해 죄송합니다!

피드백을 제공해 주셔서 감사합니다.

아티클을 개선할 수 있는 방법을 알려주세요!

최소 하나의 이유를 선택하세요
CAPTCHA 확인이 필요합니다.

피드백 전송

소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.

02-558-8300