본문 바로가기
인프라/k8s

k8s 인프라 구성

by memeseo 2021. 12. 30.

현재 kubernetes를 아주 아주 아주 아주 아주 아주 조금 알고 있는 상태며, 이 상태에서 실습을 진행한 거라 굉장히 미숙하고 중간에 무언가 빠진듯한(?) 느낌이 날 수 있다. 이 중간에 무언가 빠진 듯한 느낌은 나중에 어느 정도 알게 되었을 때 수정할 예정. 검색 비허용으로 설정하고 싶은데 그런 기능이 티스토리에도 있을지는 모르겠다. 여하튼 스타트.

 


🚩  준비물 : node 5개 (master01, master02, worker01, worker02, worker03)

*나는 putty로 작업하긴 했으나, mobaXterm 같은 걸 사용하면 손이 덜감.

 

1. 기본 설정

5대의 모든 VM 노드에 root 계정으로 로그인 후 sudoer 설정 작업.

$ visudo

## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
xxx ALL=(ALL) ALL

## Same thing without a password 
# %wheel ALL=(ALL) NOPASSWD: ALL
xxx ALL=(ALL) NOPASSWD: ALL

 

코드 작성 시 root 권한이 필요한 경우가 많기 때문에 간단한 설정을 통해 일반 계정에 root권한을 부여해보자. 첫 번째 줄 명령어를 치면 파일이 열린다. 참고로 vi /etc/sudoers로 명령어를 사용해 파일을 열 경우 readonly로 열어지기 때문에 수정할 수 없으니 visudo라고 간단하게 명령어를 입력해 파일을 열도록 하자.

 

파일에 위와 같은 줄을 찾아 xxx에 본인 계정을 입력하면 root권한 획득 완료.

 

2. passwordless 로그인 설정 및 k8s 설치 준비

5대 VM 노드에 공통으로 사용할 계정을 통해 패스워드 없이 모든 노드에 ssh 로그인이 가능하도록 bootstrap node에서 다음과 같은 명령어를 수행한다.

 

$ ssh-keygen -t rsa

$ sudo vi /etc/hosts

## 000.00.000.00 master01 
## ...

$ ping master01

 

첫 번째 줄 명령어를 통해 bootstrap node에 private key와 public key를 생성한다. (RSA 암호화) 엔터를 세 번 정도 누르면 완료가 되는데 /root/. ssh에서 private key와 public key를 확인해볼 수 있다.

 

두 번째 명령어를 통해 IP와 domain을 등록해준다. 나와 같은 경우 '00.0.0.00 master01'...으로 명시해줬다.

세 번째 명령어를 통해 내가 등록한 도메인 서버와 연결이 되는지 확인해 본다. 참고로 ping 멈추는 방법은 ctrl + c.

 

$ sudo cat /etc/ssh/sshd_config | grep PasswordAuthentication
$ sudo vi /etc/ssh/sshd_config
PasswordAuthentication yes
sudo systemctl restart sshd

 

ssh server의 설정이 안 되어 있을 경우 ssh 명령어로 접속이 안 되는 문제가 발생할 수 있다. 이를 방지하기 위해 미리 config file에 PasswordAuthentication이 yes로 되어있는지 확인한다. yes로 되어있으면 변경할 필요 없음. 변경했다면 네 번째 줄 명령어를 통해 restart 해주는 거 잊지 말자.

 

$ ssh-copy-id -i -/.ssh/id_rsa.pub 계정@master01
$ ssh 계정@master01 hostname

 

bootstrap node에 '계정'으로 첫 번째 명령어를 입력한다. keygen을 통해 생성한 public key를 두 번째 명령어를 통해 접속하고자 하는 서버에 부여해준다. 이런 설정을 하면 이후 ssh 명령어로 접속 시 password를 입력받지 않고 접속이 가능해진다.

 

$ sudo yum repolist
$ sudo yum install nfs-utils nfs-utils-lib

 

위 명령어는 왜 치는 걸까.. 알려줄 사람 급구..

 

3. kubespray 기반 k8s 설치

bootstrap node의 '계정'으로 k8s설치를 진행한다.

 

$ git clone https://github.com/kubernetes-sigs/kubespray.git
$ cd kubespray/
$ sudo pip3 install -r requirements.txt
$ cp -rfp inventory/sample inventory/mepmcluster

$ declare -a IPS=(domain명,ip domain명,ip ...)
$ CONFIG_FILE=inventory/mepmcluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}

$ cat inventory/mepmcluster/group_vars/all/all.yml
$ cat inventory/mepmcluster/group_vars/k8s-cluster/k8s-cluster.yml

$ ansible-playbook -i inventory/mepmcluster/hosts.yaml  --become --become-user=root cluster.yml

 

설치가 정상적으로 완료되면 kubernetes 관리를 위한 kubectl 패키지를 설치한다. 포트 포워딩 기능을 사용하기 위해 모든 노드에 kubectl을 설치할 예정이며, kubectl 패키지를 설치하기 전에 kubeconfig를 설정하기 위해 먼저 master01 노드에서 다음 명령어를 실행한다.

 

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

kubectl이 설치되지 않은 나머지 노드들에 설치를 진행한다.

 

$ sudo cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
$ sudo yum install kubectl

 

master01 노드에 있는 kubeconfig를 복사해서 다음과 같이 설정한다.

 

$ mkdir -p $HOME/.kube
$ vi .kube/config

 

config 파일에 master01 노드에 있는 kubeconfig 파일을 복사해주면 되는데, 잘 못 입력했을 경우 'esc+ shift + :' 누른 후 '% d'를 입력하면 전체 삭제가 된다. 설치가 완료되면 다음 명령어로 설정이 제대로 됐는지 확인해본다.

 

$ kubectl version
$ kubectl cluster-info

 

오류가 뜨지 않으면 k8s 배포 성공..!