HOME
home
Law&Company
home

[Legaltech] Kubernetes구성하기

Kubernetes구성하기

LEGALTECH
BY |  김재민
DATE | 2022. 12. 01.
COMMENT 로앤컴퍼니는 법률사무에 IT기술을 도입해 변호사의 업무효율을 높이고 다양한 법률정보를 인공지능으로 분석한 결과를 변호사에게 제공하기 위한 연구를 지속하고 있습니다. 로앤컴퍼니는 이번 아티클을 통해 Kubernetes와 Airflow를 설치하고 활용하는 여정에 대해 공유하고자 합니다.
안녕하세요. 로앤컴퍼니 법률AI연구소의 MLops 엔지니어 김재민입니다. 이 글은 로앤컴퍼니에서 데이터 파이프라인 구성을 위해 Kubernetes와 Airflow를 설치하고 활용하는 여정에 대해 공유하고자 작성한 글입니다. 저희는 로컬에 있는 서버들을 클러스터로 통합하여 관리하기 위한 도구로 Kubernetes를 사용하고, 일간 배치작업을 수행하고 결과를 보고받기 위한 도구로 Airflow를 사용했습니다. 이 글은 Ubuntu 20.04.4 LTS 에서 작성됐습니다.

Kubernetes

Kubernetes 는 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확장가능한 오픈소스 플랫폼입니다. Kubernetes는 선언적 구성과 자동화를 모두 용이하게 해줍니다. Kubernetes는 크고, 빠르게 성장하는 생태계를 가지고 있습니다.Kubernetes 서비스, 기술 지원 및 도구는 어디서나 쉽게 이용할 수 있습니다.
Kubernetes는 컨테이너 관리를 도와주는 도구입니다. Kubernetes는 노드(서버)들의 상태를 모니터링하고, 적절한 노드에 컨테이너화된 애플리케이션을 실행하도록 지시합니다. 이렇게 실행된 애플리케이션의 상태를 모니터링하고, 만약 애플리케이션의 상태가 정상적이지 않을 시 애플리케이션을 재실행하도록 명령합니다. 따라서 여러 노드가 실행되는 환경이라면 내결함성과 고가용성을 제공할 수 있습니다. Kubernetes 설치 시 위처럼 노드에게 컨테이너화된 애플리케이션을 실행하도록 지시하기 위해 컨테이너 런타임 도구가 필요합니다. 이 글에서는 Containerd를 사용하지만, CRI-O, MCR 등 다른 런타임 도구를 사용해도 괜찮습니다.

컨테이너 런타임 설치

1.
apt 패키지 인덱스를 업데이트하고, 필요한 패키지들을 설치합니다.
$ sudo apt-get update $ sudo apt-get install -y ca-certificates curl gnupg lsb-release
JavaScript
2.
도커의 공식 GPG 키를 등록합니다.
$ sudo mkdir -p /etc/apt/keyrings $ curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
JavaScript
3.
저장소를 설정합니다.
$ echo \\ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] <https://download.docker.com/linux/ubuntu> \\ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
JavaScript
4.
도커를 설치합니다.
$ sudo apt-get update $ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
JavaScript

Kubernetes 설치

Kubernetes는 설치를 돕는 여러가지 도구들이 있습니다. 대표적으로는 kubeadm, kubespray, kops 등이 있습니다. 이 글에서는 kubeadm을 이용하여 설치하는 방법에 관해 설명합니다. 세 가지의 비교에 대해 더 자세히 알고 싶으신 분은 kubespray와 kubeadm, kops를 비교한 글을 읽어주시기를 바랍니다.
kubespray와 kops를 이용하면 설치와 클러스터 구성까지 편하게 도와주지만, 이 글에서 소개하는 kubeadm에서는 사용자가 직접 클러스터 구성을 사용자가 직접 해야 합니다.
1.
apt 패키지를 업데이트하고, 필요한 패키지들을 설치합니다.
$ sudo apt-get update $ sudo apt-get install -y apt-transport-https ca-certificates curl
JavaScript
2.
구글 클라우드의 공개 사이닝 키를 다운로드 받습니다.
$ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg <https://packages.cloud.google.com/apt/doc/apt-key.gpg>
JavaScript
3.
Kubernetes apt 리포지터리를 추가합니다.
$ echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] <https://apt.kubernetes.io/> kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
JavaScript
4.
apt 패키지를 업데이트 하고, kubelet, kubeadm, kubectl을 설치한 후 버전을 고정합니다.
$ sudo apt-get update $ sudo apt-get install -y kubelet kubeadm kubectl $ sudo apt-mark hold kubelet kubeadm kubectl
JavaScript

Kubernetes 클러스터 구성하기

Kubernetes에서 클러스터란 컨테이너 형태의 어플리케이션을 호스팅하는 노드들로 이루어진 집합을 의미합니다. 이 노드들은 크게 두 종류로 구성되는데, 클러스터 내부 요소들을 제어하는 컨트롤 플레인 역할을 담당하는 마스터 노드와 실제 배포하고자 하는 어플리케이션의 실행을 담당하는 워커 노드입니다.

마스터노드 구축하기

1.
kubeadm을 사용해 노드 초기화하기
$ kubeadm init --pod-network-cidr=172.16.0.0/16
Plain Text
2.
네트워크 pod 배포하기
클러스터를 구성하기 위해서는 네트워크 pod를 배포해야 합니다. 이 글에서는 네트워크 pod로 Calico를 사용합니다. 더 많은 네트워크 pod를 알아보시려면 Kuberenetes에서 제공하는 addons 가이드 문서를 확인하시기 바랍니다.
1) tigera-operator설치
kubectl create -f <https://raw.githubusercontent.com/projectcalico/calico/v3.24.2/manifests/tigera-operator.yaml>
JavaScript
2) Custom-resource를 설정하고 Calico 설치
다음 명령어를 사용하여 calico로부터 custom-resources.yaml 파일을 다운로드 받습니다.
curl -O <https://raw.githubusercontent.com/projectcalico/calico/v3.24.5/manifests/custom-resources.yaml>
JavaScript
custom-resources.yaml에서 원하는 부분을 수정하고, calico를 설치합니다. 현재 설치 과정에서는 kubeadm으로 init을 수행할 때 pod-network-cidr을 172.16.0.0/16으로 주었으므로 custom-resources.yaml에서도 cidr을 172.16.0.0/16로 맞춰주어야 합니다. ( kubectl get nodes -o jsonpath='{.items[*].spec}’ 명령어를 사용하여 현재 Kubernetes의 podCIDR을 확인할 수 있습니다. ) 설정을 완료했으면 다음 커맨드로 설치합니다.
kubectl create -f custom-resources.yaml
JavaScript
Troubleshooting
kubectl 관련하여 [ The connection to the server localhost:8080 was refused ] 오류가 난다면 다음 명령어를 시도해보세요.
$ mkdir -p $HOME/.kube $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config $ sudo chown $(id -u):$(id –g) $HOME/.kube/config
JavaScript
Kubernetes의 pod들이 Pending 상태에서 안넘어간다면 다음 명령어를 시도해보세요.
kubectl taint nodes --all node-role.kubernetes.io/control-plane- kubectl taint nodes --all node-role.kubernetes.io/master-
JavaScript

클러스터에 노드 참여하기

위에서 생성된 클러스터에 노드가 참여하기위한 방법입니다. Kubernetes 설치가 완료된 노드에서 진행합니다.
1.
마스터 노드의 정보 확인하기.
클러스터에 노드가 참여하기 위해서는 마스터 노드의 ip, port, token, hash 이렇게 4개의 정보가 필요합니다.
1) token 정보 얻기
a.
토큰 생성하기
$ kubeadm token create
JavaScript
b.
기존에 생성한 토큰 정보 불러오기
$ kubeadm token list
JavaScript
2) hash 정보 얻기
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
JavaScript
2.
마스터 노드에 참여하기
$ kubeadm join [마스터노드 ip]:[port(default 6443)] --token [토큰값] --discovery-token-ca-cert-hash sha256:[hash]
JavaScript

마치며

이번 글에서는 Kubernetes를 이용해 클러스터를 구성하는 방법에 대해 간단히 알아봤습니다. 다음 글에서는 Airflow에 대한 간단한 설명과 이번글에서 생성한 Kubernetes 클러스터에서 Airflow를 실행하는 방법을 소개합니다. 그리고 로앤컴퍼니에서 Airflow를 사용하고 있는 경험에 대해 공유할 예정입니다.


김재민 (AI연구소)

사람들이 시간을 자유롭게 쓰도록 돕고 싶은 개발자입니다. 반복 작업의 자동화를 목표로 하고 있습니다.


리걸테크 Kubernetes 컨테이너관리 AI 클러스터