지난 포스팅에서 쿠버네티스를 위한 환경 세팅을 수행했었다. 이번 포스팅에서는 본격적으로 쿠버네티스를 설치하고 그 개념들을 알아보려한다.
🌟 대규모 클러스터 환경에서 컨테이너화된 애플리케이션을 자동으로 배포하고 확장, 관리하는 데 필요한 여러 가지 요소들을 자동화하는 오픈소스 플랫폼
개발자가 컨테이너 환경으로 애플리케이션을 만들면 쿠버네티스로 여러 대의 서버로 구성된 클러스터 환경에 해당 프로그램을 편리하고 안정적으로 배포할 수 있다.
쿠버네티스는 사용자 부하에 따라 자동으로 애플리케이션과 서버의 규모를 확장할 수 있고, 네트워크, 스토리지, 모니터링 등 시스템 운영에 필수적인 여러 컴포넌트를 편리하게 구축, 관리할 수 있다.
Kubespray를 이용해 3개의 노드로 구성된 클러스터를 구축하려한다. 지난 포스팅에서 만들어 둔 온프레미스 테스트 환경에서 쿠버네티스를 설치하고 여러 원격 클러스터를 관리하는 방법을 사용하였다.
- 깃허브 저장소에서 Kubespray 소스 내려받기
준비한 3대의 가상 머신 중 1번 노드(ubun-01)에 접속한 후 git clone
$ ssh ubun-01
$ git clone https://github.com/kubernetes-sigs/kubespray.git
$ ls
kubespray
- 앤서블, Jinja 등 필수 모듈 설치. 이 때 굉장히 많은 오류를 경험했다. 책에서는 python 버전이 3.8인데 최신 버전과 충돌되는 부분들이 많아 3.9버전으로 설치하는 과정을 서술했다.
$ sudo apt update && sudo apt upgrade -y
$ sudo apt install -y python3.9
#python3.9 기반의 pip3 설치
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ python3.9 get-pip.py
# 모듈 설치
$ cd kubespray
$ python3.9 -m pip install -r requirements.txt
- 앤서블 인벤토리 파일에 클러스터 노드 정보를 등록하고 상세 설치 옵션을 수정
#쿠버네티스가 설치될 경로 준비
$ cp -rfp inventory/sample/ inventory/mycluster
# kubespray 노드 정보가 담긴 hosts.yml 파일 생성
$ vi inventory/mycluster/hosts.yml
all:
hosts:
ubun-01:
ansible_host: ubun-01
ubun-02:
ansible_host: ubun-02
ubun-03:
ansible_host: ubun-03
children:
kube_control_plane:
hosts:
ubun-01:
ubun-02:
ubun-03:
kube_node:
hosts:
ubun-01:
ubun-02:
ubun-03:
etcd:
hosts:
ubun-01:
ubun-02:
ubun-03:
k8s_cluster:
children:
kube_control_plane:
kube_node:
calico_rr:
calico_rr:
hosts: {}
# 쿠버네티스 설치 관련 옵션 수정
$ vi ./inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
…
# MetalLB 설정 - 쿠버네티스 로드밸런서 용도로 MetalLB를 사용하기 위한 설정
kube_proxy_strict_arp: true
…
# 컨테이너 런타임 설정 - 컨테이너 런타임 설정이 'containerd'인지 확인
container_manager: containerd
…
# 클러스터 감사 로그 설정 - 피드의 생성과 삭제와 같은 로그를 활성화
kubernetes_audit: true
…
- 쿠버네티스 클러스터 설치
아래의 명령어를 치면 10분애서 30분정도 소요된다.
$ ansible-playbook -i ./inventory/mycluster/hosts.yml --become --become-user=root -K -v cluster.yml
필자의 경우 설치 중에 2번 노드와 3번 노드가 중간에 멈춰서 다시 설치했다. 클러스터를 리셋하고 2번과 3번에서 안 멈추게
ping 8.8.8.8
을 입력해 연결이 끊기지 않게 했다.
ansible-playbook -i ./inventory/mycluster/hosts.yml --become --become-user=root -K -v reset.yml
- 설치 확인
root 계정으로 실행하여 현재 클러스터의 노드 정보를 확인한다.
# kubectl 명령어는 root 계정으로 실행
$ sudo bash
# 다음 명령으로 현재 클러스터의 노드 정보를 확인
root# kubectl get nodes -o wide
위와 같이 출력되면 정상적으로 설치가 된 것이다. 이 클러스터는 3대의 control-plane(마스터) 노드로 구성됐다. 이제 추가로 로컬호스트에서 원격 쿠버네티스를 관리하려한다.
- kubectl 설치
쿠버네티스 명령어 실행 도구인 kubectl을 설치해야하는데 iterm2를 이용해 설치를 진행했다.
https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-macos/
이 공식 문서를 참조해 설치를 진행했다.
# 다운로드
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/arm64/kubectl"
# kubectl 바이너리를 실행 가능
$ chmod +x ./kubectl
# kubectl 바이너리를 시스템 PATH 의 파일 위치로 옮긴다.
$ sudo mv ./kubectl /usr/local/bin/kubectl
$ sudo chown root: /usr/local/bin/kubectl
$ kubectl version --client
- 원격 클러스터 정보를 kubeconfig 파일에 등록
쿠버네티스는 원격 클러스터의 API 서버 통신에 필요한 인증 정보를 kubeconfig($HOME)/.kube/config) 파일에서 관리한다. 이 파일에 원격 클러스터의 관리에 필요한 인증 정보가 저장 되어 이 정보를 로컬에 옮기려한다.
노드 1에 접속해 루트 계정으로 들어가 확인 후 복사 해놓는다.
$ ssh ubun-01
$ sudo bash
root@ubun-01:/home/jun# cat /root/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: 생략
server: https://127.0.0.1:6443
name: cluster.local
contexts:
- context:
cluster: cluster.local
user: kubernetes-admin
name: kubernetes-admin@cluster.local
current-context: kubernetes-admin@cluster.local
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: 생략
client-key-data: 생략
- 위 정보를 이용해서 로컬호스트에서
${HOME}/.kube/config
파일을 생성하고 앞에서 확인 한 파일을 그대로 복사해 서버 IP, 클러스터, 사용자, context이름을 변경해준다.
$ mkdir ~/.kube
$ vi ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: 생략
server: https://ubun-01:6443 #원격 서버 IP 정보
name: ubun-01 #임의의 클러스터 이름
contexts:
- context:
cluster: ubun-01 #임의의 클러스터 이름
user: ubun-01 #임의의 사용자 이름
name: ubun-01 #임의의 context 이름
current-context: ubun-01 #임의의 현재 context 이름
kind: Config
preferences: {}
users:
- name: ubun-01 #임의의 사용자 이름
user:
client-certificate-data: 생략
client-key-data: 생략
- 확인
$ kubectl get nodes
가상머신 설치부터 쿠버네티스 설치까지 거의 5일정도 소요된 것 같다. 그 과정에서 수많은 오류를 경험했던게 그 구조를 이해하는 데 더 도움을 준 것 같다. 이 과정을 여러번 거치면서 이제는 보다 수월하게 설치를 할 수 있을 것 같다.
참고문헌
이정훈, '24단계 실습으로 정복하는 쿠버네티스', 위키북스, 2022
쿠버네티스, https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-macos/