아티클 관련 제품: 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
- 패키지 설치를 위한 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> 은 설치파일이 존재하는 위치를 뜻합니다.
- 설정한 repo 를 확인합니다.
불필요한 디스크 공간을 정리하고, 모든 파일을 삭제하기 위해 다음 명령어를 실행합니다.repository 설정을 위해 다음 명령어를 입력합니다.sudo yum clean all
아래와 같이 추가된 repository 를 확인할 수 있습니다.sudo yum repolist
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
- Install RPM
docker 설치 파일은 제품 설치 파일에 포함되어있습니다.
docker 패키지 설치를 위한 rpm 을 설치합니다.cd <SETUP_HOME>/etc/localrepo/docker
- Install Docker
sudo yum install -y docker-ce
- Confirm Docker Version
docker --version Docker version 20.10.7, build f0df350
- 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"] }
- Start Docker
sudo systemctl daemon-reload sudo systemctl enable docker sudo systemctl start docker
- 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
- Install RPM
Kubernetes 설치 파일은 제품 설치 파일에 포함되어있습니다.
Kubernetes 패키지 설치를 위한 rpm 을 설치합니다.cd <SETUP_HOME>/etc/localrepo/k8s sudo yum install -y *.rpm
- Install K8s
sudo yum install -y kubelet-1.18.19-0 kubeadm-1.18.19-0 kubectl-1.18.19-0
- 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"}
- Setting K8s
sudo vi /etc/sysconfig/kubelet
아래와 같이 추가합니다.
KUBELET_EXTRA_ARGS=--root-dir="/k8s_images/k8s"
- Enable Kubelet
sudo systemctl enable kubelet
환경 설정
kubernetes 의 정상적인 작동을 위해서 설정하는 부분입니다.
- /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
- Disabled SELINUX
sudo setenforce 0 sudo sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config cat /etc/selinux/config
- Swap Off
sudo swapoff -a sudo sed -i "s/^.*swap.*$/#\0/" /etc/fstab sudo modprobe rbd
- Disabled firewalld
sudo systemctl stop firewalld sudo systemctl disable firewalld sudo systemctl status firewalld
- 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 발급2. Join 명령어 생성sudo kubeadm init phase upload-certs --upload-certs [upload-certs] Using certificate key: a67776a6280eb84743a28229cb78f2ca40fe85c365f5071156b2d55dd1222732
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
아티클이 유용했나요?
훌륭합니다!
피드백을 제공해 주셔서 감사합니다.
도움이 되지 못해 죄송합니다!
피드백을 제공해 주셔서 감사합니다.
피드백 전송
소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.