주녁, DevNote
article thumbnail

목표

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

여정

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

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

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

 

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

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

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

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

 

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

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

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

 

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

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

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

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

노드별 기본 세팅

# 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
# 호스트네임 설정
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 이름으로 복사하자

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

# 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

Inventory 설정 (마스터 노드)

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"
# 클러스터 구성 설정
# 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
# 애드온 설치 설정
# 필요한 애드온을 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

Kubespray를 이용한 클러스터 구성

# 네트워크 연결 테스트 
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 권한을 얻기 위한 옵션(일반 계정 사용 시 루트권한으로 수행)

 

Q & A

  • Ansible ping 명령을 보내면 Unreachable 에러가 발생합니다.
# UNREACHABLE! Permission Denied 에러가 발생하면 
# ssh로 한번은 접속해주거나
ssh ${사용자 계정}@${원격지 ip}

sudo vi /etc/ansible/ansible.cfg
...
# uncomment this to disable SSH key host checking
host_key_checking = False # 여기 주석을 해제한다
  • 파이썬 버전 심볼릭 링크 문제 해결
# 파이썬 위치 확인
whereis python

# 심볼릭 링크 확인
ls -l /usr/bin/python*

# 기존 링크 제거
sudo rm /usr/bin/python

# 심볼릭 링크 추가
sudo ln -s /usr/bin/python3.6 /usr/bin/python

마무리

 


참고자료

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

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