Kubernetes를 쌩으로(?) 설치하기 너무 귀찮기에
조금 편하게 설치하기 위해 Kubespray를 이용해보기로 했다.
- kubernetes.io/ko/docs/setup/production-environment/tools/kubespray/
설치를 진행한 환경은 다음과 같다.
- Location : Home (SKB Internet - 500Mbps)
- Host OS : Windows 10 64bit
- VM S/W : VirtualBox
- Guest OS : Ubuntu 20.04 Server 64bit (3개 VM)
. CPU : 2 Core
. Mem : 4096 MB
. N/W : Bridge
1. python 설치
- 설치되어 있는 python을 확인해보자.
$ ls /usr/bin | grep python
python3
python3.8
- ubuntu 20.04 에서는 기본적으로 3.8이 설치되어 있는듯하다.
- 사용하기 편하도록 기본 `python`에 mapping 하자.
$ sudo update-alternatives --config python
update-alternatives: error: no alternatives for python
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.8 1
$ sudo update-alternatives --config python
$ python --version
Python 3.8.5
- `pip`도 설치해보자.
$ sudo apt install python3-pip
$ sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1
$ sudo update-alternatives --config pip3
$ pip --version
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)
2. ansible 설치
- kubespray는 `ansible`을 기본으로 사용한다.
$ sudo apt install ansible python3-argcomplete
$ ansible --version
ansible 2.9.6
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/whatwant/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 3.8.5 (default, Jan 27 2021, 15:41:15) [GCC 9.3.0]
3. SSH 키 복사하기
- `ansible`을 기본으로 사용하기에, 3대의 VM에 ssh 접속을 바로 할 수 있도록 SSH 키를 모두 복사해야 한다.
- `master`로 사용할 VM에서 `ssh-keygen`으로 key를 생성한 뒤, copy하면 된다.
- 개인적으로 사용하는 SSH 키가 있다면 그것을 사용하면 되고...
$ ssh-keygen
$ ssh-copy-id 192.168.122.10
(Master Node와 Worker Node에 모두 키를 복사)
4. swap 메모리 비활성화
- kubernetes를 설치하기 위해선 swap 메모리를 모두 비활성화 해야 한다.
- master/worker node에 사용할 3대의 VM 모두 꺼버리자!
$ sudo swapoff -a
5. ip forward 설정
- K8s는 가상 네트워크 환경을 사용해야 하기에 ip_forward를 활성화 해야 한다.
- master/worker node에 사용할 3대의 VM 모두 적용 !!!
$ sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
$ cat /proc/sys/net/ipv4/ip_forward
1
- 위와 같은 설정은 본래 재부팅하면 풀려야 하는데... 재부팅해도 그대로 유지되기에 내버려두고 있다.
- 나중에 한 번 확인해봐야 할 것 같다.
6. hosts 등록
- hostname으로 서버에 접속할 수 있도록 hosts 파일에 3개 VM hostname을 등록하자.
- master/worker node에 사용할 3대의 VM 모두 적용 !!!
$ sudo nano /etc/hosts
192.168.100.111 master-stg
192.168.100.112 worker1
192.168.100.113 worker2
- 각자의 hostname 과 IP 상황에 맞게 적용하면 된다.
7. kubespray 실행
- `git clone` 받은 뒤, 필요한 패키지 설치하도록 하고, 나만의 환경 설정을 하자.
$ git clone https://github.com/kubernetes-sigs/kubespray.git
$ cd kubespray
$ git checkout release-2.15
$ sudo pip install -r requirements.txt
$ cp -rfp inventory/sample inventory/mycluster
$ declare -a IPS=(192.168.100.111 192.168.100.112 192.168.100.113)
$ CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}
- `cp`를 하는 것은, sample을 기본으로 나만의 inventory를 만들기 위함이다.
- `declare`는 설치할 VM들의 IP를 적어주면 된다.
- `CONFIG_FILE`을 실행하면 `declare`로 알려준 VM 정보들을 이용하여 config file을 만들어준다.
- master node로 사용할 아이와 worker node를 사용할 아이들에 대해서 설정을 맞춰주자.
- hostname도 맞춰서 적어주는 것이 좋다.
$ nano inventory/mycluster/hosts.yaml
all:
hosts:
master-stg:
ansible_host: 192.168.100.111
ip: 192.168.100.111
access_ip: 192.168.100.111
worker1:
ansible_host: 192.168.100.112
ip: 192.168.100.112
access_ip: 192.168.100.112
worker2:
ansible_host: 192.168.100.113
ip: 192.168.100.113
access_ip: 192.168.100.113
children:
kube_control_plane:
hosts:
master-stg:
kube_node:
hosts:
worker1:
worker2:
etcd:
hosts:
master-stg:
k8s_cluster:
children:
kube_control_plane:
kube_node:
calico_rr:
hosts: {}
- addon도 필요한 것들을 true로 만들어주자.
$ nano ./inventory/mycluster/group_vars/k8s_cluster/addons.yml
dashboard_enabled: true
metrics_server_enabled: true
ingress_nginx_enabled: true
8. Static IP 설정
- DHCP 설정으로 되어있으면 Node의 `/etc/resolv.conf`에 잡스러운(?) 내용이 들어가고
- 그렇게 되면 K8s의 coredns에서 Node의 `/etc/resolv.conf`를 참고하게 되면서
- Pod의 Container 안에 있는 `/etc/resolv.conf`에도 그 내용이 반영되어서
- FQDN 관련해서 원하지 않는 결과가 나올 수 있다.
❯ cd /etc/netplan/
❯ sudo cp ./00-installer-config.yaml ./00-installer-config.yaml.210504
❯ sudo nano ./00-installer-config.yaml
network:
ethernets:
enp0s3:
dhcp4: no
dhcp6: no
addresses: [192.168.100.111/24]
gateway4: 192.168.100.1
nameservers:
addresses: [8.8.8.8,8.8.4.4]
version: 2
9. 설치
- 이제 준비는 끝났다. 고! 고!
$ ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root cluster.yml
10. 사용자 계정 설정
- root 계정이 아닌 사용자 계정에서 `kubectl` 명령어를 사용하기 위해서는 다음과 같이...
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
11. zsh 자동 완성 셋팅
> echo "source <(kubectl completion zsh)" >> ~/.zshrc
> source ~/.zshrc
12. 재부팅 후
- 희한하게 서버들을 재부팅 하고, `kubectl` 사용을 하면 API Server 연결을 거부당했다는 메시지가 나온다.
- 그러면 swap 메모리 설정을 한 번 해주면 해결이 된다.
$ sudo swapoff -a
13. 결과
- 이렇게 잘 나온다~
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master-stg Ready control-plane,master 37h v1.20.6 192.168.100.111 <none> Ubuntu 20.04.2 LTS 5.4.0-72-generic docker://19.3.15
worker1 Ready <none> 37h v1.20.6 192.168.100.112 <none> Ubuntu 20.04.2 LTS 5.4.0-72-generic docker://19.3.15
worker2 Ready <none> 37h v1.20.6 192.168.100.113 <none> Ubuntu 20.04.2 LTS 5.4.0-72-generic docker://19.3.15
'Dev Tools > Kubernetes' 카테고리의 다른 글
Install `NGINX Ingress Controller` in Kubernetes (4) | 2021.09.18 |
---|---|
Kubernetes 환경 구축 (Vagrant + VirtualBox + Kubespray) (0) | 2021.07.27 |
MinIO StandAlone in Kubernetes (0) | 2021.05.13 |
Kubernetes Install (Ubuntu 20.04) (0) | 2020.12.28 |
Minikube install (in Ubuntu 18.04 in VirtualBox) (0) | 2020.08.22 |