🥞 BE
home

Ch2. 쿠버네티스 설치

Date
2023/08/27
Category
Data Engineering
Tag
Kubernetes
Detail
쿠버네티스 입문 Study
설치 과정

실습 인프라 구성

GCP Compute Engine에서 인스턴스를 만든다. 리전은 상관없지만 그냥 서울, 부팅 디스크는 Ubuntu 20.04 LTS를 설정했다.
인스턴스 4개를 더 만든다.
이후 다음 과정에 따라 Kubespray로 쿠버네티스 클러스터 구성을 진행한다.
1.
마스터 노드 #1인 instance-1 서버에서 다른 서버에 원격 접속(SSH)이 가능하도록 설정
2.
Kubespray 설치
3.
클러스터로 구성할 서버 정보를 설정
4.
클러스터 설치 옵션 확인
5.
Kubespray가 제공하는 앤서블 플레이북을 실행

SSH 키 생성과 배포

instance-1 오른쪽의 SSH키를 누르면 브라우저에서 서버 접속할 수 있게 뜬다.
접속 후 instance-1에서 SSH 공개 키와 비밀 키 생성하고 여기서 생성한 키를 다른 서버에 모두 배포한다.
ssh-keygen -t rsa SSH 키 생성
ls -al .ssh 생성된 키파일 확인
cat .ssh/id_rsa.pub 생성한 공개 키 내용 확인
메타데이터 카테고리에서 SSH키를 저장한다.
이제 준비한 5대의 서버에 SSH 공개 키가 자동으로 배포된다.
cat .ssh/authorized_keys 명령을 통해 확인할 수 있다.
다음과 같이 ssh 인스턴스명 hostname 명령어를 입력했을 때 인스턴스명이 제대로 출력되면 원격 설치에 필요한 SSH 설정이 끝난 것이다.

Kubespray 설치

sudo apt update sudo apt -y install python3-pip pip --version git clone https://github.com/kubernetes-sigs/kubespray.git
YAML
복사
위 명령어를 실행하고, kubespray를 git에서 불러온다.
cd kubespray git checkout -b v2.16.0 git status ls -al
YAML
복사
이제 필요한 패키지를 설치한다.
cat requirements.txt sudo pip install -r requirements.txt
YAML
복사
명령어를 실행결과 다음의 에러가 발생했다. ERROR: Could not find a version that satisfies the requirement ansible==7.6.0
에러 밑에 설치가능한 패키지 버전? 으로 보이는 것들이 있길래 requirements.txt를 수정하여 가장 마지막의 6.7.0을 설치했다.
설치에 핵심이 될 앤서블 버전을 확인한다. 현재 2.13.11 버전이 설치되었다.

Kubespray 설정

마스터 노드를 포함해 클러스터로 구성할 모든 서버의 정보와 설치 옵션을 설정한다.
cp -rfp inventory/sample inventory/mycluster ls inventory/mycluster sudo apt install tree tree inventory/mycluster/group_vars/
YAML
복사
group_vars 디렉터리의 구조를 확인.
all 디렉토리 하위에 있는 yml 파일들 : 설치 환경 및 방법에 관한 설정들.
etcl.yml : etcd 설치에 필요한 상세 설정 내용.
k8s_cluster 디렉토리 하위에 있는 yml 파일들 : 쿠버네티스 관련 설정.
온프레미스 환경에 쿠버네티스 클러스터를 구성할 때 변경해야 할 점 all.yml 파일 내의 http_proxy, https_proxy, no_proxy 필드 프록시 설정. k8s-cluster 파일 내의 kube_serviec_address 필드에서 쿠버네티스 서비스 IP로 할당할 대역을 설정, kube_pods_subent 필드에서 파드들이 할당받을 IP 대역을 설정.
다음은 inventory.ini 파일에 설치 대상 서버들의 정보를 변경.
vi inventory/mycluster/inventory.ini 명령어로 수정.
# ## Configure 'ip' variable to bind kubernetes services on a # ## different ip than the default iface # ## We should set etcd_member_name for etcd cluster. The node that is not a etcd member do not need to set the value, or can set the empty string value. [all] instance-1 ansible_host=10.178.0.2 ip=10.178.0.2 etcd_member_name=etcd1 instance-2 ansible_host=10.178.0.3 ip=10.178.0.3 etcd_member_name=etcd2 instance-3 ansible_host=10.178.0.4 ip=10.178.0.4 etcd_member_name=etcd3 instance-4 ansible_host=10.178.0.5 ip=10.178.0.5 instance-5 ansible_host=10.178.0.6 ip=10.178.0.6 # node6 ansible_host=95.54.0.17 # ip=10.3.0.6 etcd_member_name=etcd6 # ## configure a bastion host if your nodes are not directly reachable # [bastion] # bastion ansible_host=x.x.x.x ansible_user=some_user [kube_control_plane] instance-1 instance-2 instance-3 [etcd] instance-1 instance-2 instance-3 [kube_node] instance-4 instance-5 [calico_rr] [k8s_cluster:children] kube_control_plane kube_node calico_rr
YAML
복사
[all] : 클러스터로 구성될 서버들의 호스트네임과 IP(여기서는 VM인스턴스의 내부 IP)를 설정.
[kube_control_plane] : 마스터 노드로 사용할 서버의 호스트네임을 설정. [all] 에서 호스트네임의 IP 정보 등을 설정했다면 호스트네임만 입력해도 됨.
[etcd] : 쿠버네티스의 클러스터 데이터를 저장하는 etcd를 설치할 노드의 호스트네임을 설정.
[kube_node] : 워커 노드로 사용할 서버의 호스트네임을 설정.
[k8s_cluster:children] : 쿠버네티스를 설치할 노드들을 설정. etcd가 설치될 노드를 제외하는 것이므로 보통 기본 설정 그대로 사용.
구성할 서버 설정이 끝났으니 쿠버네티스 클러스터를 구성하는 명령을 실행
ansible-playbook -i inventory/mycluster/inventory.ini -v --become --become-user=root cluster.yml 명령으로 cluster.yml 파일을 실행한다.
근데 설치하려니 에러가 뜨고, 에러 하위에 "msg": "ansible must be between 2.14.0 and 2.16.0 exclusive - you have 2.13.11” 라는 메시지가 떴다. ansible 버전이 2.14.0과 2.16.0 사이로 따로 설정이 되어있는 것 같다. 따라서 이를 변경해줘야 하는데, 찾아보니 kubespray/playbooks/ansible-version.yml 파일 내의 var 부분이 아래와 같이 설정되어 있었다. 따라서 현재 나의 버전인 2.13.11에 맞게 minimal_ansible_vesion: 2.13.0 으로 변경해주었다.
vars: minimal_ansible_version: 2.13.0 maximal_ansible_version: 2.15.0 ansible_connection: local
YAML
복사
클러스터 구성 대상은 inventory/mycluster/inventory.ini의 설정에 따른다. 필요한 패키지를 설치하고 컨테이너 이미지 등을 다운로드 하므로 구성 시간은 20분 이상 걸린다.
다음과 같이 완료 화면에 구성 과정별 소요 시간과 instance-1 같은 호스트네임 옆에 falied=0이 표시된다면 실패 없이 정상적으로 구성한 것이다.
이후에는 마스터 노드에서 root 계정으로 kubectl 관련 명령을 사용할 수 있다.
sudo -i명령으로 root 계정으로 변경.
kubectl get node 명령으로 모든 노드가 사용할 수 있는 상태인지 확인.
다음과 같이 모든 노드의 STATUS 항목 값이 Ready 라면 클러스터 구성을 완료한 것이다. 워커 노드의 기본 역할은 <none>으로 표시된다.