Kubernetes를 쌩으로(?) 설치하기 너무 귀찮기에

조금 편하게 설치하기 위해 Kubespray를 이용해보기로 했다.

 

   - kubernetes.io/ko/docs/setup/production-environment/tools/kubespray/

 

Kubespray로 쿠버네티스 설치하기

이 가이드는 Kubespray를 이용하여 GCE, Azure, OpenStack, AWS, vSphere, Packet(베어메탈), Oracle Cloud infrastructure(실험적) 또는 베어메탈 등에서 운영되는 쿠버네티스 클러스터를 설치하는 과정을 보여준다. Kub

kubernetes.io

설치를 진행한 환경은 다음과 같다.

 

  - 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

 

반응형

+ Recent posts