주녁, DevNote
article thumbnail

1. 목표

  • Ansible과 Kubespray를 이용해 kubernetes 환경을 구축한다.
  • 추상화된 인프라 구축을 통해 IaC에 대해 이해한다.

2. 여정

2.1. IaC가 뭔가요? 왜 필요한가요?

코드형 인프라(Infrastructure as Code, IaC)는 수동 프로세스가 아닌
코드를 통해 인프라를 관리하고 프로비저닝하는 것을 말합니다.     - redhat 공식문서

왜 IaC가 필요해졌고, 생겼는지 짧게 설명하면 아래와 같다.

 

쿠버네티스를 통해 컴퓨팅 환경이 추상화되기 시작 

→ 클라우드 상에서 인프라 리소스가 폭발적으로 증가

→ 무슨 리소스가 얼마나 할당되었는지, 동일한 설정을 가졌는지 관리가 어려워짐

→ 인프라를 코드로 동일하게 관리해보자 = IaC 등장!

 

즉, IaC는 코드로 원하는 인프라 구조를 작성하면

어떤 환경에서도 동일한 인프라를 구축해주겠다는 인프라 추상화 도구인것이다.

대표적인 IaC 오픈소스는 Terraform, Ansible 등이 있다.

 

우리는 이번 시간에 Ansible을 통해 쿠버네티스 환경을 구축할 것이다.

Kubespray는 Ansible 상에서 쿠버네티스 환경을 다양하게 선택하고, 설정할 수 있도록 해준다.

사전 지식은 쿠버네티스 기본 설치과정을 겪어보거나, 사용해본 분이라면 무리없을 정도이다.

(완전 처음이여도 더듬더듬 찾을 수 있기 때문에 크게 어렵지 않다!)

2.2. 노드별 기본 세팅

<bash />
# swap 영역 비활성화 sudo swapoff -a # 방화벽 해제 systemctl stop firewalld && systemctl disable firewalld # 네트워크 설정 modprobe br_netfilter # 필터 적용 sudo sysctl -w net.ipv4.ip_forward=1 sudo sysctl -w net.bridge.bridge-nf-call-iptables=1 sudo sysctl -p # 설정 적용 sudo systemctl daemon-reload service network restart cat /proc/sys/net/ipv4/ip_forward 1 # 정상이면 1
<bash />
# 호스트네임 설정 sudo vi /etc/hosts ... # Kubernetes DNS 211.39.140.43 wisenut43 master01 211.39.140.39 wisenut39 node01 211.39.140.116 wisenut116 node02 211.39.140.119 wisenut119 node03 211.39.140.170 wisenut170 node04 211.39.140.212 wisenut212 node05 ######################################## # 암호키 생성 및 전달 (마스터 노드에서) ssh-keygen -t rsa # 암호키 전달 ssh-copy-id -i ~/.ssh/id_rsa.pub -f root@${워커노드 ip} ... # root 계정이 permission denied 된다면, # 일반 계정으로 옮기고 sudo su로 접속 후 # root/.ssh에 authorized_keys 이름으로 복사하자

2.3. Ansible, Kubespray 설치 (마스터 노드)

<bash />
# ansible 설치 sudo yum update -y sudo yum install -y ansible # 파이썬 관련 패키지 설치 sudo yum install -y epel-release sudo yum install -y python3 sudo yum install -y python3-pip sudo yum install -y libselinux-python3 sudo yum install -y dnf python -m pip install --upgrade pip python -m pip install selinux # kubespray 프로젝트 clone git clone https://github.com/kubernetes-sigs/kubespray.git # 필요 패키지 설치 (2.12 버전) cd kubespray sudo pip3 install -r requirements.txt # 기본으로 사용하는 파이썬 버전 확인 sudo update-alternatives --config python # 2.x 대 버전이 더 오류 발생이 적었음 # 3.x 버전 설치 및 기본실행순위 지정 # sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.9 1 # sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 4 # 삭제 : sudo update-alternatives --remove python <path> # 설정된 파이썬 버전 확인 # python -V # whereis python ls /usr/bin | grep python

2.4. Inventory 설정 (마스터 노드)

<bash />
vi group_vars/k8s_cluster/k8s-cluster.yml ... kube_version: v1.25.5 # 원하는 버전으로 설정 ... # kube_proxy_mode: iptables # 원하는 프록시 모드 설정 --- vi /roles/adduser/tasks/main.yml ... # 사용하는 유저 이름이 root가 아닐 경우 변경 when: user.name != "root"
<bash />
# 클러스터 구성 설정 # r : 하위 폴더 전부복사 / f : 강제실행 / p : 권한설정도 복사 cp -rfp inventory/sample inventory/mycluster vi ./inventory/mycluster/inventory.ini ... [all] node1 ip=192.168.140.43 ansible_host=192.168.140.43 ansible_become_pass='your_password' etcd_member_name=etcd1 node2 ip=192.168.140.39 ansible_host=192.168.140.39 node3 ip=192.168.140.116 ansible_host=192.168.140.116 node4 ip=192.168.140.119 ansible_host=192.168.140.119 node5 ip=192.168.140.170 ansible_host=192.168.140.170 node6 ip=192.168.140.212 ansible_host=192.168.140.212 ansible_become_pass='your_password' [all:vars] ansible_user=root ansible_become=yes # 특정 사용자로 전환할지 여부(sudo와 같음) ansible_become_method=sudo ansible_python_interpreter=/usr/bin/python3 [kube_control_plane] # 마스터가 될 노드 목록 node1 [etcd] # etcd(Pod 저장소)를 소유할 노드 목록 node1 [kube_node] # 워커가 될 노드 목록 node2 node3 node4 node5 node6 [calico_rr] # BGP route reflector 역할을 담당할 Calico Node 목록(규모가 클 때 사용) [k8s_cluster:children] kube_control_plane kube_node calico_rr
<bash />
# 애드온 설치 설정 # 필요한 애드온을 true로 변경 : helm, ingress_nginx, dashboard(Optional) vi inventory/mycluster/group_vars/k8s_cluster/addons.yml ... dashboard_enabled: true ... helm_enabled: true ... ingress_nginx_enabled: true ... ingress_nginx_class: nginx

2.5. Kubespray를 이용한 클러스터 구성

<bash />
# 네트워크 연결 테스트 ansible all -i inventory/mycluster/inventory.ini -m ping # 클러스터 설치(결과를 cluster.yaml로 저장) # 설치 과정 : 10분 ~ 30분 가량 소요 ansible-playbook -i inventory/mycluster/inventory.ini --flush-cache cluster.yml # 아래 옵션은 inventory.ini에 작성하여 따로 지정하지 않음 # -become : 특정 사용자로 전환할지 여부(sudo와 같음) # -v, -vv, -vvv : 진행 결과를 자세하게 표시 # -k : ansible 실행 시 ansible 호스트의 비밀번호를 물어볼 수 있도록 하는 옵션 # -K : ansible 실행 시 호스트 서버의 root 권한을 얻기 위한 옵션(일반 계정 사용 시 루트권한으로 수행)

 

2.6. Q & A

  • Ansible ping 명령을 보내면 Unreachable 에러가 발생합니다.
<bash />
# UNREACHABLE! Permission Denied 에러가 발생하면 # ssh로 한번은 접속해주거나 ssh ${사용자 계정}@${원격지 ip} sudo vi /etc/ansible/ansible.cfg ... # uncomment this to disable SSH key host checking host_key_checking = False # 여기 주석을 해제한다
  • 파이썬 버전 심볼릭 링크 문제 해결
<bash />
# 파이썬 위치 확인 whereis python # 심볼릭 링크 확인 ls -l /usr/bin/python* # 기존 링크 제거 sudo rm /usr/bin/python # 심볼릭 링크 추가 sudo ln -s /usr/bin/python3.6 /usr/bin/python

3. 마무리

 


참고자료

kubernetes-sigs/kubespray: Deploy a Production Ready Kubernetes Cluster (github.com)

Install Kubespray on CentOS 7 (velog.io)

Kubespray와 Ansible을 이용한 Kubernetes 설치하기 - 1편 — 현수 세상 (tistory.com)

profile

주녁, DevNote

@junwork

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!