본문 바로가기
프로그래밍

[kubernetes] ubuntu 20.04에 python3.11 버전 설치 및 kubespray로 쿠버네티스 설치하기

by choihyuunmin 2024. 6. 11.
728x90

kubespray는 ansible을 이용하여 쿠버네티스 클러스터를 손쉽게 구축할 수 있게 해주는 오픈소스입니다.

VM 환경에서 무료로 쉽게 설치할 수 있는 ubuntu 20.04를 이용해 kubespray를 설치할 수 있는 방법을 설명합니다.

우선, 가상 서버 3대를 준비합니다.

 

1. 계정에 권한 부여하기

kubespray를 설치하기 위한 계정을 생성합니다. 저는 서버 설치할 때 생성한 기본 계정을 사용합니다.

kubespray 클러스터를 실행하기 위해서는 각 서버의 계정에 root 권한을 부여해야합니다.

 

choi@ubun20-01:~$ sudo vi /etc/sudoers

...

choi    ALL=(ALL:ALL)   NOPASSWD: ALL

 

여기서 중요한 점은 root권한을 부여하고, sudo 명령어를 실행했을 때, 패스워드를 입력하지 않고 권한을 부여받아야 합니다.

만약 패스워드를 물어보는 입력창이 나타나면, 나중에 ansible 실행시 권한 관련 에러가 나타납니다.

 

2. 고정 IP 설정

DHCP로도 구성할 수 있지만 DNS설정과 서버 접속 편의를 위해 서버에 고정 IP를 할당합니다.

choi@ubun20-01:~$ sudo vi /etc/netplan/00-installer-config.yaml

...

network:
  ethernets:
    enp0s1:
      addresses: [192.168.64.11/24]
      gateway4: 192.168.64.1
      nameservers:
        addresses: [8.8.8.8]
  version: 2
~

 

기존에 작성된 network를 주석처리하고 새로 작성합니다.

addresses와 gatewa는 본인이 원하는 ip를 입력하면 됩니다.

 

choi@ubun20-01:~$ sudo netplan apply
choi@ubun20-01:~$ ifconfig
enp0s1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.64.11

 

네트워크 설정을 마치고 ifconfig를 통해 ip가 올바로 설정되었는지 확인합니다.

나머지 2대의 서버에도 같은 작업을 진행합니다.

 

2. hosts 설정

서로의 서버에 ip가 아닌 host명으로 통신할 수 있도록 DNS설정을 해줍니다.

choi@ubun20-01:~$ sudo vi /etc/hosts

...


192.168.64.11 ubun20-01
192.168.64.12 ubun20-02
192.168.64.13 ubun20-03

 

설정후에 ping ubun20-02 명령어로 설정이 잘되었는지 확인합니다.

로컬호스트에 가상이미지를 이용했을 경우에는 서로 통신이 가능하지만, 만약 response를 받지 못했다면, 방화벽 설정을 확인합니다.

kubespray 설치 시에도 서로 통신하는데, 방해가 있으면 안되기에 방화벽을 해제해줍니다.

 

3. ssh key 생성

서버간에 패스워드 없이 ssh 통신을 하기 위해 key를 생성해서 등록해줍니다.

choi@ubun20-01:~$ ssh-keygen
choi@ubun20-01:~$ ssh-copy-id ubun-20-02

 

ssh-keygen을 이용해 공개키를 만들어줍니다. 명령어를 입력하면 여러개의 입력창이 나타나는데, 엔터키를 눌러 넘어가줍니다.

생성한 공개키를 다른 서버에 등록해줍니다. ssh-copy-id 뒤에 설정한 hostname을 인자로 넘겨줍니다.

추가로, 로컬호스트에서도 가상서버 3곳에 키를 추가해줍니다. kubespray를 클러스터에 설치하고, 로컬호스트에 클러스터를 등록해서 사용하기 위함입니다.

 

키를 등록하고 ssh 를 통해 접속했을때 패스워드를 물어보지 않는다면 정상적으로 등록됐습니다.

만약 키를 등록했는데도 패스워드를 물어보거나, 아래와 같은 에러가 발생한다면

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!

홈 디렉토리의 .ssh로 이동해서 known_hosts의 내용을 삭제한 후 다시 시도하는 것이 좋습니다.

 

4. python 설치

kubespray를 사용하기 위해서는 파이썬 3.9에서 3.11 버전이 필요합니다.

하지만 ubuntu 20.04에 설치되어 있는 파이썬의 기본 버전은 3.8버전입니다.

실습을 위해 새로운 파이썬을 설치해줍니다. 여기서는 3.11버전을 설치합니다.

파이썬 설치 방법은 binary파일을 받는 방법과, apt 저장소를 이용해 다운로드 받는 방법이 있습니다.

 

현재는 외부 인터넷에 접속 가능하기 때문에 apt 를 이용해 다운로드 받습니다.

choi@ubun20-01:~$ sudo apt update
choi@ubun20-01:~$ sudo apt install software-properties-common
choi@ubun20-01:~$ sudo add-apt-repository ppa:deadsnakes/ppa
choi@ubun20-01:~$ sudo apt install python3.11
choi@ubun20-01:~$ sudo apt install python3.11-dev
choi@ubun20-01:~$ sudo apt install python3.11-venv

 

파이썬 설치를 위해 필요한 작업을 먼저 해줍니다. apt 저장소를 업데이트하고, 필요 라이브러리를 다운로드 받습니다.

apt 기본 저장소에는 파이썬 3.11 버전이 없기 때문에, 새로운 repository로 등록해줍니다.

python3.11 과 가상환경 설정을 위한 venv 패키지까지 설치를 완료해줍니다.

파이썬 설치가 완료됐지만, python3 커맨드를 실행하면 설치한 3.11버전이 아닌 기본으로 설정된 3.8버전이 실행됩니다.

choi@ubun20-01:~$ python3
Python 3.8.10 (default, Nov 22 2023, 10:22:35)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

 

update-alternatives 명령어를 통해 패키지 설정을 진행합니다.

choi@ubun20-01:~$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1
choi@ubun20-01:~$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2

 

패키지 설정을 완료하면 config 를 확인했을때 두개의 버전을 확인할 수 있습니다.

choi@ubun20-01:/etc/alternatives$ sudo update-alternatives --config python3
There are 2 choices for the alternative python3 (providing /usr/bin/python3).

  Selection    Path                 Priority   Status
------------------------------------------------------------
  0            /usr/bin/python3.8    2         auto mode
* 1            /usr/bin/python3.11   1         manual mode
  2            /usr/bin/python3.8    2         manual mode

Press <enter> to keep the current choice[*], or type selection number:

 

3.11 버전을 기본으로 사용하기 위해 1을 입력해줍니다.(3.11버전이 명시된 번호)

이제 /etc/alternatives 로 이동하면 python이 3.11버전에 심볼릭링크 설정되어 있는 것을 볼 수 있습니다.

 

choi@ubun20-01:~$ ls -al /etc/alternatives/ | grep python
lrwxrwxrwx  1 root root   19 Jan 16 13:27 python3 -> /usr/bin/python3.11

 

다시 python3를 실행하면 버전이 바뀐 것을 볼 수 있습니다.

choi@ubun20-01:~$ python3
Python 3.11.7 (main, Dec  8 2023, 18:56:57) [GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

 

 

4-1. pkg 에러 해결

python3-apt must be installed and visible from /usr/bin/python3.

 

파이썬을 설치했지만, 나중에 ansible로 클러스터를 구성하면 위와 같은 pkg에러가 나타납니다.

우분투 운영체제에서 파이썬 3.9 이상 버전을 사용하면 나타나는 오류입니다.

apt 저장소에서 python3-apt 를 아무리 설치해도 이미 설치되어 있다고 나오니, 다른 방법으로 해결해줍니다.

 

choi@ubun20-01:/usr/lib/python3$ cd /usr/lib/python3/dist-packages/
choi@ubun20-01:/usr/lib/python3$ cp apt_pkg.cpython-38-aarch64-linux-gnu.so apt_pkg.so
choi@ubun20-01:/usr/lib/python3$ cp apt_inst.cpython-38-aarch64-linux-gnu.so apt_inst.so

 

파이썬이 설치된 경로로 가서 위 명령어를 실행해줍니다. apt_pkg와 apt_inst라는 정확한 이름으로 되어 있어야 인식합니다.

심볼릭링크 설정을 해보았지만, 인식을 못하는 것으로 봐선 실제로 파일이 생성되어 있어야 하는 것 같습니다.

 

5. kubespray 소스 clone

환경설정이 완료되었다면 kubespray의 소스를 깃허브 저장소에서 가져옵니다.

kubespray의 깃허브 주소는 다음과 같습니다.

https://github.com/kubernetes-sigs/kubespray

 

GitHub - kubernetes-sigs/kubespray: Deploy a Production Ready Kubernetes Cluster

Deploy a Production Ready Kubernetes Cluster. Contribute to kubernetes-sigs/kubespray development by creating an account on GitHub.

github.com

 

저는 홈디렉토리 바로 밑에 생성했습니다.

choi@ubun20-01:~$ git clone https://github.com/kubernetes-sigs/kubespray.git

 

브랜치에 버전별로 저장되어 있으니 필요한 버전을 checkout 받습니다. 저는 최신 버전을 사용합니다.

ansible 설치를 위해서 repository 안의 requirements를 사용해 파이썬 라이브러리를 다운로드 받습니다.

저는 환경 분리를 위해 가상환경을 사용해서 설치를 진행했습니다.

 

choi@ubun20-01:~$ python -m venv kube
choi@ubun20-01:~$ source kube/bin/activate
(kube) choi@ubun20-01:~$

 

6. ansible 설치 및 실행

가상환경에 진입했다면 ansible을 설치해줍니다.

(kube) choi@ubun20-01:~$ cd kubespray/
(kube) choi@ubun20-01:~$ pip install -U -r requirements.txt

 

설치가 완료되면, ansible 명령어를 실행시켜 정상적으로 설치가 됐는지 확인합니다.

 

(kube) choi@ubun20-01:~$ ansible
usage: ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD]
               [--become-user BECOME_USER]
               [-K | --become-password-file BECOME_PASSWORD_FILE]
               [-i INVENTORY] [--list-hosts] [-l SUBSET] [-P POLL_INTERVAL]
               [-B SECONDS] [-o] [-t TREE] [--private-key PRIVATE_KEY_FILE]
               [-u REMOTE_USER] [-c CONNECTION] [-T TIMEOUT]
               [--ssh-common-args SSH_COMMON_ARGS]
               [--sftp-extra-args SFTP_EXTRA_ARGS]
               [--scp-extra-args SCP_EXTRA_ARGS]
               [--ssh-extra-args SSH_EXTRA_ARGS]
               [-k | --connection-password-file CONNECTION_PASSWORD_FILE] [-C]
               [-D] [-e EXTRA_VARS] [--vault-id VAULT_IDS]
               [--ask-vault-password | --vault-password-file VAULT_PASSWORD_FILES]
               [-f FORKS] [-M MODULE_PATH] [--playbook-dir BASEDIR]
               [--task-timeout TASK_TIMEOUT] [-a MODULE_ARGS] [-m MODULE_NAME]
               pattern
ansible: error: the following arguments are required: pattern

usage: ansible [-h] [--version] [-v] [-b] [--become-method BECOME_METHOD]
               [--become-user BECOME_USER]
               [-K | --become-password-file BECOME_PASSWORD_FILE]
               [-i INVENTORY] [--list-hosts] [-l SUBSET] [-P POLL_INTERVAL]
               [-B SECONDS] [-o] [-t TREE] [--private-key PRIVATE_KEY_FILE]
               [-u REMOTE_USER] [-c CONNECTION] [-T TIMEOUT]
               [--ssh-common-args SSH_COMMON_ARGS]
               [--sftp-extra-args SFTP_EXTRA_ARGS]
               [--scp-extra-args SCP_EXTRA_ARGS]
               [--ssh-extra-args SSH_EXTRA_ARGS]
               [-k | --connection-password-file CONNECTION_PASSWORD_FILE] [-C]
               [-D] [-e EXTRA_VARS] [--vault-id VAULT_IDS]
               [--ask-vault-password | --vault-password-file VAULT_PASSWORD_FILES]
               [-f FORKS] [-M MODULE_PATH] [--playbook-dir BASEDIR]
               [--task-timeout TASK_TIMEOUT] [-a MODULE_ARGS] [-m MODULE_NAME]
               pattern

Define and run a single task 'playbook' against a set of hosts

positional arguments:
  pattern               host pattern

options:
  --ask-vault-password, --ask-vault-pass
                        ask for vault password
  --become-password-file BECOME_PASSWORD_FILE, --become-pass-file BECOME_PASSWORD_FILE
                        Become password file
  --connection-password-file CONNECTION_PASSWORD_FILE, --conn-pass-file CONNECTION_PASSWORD_FILE
                        Connection password file
  --list-hosts          outputs a list of matching hosts; does not execute
                        anything else
  --playbook-dir BASEDIR
                        Since this tool does not use playbooks, use this as a
                        substitute playbook directory. This sets the relative
                        path for many features including roles/ group_vars/
                        etc.
  --task-timeout TASK_TIMEOUT
                        set task timeout limit in seconds, must be positive
                        integer.
  --vault-id VAULT_IDS  the vault identity to use
  --vault-password-file VAULT_PASSWORD_FILES, --vault-pass-file VAULT_PASSWORD_FILES
                        vault password file
  --version             show program's version number, config file location,
                        configured module search path, module location,
                        executable location and exit
  -B SECONDS, --background SECONDS
                        run asynchronously, failing after X seconds
                        (default=N/A)
  -C, --check           don't make any changes; instead, try to predict some
                        of the changes that may occur
  -D, --diff            when changing (small) files and templates, show the
                        differences in those files; works great with --check
  -K, --ask-become-pass
                        ask for privilege escalation password
  -M MODULE_PATH, --module-path MODULE_PATH
                        prepend colon-separated path(s) to module library
                        (default={{ ANSIBLE_HOME ~
                        "/plugins/modules:/usr/share/ansible/plugins/modules"
                        }})
  -P POLL_INTERVAL, --poll POLL_INTERVAL
                        set the poll interval if using -B (default=15)
  -a MODULE_ARGS, --args MODULE_ARGS
                        The action's options in space separated k=v format: -a
                        'opt1=val1 opt2=val2' or a json string: -a '{"opt1":
                        "val1", "opt2": "val2"}'
  -e EXTRA_VARS, --extra-vars EXTRA_VARS
                        set additional variables as key=value or YAML/JSON, if
                        filename prepend with @
  -f FORKS, --forks FORKS
                        specify number of parallel processes to use
                        (default=5)
  -h, --help            show this help message and exit
  -i INVENTORY, --inventory INVENTORY, --inventory-file INVENTORY
                        specify inventory host path or comma separated host
                        list. --inventory-file is deprecated
  -k, --ask-pass        ask for connection password
  -l SUBSET, --limit SUBSET
                        further limit selected hosts to an additional pattern
  -m MODULE_NAME, --module-name MODULE_NAME
                        Name of the action to execute (default=command)
  -o, --one-line        condense output
  -t TREE, --tree TREE  log output to this directory
  -v, --verbose         Causes Ansible to print more debug messages. Adding
                        multiple -v will increase the verbosity, the builtin
                        plugins currently evaluate up to -vvvvvv. A reasonable
                        level to start is -vvv, connection debugging might
                        require -vvvv.

Privilege Escalation Options:
  control how and which user you become as on target hosts

  --become-method BECOME_METHOD
                        privilege escalation method to use (default=sudo), use
                        `ansible-doc -t become -l` to list valid choices.
  --become-user BECOME_USER
                        run operations as this user (default=root)
  -b, --become          run operations with become (does not imply password
                        prompting)

Connection Options:
  control as whom and how to connect to hosts

  --private-key PRIVATE_KEY_FILE, --key-file PRIVATE_KEY_FILE
                        use this file to authenticate the connection
  --scp-extra-args SCP_EXTRA_ARGS
                        specify extra arguments to pass to scp only (e.g. -l)
  --sftp-extra-args SFTP_EXTRA_ARGS
                        specify extra arguments to pass to sftp only (e.g. -f,
                        -l)
  --ssh-common-args SSH_COMMON_ARGS
                        specify common arguments to pass to sftp/scp/ssh (e.g.
                        ProxyCommand)
  --ssh-extra-args SSH_EXTRA_ARGS
                        specify extra arguments to pass to ssh only (e.g. -R)
  -T TIMEOUT, --timeout TIMEOUT
                        override the connection timeout in seconds
                        (default=10)
  -c CONNECTION, --connection CONNECTION
                        connection type to use (default=smart)
  -u REMOTE_USER, --user REMOTE_USER
                        connect as this user (default=None)

Some actions do not make sense in Ad-Hoc (include, meta, etc)

 

이제 쿠버네티스 클러스터 생성을 위해 설정파일을 수정해줍니다.

(kube) choi@ubun20-01:~/kubespray$ cp -rfp inventory/sample inventory/mycluster
(kube) choi@ubun20-01:~/kubespray$ vi inventory/mycluster/hosts.yml

 

hosts.yml 파일 내의 host정보를 생성한 가상서버의 정보로 수정해줍니다.

 

all:
  hosts:
    ubun20-01:
      ansible_host: ubun20-01
    ubun20-02:
      ansible_host: ubun20-02
    ubun20-03:
      ansible_host: ubun20-03
  children:
    kube_control_plane:
      hosts:
        ubun20-01:
        ubun20-02:
        ubun20-03:
    kube_node:
      hosts:
        ubun20-01:
        ubun20-02:
        ubun20-03:
    etcd:
      hosts:
        ubun20-01:
        ubun20-02:
        ubun20-03:
    k8s_cluster:
      children:
        kube_control_plane:
        kube_node:
    calico_rr:
      hosts: {}

 

준비가 다되었으면 다시 kubespray 디렉터리로 이동해서 ansible을 실행시켜줍니다.

 

(kube) choi@ubun20-01:~/kubespray$ ansible-playbook -i inventory/mycluster/hosts.yml  --become --become-user=root cluster.yml

 

명령어를 실행하면 ansible이 클러스터를 설정합니다. 보통 10분 정도의 시간이 소요됩니다.

설정이 완료되면 다음과 같은 화면을 볼 수 있습니다.

 

만약 작업중에 에러가 발생한다면 처음부터 수행했던 과정중 문제가 발생한 부분을 다시 설정해주시는 것이 좋습니다.

설치가 완료되면 노드의 상태를 확인할 수 있습니다.

 

(kube) choi@ubun20-01:~$ sudo -i
root@ubun20-01:/home/choi# kubectl get nodes -o wide