🥞 BE
home

Ch2. 쿠버네티스 설치

설치 과정

실습 인프라 구성

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>으로 표시된다.