Container/Kubernetes

[Kubernetes] kubespray를 이용해 쿠버네티스 설치하기 (GCP, CentOS7)

Nirsa 2020. 2. 10. 13:38
반응형

 

  • 설치 환경

  • GCP (Google Cloud Platform)
  • CentOS 7.7 1908
  • Master Node 3대, Worker Node 2대 (VM 인스턴스 총 5대)

 

  • GCP VM 인스턴스 준비

연습용으로 하실 경우 VM 인스턴스를 생성할줄 모르신다면 https://nirsa.tistory.com/entry/GCP-VM-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%83%9D%EC%84%B1?category=870325 를 참고하여 5대를 준비해주세요. 

다른 서버를 준비해주시면 되고 저는 Master Node 3대, Worker node 2대로 진행하기 때문에 VM 인스턴스 총 5대를 준비 하였습니다.

 

  • SSH 설정

GCP의 경우 따로 SSH 설정을 해줘야 할 건 없으며 대신 키설정을 해주어야 합니다.

ssh-keygen -t rsa
# 모두 Enter 입력하여 기본값 생성

cat .ssh/id_rsa.pub
# 키 내용 전체 복사

 

GCP의 경우 GCE의 메타데이터를 이용하여 SSH 키를 자동으로 배포해줄 수 있습니다. GCE (Google Compute Engine) 에서 메타데이터 → SSH 키 → 수정을 클릭 합니다.

 

항목추가 → 복사했던 키 전체 입력 → 저장 클릭

 

키 배포 설정은 이렇게 끝났고 다른 인스턴스에 들어가 cat .ssh/authorized_keys 를 입력하여 배포된 키를 확인할 수 있습니다. 만약, GCP가 아닌 다른 환경일 경우 아래 코드를 입력하여 배포할 수 있습니다.

아래 명령으로 키를 배포할 경우 나머지 서버에 모두 배포 해주세요.

ssh-copy-id root@[IP]

 

  • kubespray 설치

이 글에서는 python 2점대를 그대로 사용하여 진행 합니다.

** GCP에서 진행할 경우 여기서부터 kubespray 설정까지 모두 root 계정이 아닌, 사용자 계정으로 진행 해주세요.

sudo yum -y install python-pip git
git clone https://github.com/kubernetes-sigs/kubespray.git
cd kubespray
sudo pip install -r requirements.txt

 

  • kubespray 설정

kubespray에서는 설정에 필요한 기본 템플릿을 제공 합니다. kubespray/inventory/sample 에서 확인할 수 있으며 기본 템플릿을 사용하기 위해 파일을 복사 합니다. <> 안에 작성한 내용은 모두 작성해주셔야 하고 사용할 서버의 개수만큼 지정 해주시면 됩니다.

Master Node에 etcd를 같이 사용할 경우 아래와 같이 [kube-master], [etccd]를 같이 설정해주시면 되고 [kube-node]는 Worker Node로 사용될 인스턴스들을 입력해주시면 됩니다.

** GCP가 아니라 VM 인스턴스명이 아닐 경우 서버들의 host name으로 입력해주세요.

cp -rfp kubespray/inventory/sample kubespray/inventory/[사용할 디렉토리명]
cp -rfp kubespray/inventory/sample kubespray/inventory/cluster


# inventory.ini 파일 설정
vi kubespray/inventory/cluster/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]
<VM인스턴스명1> ansible_ssh_host=<사용중인 IP> ip=<사용중인 IP> etcd_member_name=<ctcd 명1>
<VM인스턴스명2> ansible_ssh_host=<사용중인 IP> ip=<사용중인 IP> etcd_member_name=<ctcd 명2>
<VM인스턴스명3> ansible_ssh_host=<사용중인 IP> ip=<사용중인 IP> etcd_member_name=<ctcd 명3>
<VM인스턴스명4> ansible_ssh_host=<사용중인 IP> ip=<사용중인 IP>
<VM인스턴스명5> ansible_ssh_host=<사용중인 IP> ip=<사용중인 IP>

# ## configure a bastion host if your nodes are not directly reachable
# bastion ansible_host=x.x.x.x ansible_user=some_user

[kube-master]
<VM인스턴스명1>
<VM인스턴스명2>
<VM인스턴스명3>

[etcd]
<VM인스턴스명1>
<VM인스턴스명2>
<VM인스턴스명3>

[kube-node]
<VM인스턴스명4>
<VM인스턴스명5>

[calico-rr]

[k8s-cluster:children]
kube-master
kube-node
calico-rr
## 저장 후 inventory.ini 종료
:wq


## 쉘에서 아래 명령어 입력 및 GCP를 사용할 경우 반드시 사용자 계정으로 진행 (root X)
# 몇십분가량 소요 됩니다.
ansible-playbook -i kubespray/inventory/cluster/inventory.ini -v --become --become-user=root kubespray/cluster.yml

 

GCP를 사용할 경우 GCE (Google Compute Engine) 에서 VM 인스턴스 클릭 후 보이는 아래 화면입니다. 이름이 VM 인스턴스 명이고 위의 사용중인 IP는 내부 IP로 설정 합니다.

 

만약 코드 블럭 가장 아래에 있는 "ansible-playbook -i kubespray/inventory/cluster/inventory.ini -v --become --become-user=root kubespray/cluster.yml" 명령 실행 후 "ssh permission denied (publickey gssapi-keyex gssapi-with-mic)" 에러가 발생할 경우 SSH 키 설정이 재대로 되었는지, 구글 사용자 계정으로 명령을 실행 하였는지 확인해주세요. 

root 계정으로 실행 시 퍼미션 에러가 발생할 수 있습니다.

* 참고로 ansible-playbook 명령어 실행 시 경로를 잘 확인하고 설정 해주셔야 에러가 발생하지 않습니다.

*  "assertion: groups.etcd | length is not divisibleby 2" 에러 발생 시 : https://nirsa.tistory.com/181

 

아래와 같이 나온다면 재대로 설치가 완료된 것 입니다.

 

  • kubectl 확인

sudo -i 명령으로 root 계정으로 진입 후 kubectl get node를 입력하여 정상적으로 작동 하는지 확인 해야 합니다.

단, root 계정으로 처음 로그인 하면 kubectl 명령에 대한 등록이 되어있지 않아 실행파일에 직접 접근하여 실행하지 않는 이상 "command not found" 에러가 발생 합니다. 아래 명령어를 입력 후 kubectl get node 로 확인 해주세요.

alias kubectl='/usr/local/bin/kubectl'

 

root 계정에 대해 재부팅 이후에도 kubectl을 명령어로 사용하고 싶다면 vi ~/.bashrc 입력 후 아래 이미지와 같이 내용을 삽입 해주면 됩니다.

 

"The connection to the server localhost:8080 was refused - did you specify the right host or port?" 에러 발생 시에는 root 계정으로 시도한것이 맞는지 다시 확인 해주세요. 사용자 계정으로 실행하면 위 에러가 발생 할 수 있습니다.

 

반응형