목표
- 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)
'DevOps' 카테고리의 다른 글
코드로 클러스터 구축하기 - (1) AWS 네트워크 기본 개념 (0) | 2023.08.10 |
---|---|
Kubeflow 라이징 - Charmed Kubeflow (Optional) (0) | 2023.04.19 |
Kubeflow 라이징 - BentoML로 Model Serving하기 (1) | 2023.04.01 |
Secure K8S - RBAC 설정을 통한 멀티 클러스터 환경 분리 (0) | 2023.03.12 |
Kubeflow 라이징 - Kiali로 Service Mesh 모니터링하기 (0) | 2023.03.10 |