[Kubernetes] 쿠버네티스 개념과 설치

skybluelion·2024년 1월 5일
1

kubernetes

목록 보기
3/3
post-thumbnail

들어가며

지난 포스팅에서 쿠버네티스를 위한 환경 세팅을 수행했었다. 이번 포스팅에서는 본격적으로 쿠버네티스를 설치하고 그 개념들을 알아보려한다.

쿠버네티스란?

🌟 대규모 클러스터 환경에서 컨테이너화된 애플리케이션을 자동으로 배포하고 확장, 관리하는 데 필요한 여러 가지 요소들을 자동화하는 오픈소스 플랫폼

개발자가 컨테이너 환경으로 애플리케이션을 만들면 쿠버네티스로 여러 대의 서버로 구성된 클러스터 환경에 해당 프로그램을 편리하고 안정적으로 배포할 수 있다.
쿠버네티스는 사용자 부하에 따라 자동으로 애플리케이션과 서버의 규모를 확장할 수 있고, 네트워크, 스토리지, 모니터링 등 시스템 운영에 필수적인 여러 컴포넌트를 편리하게 구축, 관리할 수 있다.

Kubespray

Kubespray를 이용해 3개의 노드로 구성된 클러스터를 구축하려한다. 지난 포스팅에서 만들어 둔 온프레미스 테스트 환경에서 쿠버네티스를 설치하고 여러 원격 클러스터를 관리하는 방법을 사용하였다.

3대의 가상머신으로 구성된 쿠버네티스 클러스터 설치

  1. 깃허브 저장소에서 Kubespray 소스 내려받기
준비한 3대의 가상 머신 중 1번 노드(ubun-01)에 접속한 후 git clone

$ ssh ubun-01

$ git clone https://github.com/kubernetes-sigs/kubespray.git

$ ls
kubespray
  1. 앤서블, 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
  1. 앤서블 인벤토리 파일에 클러스터 노드 정보를 등록하고 상세 설치 옵션을 수정
#쿠버네티스가 설치될 경로 준비
$ 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
  1. 쿠버네티스 클러스터 설치
    아래의 명령어를 치면 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
  1. 설치 확인
    root 계정으로 실행하여 현재 클러스터의 노드 정보를 확인한다.
# kubectl 명령어는 root 계정으로 실행
$ sudo bash

# 다음 명령으로 현재 클러스터의 노드 정보를 확인
root# kubectl get nodes -o wide 

위와 같이 출력되면 정상적으로 설치가 된 것이다. 이 클러스터는 3대의 control-plane(마스터) 노드로 구성됐다. 이제 추가로 로컬호스트에서 원격 쿠버네티스를 관리하려한다.

로컬호스트에서 원격 쿠버네티스 관리하기

  1. 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

  1. 원격 클러스터 정보를 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: 생략
  1. 위 정보를 이용해서 로컬호스트에서 ${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: 생략
  1. 확인
$ kubectl get nodes

마치며

가상머신 설치부터 쿠버네티스 설치까지 거의 5일정도 소요된 것 같다. 그 과정에서 수많은 오류를 경험했던게 그 구조를 이해하는 데 더 도움을 준 것 같다. 이 과정을 여러번 거치면서 이제는 보다 수월하게 설치를 할 수 있을 것 같다.

참고문헌
이정훈, '24단계 실습으로 정복하는 쿠버네티스', 위키북스, 2022
쿠버네티스, https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-macos/

profile
에러란무엇일까

0개의 댓글