쿠버네티스 교육

01. Kube 실습 과제 - Kubespray 이용 Kube Cluster 설치

Jerry_이정훈 2021. 7. 26. 09:24
728x90

Kube 실습 과제

  • WSL, Window Terminal, Visual Studio Code 설치
  • Kubespray 이용 Kubernetes Cluster 설치(1 or 3 node)
    : crio, metallb 사용 조건
  • Kubectl 설치 및 Remote Kube Cluster 관리를 위한 Local PC 환경 세팅
  • Kube Cluster의 물리 노드 정보 및 전체 POD 정보 확인

Why WSL, Window Terminal, Visual Studio Code

Kube 작업을 하면 반복되는 일들이 많습니다. Cluster도 여러 번 지웠다 만들었다 하고, POD도 이름만 달리해서 NGINX, HTTPD 등 설치하구요. 이러한 반복 작업을 빠르게 하려면 Tool이 필요합니다. 흔히 개발자 분들이 개발 환경 세팅 하기 위해서 시간을 소요 하듯이 Kube 작업을 위한 개발 환경 세팅에 시간이 필요합니다.

 

다행히 윈도우 기준으로 WSL, Window Terminal, VS Code 정도면 충분합니다.(Mac 유저는 더 편하겠군요.) 시간을 들여서 위 3가지 Tool들을 꼭 설치하시길 바랍니다.

 

WSL, Window Terminal, Visual Studio Code 설치

자세한 설치 과정은 생략하고(구글링 가능하므로) 아래 링크로 대신 합니다.

 

WSL 설치

https://docs.microsoft.com/ko-kr/windows/wsl/install-win10

 

Windows 10에 WSL 설치

Bash 터미널을 사용하여 Linux 배포(Ubuntu, Debian, SUSE, Kali, Fedora, Pengwin 및 Alpine 포함)를 Windows 10 머신에 설치하는 방법을 알아봅니다.

docs.microsoft.com


Windows Terminal 설치

https://www.microsoft.com/ko-kr/p/windows-terminal/9n0dx20hk701?rtc=1&activetab=pivot:overviewtab

 

Windows Terminal 구매 - Microsoft Store ko-KR

Microsoft Store에서 이 Windows 10용 앱을 다운로드하세요. 스크린샷을 보고, 최신 고객 리뷰를 읽고, Windows Terminal에 대한 평점을 비교하세요.

www.microsoft.com

Windows Terminal Tip

Windows terminal 사용하고 default로 Ubuntu 사용하면 Window 환경에서도 동일하게 Linux 사용 가능합니다. MAC iTerms 굳이 부러워 할 필요 없습니다. 

 

화면 가로, 세로 분할 (Shift + Alt + ‘+’ 세로 분할, + ‘-’ 가로 분할)

저는 화면 분할해서 주로 작업 내역을 확인하거나 붙여넣기 등을 할 때 편하게 활용합니다.

(여러 창에 동시에 명령어 수행(terminator 지원 기능)하는 건 구글신 검색해도 잘 안나오네요.. ^^ 주로 ansible로 대신합니다.)

 

기타 Ctrl + Shift + w (탭 닫기) 

 

조금 익숙해지면 저보다 훨씬 더 많은 단축키 등을 찾을 수 있을 것 같습니다.

 

Visual Studio Code 설치

https://webnautes.tistory.com/1197

 

Visual Studio Code 설치하는 방법( Windows / Ubuntu )

Visual Studio Code를 Windows와 Ubuntu에 각각 설치하는 방법을 설명합니다. 설치를 진행해본 운영체제 버전은 Windows 10과 Ubuntu 20.04 /Ubuntu 18.04 입니다.           1. 윈도우에 설치하는 방법..

webnautes.tistory.com

VSCode Tip

Tip이라고 하기에도 민망한 기본 기능이지만 제가 자주 쓰는 단축키, 기능입니다.

 

여러 줄 한번에 들여쓰기(indent), Ctrl + ] ([ 내어쓰기(?), 반대로 indent)

여러 줄 한번에 주석 처리 (ctrl + /, 주석 해제)

2개 파일 비교하기(diff). 주로 Helm file 신규 설치 시 기존 version의 values.yaml 파일과 비교 용도로 사용합니다. (오른쪽 마우스 클릭)  

VSCode 내 WSL Terminal 바로 실행 (Ctrl + `) 

Git Extension 사용 

Kubespray 이용 Kubernetes Cluster 설치.(1 or 3 node)

: Container Runtime - crio, metallb 사용 조건

 

먼저, Ansible 실행을 위하여 kube cluster 설치할 VM 관련 정보를 수정합니다. Kube cluster 설치에 사용할 VM은 2Core/8G 이상 권장합니다. VM 여유가 있으시면 3 VM에 설치하시는 것을 권고 드리고 여유가 없으시면 단일 VM에 설치하셔도 됩니다. kubespray 설정 파일은 단일 노드, 복수 노드 동일하며 ansible inventory 파일만 변경 하시면 됩니다.

 

로컬 PC /etc/hosts 파일 등록

[spkr@erdia22 11. Files (ubuns:vm)]$ cat /etc/hosts |grep ubun2010
172.17.29.60    ubun2010

passwd 없이 ssh 가능하도록 key 등록합니다. ssh key 없는 경우 ssh-keygen 으로 신규 생성합니다.

[spkr@erdia22 ~ (ubuns:vm)]$ ssh-copy-id -f spkr@ubun2010
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/spkr/.ssh/id_rsa.pub"

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'spkr@ubun2010'"
and check to make sure that only the key(s) you wanted were added.

[spkr@erdia22 ~ (ubuns:vm)]$ ssh spkr@ubun2010
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-65-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

Passwd 없이 sudo 가능하도록 VM에서 사용자 권한 수정합니다.

spkr@spk:~$ sudo visudo
spkr    ALL=(ALL)       NOPASSWD:ALL

다음으로, Github에서 kubespray 코드를 다운 받습니다.

[spkr@erdia22 07.kubespray (spkcluster:default)]$ git clone https://github.com/kubernetes-sigs/kubespray
Cloning into 'kubespray'...
remote: Enumerating objects: 54955, done.
remote: Counting objects: 100% (432/432), done.
remote: Compressing objects: 100% (288/288), done.
remote: Total 54955 (delta 184), reused 318 (delta 119), pack-reused 54523
Receiving objects: 100% (54955/54955), 15.88 MiB | 13.34 MiB/s, done.
Resolving deltas: 100% (30966/30966), done.

이제, Kubespray 공식 가이드에 따라 설치를 진행합니다. 가이드에 따라 Ansible 설치가 필요 합니다.

 [spkr@erdia22 kubespray-1.21 (k3s:default)]$ sudo pip3 install -r requirements.txt 
The directory '/home/spkr/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/spkr/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Collecting ansible==2.9.20 (from -r requirements.txt (line 1))
  Downloading https://files.pythonhosted.org/packages/ed/53/01fe1f54d8d408306b72c961e573223a0d95eca26d6c3b59d57a9c64e4ef/ansible-2.9.20.tar.gz (14.3MB)
    100% |████████████████████████████████| 14.3MB 84kB/s 
Collecting cryptography==2.8 (from -r requirements.txt (line 2))
  Downloading https://files.pythonhosted.org/packages/45/73/d18a8884de8bffdcda475728008b5b13be7fbef40a2acc81a0d5d524175d/cryptography-2.8-cp34-abi3-manylinux1_x86_64.whl (2.3MB)
    100% |████████████████████████████████| 2.3MB 389kB/s 
Collecting jinja2==2.11.3 (from -r requirements.txt (line 3))
  Downloading https://files.pythonhosted.org/packages/7e/c2/1eece8c95ddbc9b1aeb64f5783a9e07a286de42191b7204d67b7496ddf35/Jinja2-2.11.3-py2.py3-none-any.whl (125kB)
    100% |████████████████████████████████| 133kB 5.1MB/s 
Requirement already satisfied: netaddr==0.7.19 in /usr/local/lib/python3.7/dist-packages (from -r requirements.txt (line 4))
Requirement already satisfied: pbr==5.4.4 in /usr/local/lib/python3.7/dist-packages (from -r requirements.txt (line 5))
Requirement already satisfied: jmespath==0.9.5 in /usr/local/lib/python3.7/dist-packages (from -r requirements.txt (line 6))
Requirement already satisfied: ruamel.yaml==0.16.10 in /usr/local/lib/python3.7/dist-packages (from -r requirements.txt (line 7))
Requirement already satisfied: MarkupSafe==1.1.1 in /home/spkr/.local/lib/python3.7/site-packages (from -r requirements.txt (line 8))
Requirement already satisfied: PyYAML in /home/spkr/.local/lib/python3.7/site-packages (from ansible==2.9.20->-r requirements.txt (line 1))
Requirement already satisfied: cffi!=1.11.3,>=1.8 in /home/spkr/.local/lib/python3.7/site-packages (from cryptography==2.8->-r requirements.txt (line 2))
Requirement already satisfied: six>=1.4.1 in /home/spkr/.local/lib/python3.7/site-packages (from cryptography==2.8->-r requirements.txt (line 2))
Requirement already satisfied: ruamel.yaml.clib>=0.1.2; platform_python_implementation == "CPython" and python_version < "3.9" in /home/spkr/.local/lib/python3.7/site-packages (from ruamel.yaml==0.16.10->-r requirements.txt (line 7))
Requirement already satisfied: pycparser in /home/spkr/.local/lib/python3.7/site-packages (from cffi!=1.11.3,>=1.8->cryptography==2.8->-r requirements.txt (line 2))
Installing collected packages: jinja2, cryptography, ansible
  Found existing installation: Jinja2 2.11.1
    Uninstalling Jinja2-2.11.1:
      Successfully uninstalled Jinja2-2.11.1
  Found existing installation: cryptography 3.3.1
    Uninstalling cryptography-3.3.1:
      Successfully uninstalled cryptography-3.3.1
  Found existing installation: ansible 2.9.16
    Uninstalling ansible-2.9.16:
      Successfully uninstalled ansible-2.9.16
  Running setup.py install for ansible ... done
Successfully installed ansible-2.9.20 cryptography-2.8 jinja2-2.11.3

저는 hosts.yml 파일 생성 시 아래와 같이 에러가 발생하여 수동으로 hosts.yml 파일을 생성 하였습니다.

[spkr@erdia22 kubespray-1.21 (k3s:default)]$ CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}
Traceback (most recent call last):
  File "contrib/inventory_builder/inventory.py", line 40, in <module>
    from ruamel.yaml import YAML
ModuleNotFoundError: No module named 'ruamel'
inventory/mycluster/hosts.yml 파일 내용 

[spkr@erdia22 kubespray-1.21 (k3s:default)]$ cp -rfp inventory/sample inventory/mycluster

VS Code를 열어 아래와 같이 Ansible inventory 파일을 수정합니다. 

vi inventory/mycluster/hosts.yml 
all:
  hosts:
    ubun2001:
      ansible_host: ubun2001
    # ubun20-2:
    #   ansible_host: ubun20-2
    # ubun20-3:
    #   ansible_host: ubun20-3
  children:
    kube-master:
      hosts:
        ubun2010:
        # ubun20-2:
        # ubun20-3:
    kube-node:
      hosts:
        ubun2010:
        # ubun20-2:
        # ubun20-3:
    etcd:
      hosts:
        ubun2010:
        # ubun20-2:
        # ubun20-3:
    k8s-cluster:
      children:
        kube-master:
        kube-node:
    calico-rr:
      hosts: {}

다음으로 설치 관련된 몇가지 옵션을 변경합니다. 역시 VS Code 환경에서 수정하시는 것을 권고합니다.

vi inventory/mycluster/group_vars/k8s_cluster/k8s_cluster.yml

# configure arp_ignore and arp_announce to avoid answering ARP queries from kube-ipvs0 interface
# must be set to true for MetalLB to work
kube_proxy_strict_arp: true

## docker for docker, crio for cri-o and containerd for containerd.
container_manager: crio

# audit log for kubernetes
kubernetes_audit: true

container run time을 docker에서 crio로 변경하면 inventory/mycluster/group_vars/etcd.yml 파일을 아래와 같이 ‘host’로 수정하셔야 합니다.

## Settings for etcd deployment type
etcd_deployment_type: host

이제, 설치를 진행합니다.

[spkr@erdia22 kubespray-1.21 (kspray:default)]$ ansible-playbook -i inventory/mycluster/hosts.yml --become --become-user=root cluster.yml 

(생략) 

Friday 23 July 2021  14:03:00 +0900 (0:00:00.024)       0:08:50.363 ***********
Friday 23 July 2021  14:03:00 +0900 (0:00:00.024)       0:08:50.388 ***********
Friday 23 July 2021  14:03:00 +0900 (0:00:00.025)       0:08:50.413 ***********

PLAY RECAP *********************************************************************************************************************************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
ubun2010                   : ok=591  changed=138  unreachable=0    failed=0    skipped=1139 rescued=0    ignored=2

Friday 23 July 2021  14:03:00 +0900 (0:00:00.022)       0:08:50.436 ***********
===============================================================================
container-engine/cri-o : Install cri-o packages ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 43.13s
kubernetes/control-plane : kubeadm | Initialize first master ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- 30.88s
kubernetes/preinstall : Update package management cache (APT) ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- 19.36s
kubernetes/preinstall : Install packages requirements ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 15.47s
download_container | Download image if required ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 14.10s
kubernetes/control-plane : Master | wait for kube-scheduler ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 13.82s
download_container | Download image if required ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 12.65s
container-engine/cri-o : Add CRI-O kubic cri-o apt repo ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 11.79s
container-engine/cri-o : Add CRI-O kubic apt repo ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 11.22s
download_container | Download image if required ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 10.64s
download_container | Download image if required ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 10.42s
download_container | Download image if required ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 10.31s
download_container | Download image if required ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 9.18s
download_file | Download item ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 8.98s
reload etcd ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 8.72s
kubernetes-apps/ansible : Kubernetes Apps | Start Resources ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 7.99s
download_container | Download image if required ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 7.73s
download_container | Download image if required ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 7.25s
kubernetes-apps/ansible : Kubernetes Apps | Lay Down CoreDNS templates -------------------------------------------------------------------------------------------------------------------------------------------------------------- 6.84s
download_file | Download item ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 5.82s

단일 노드 설치 기준으로 총 8분 50초가 소요되었네요.

 

이상으로 kubespray 이용하여 단일 노드에 Kube cluster 설치가 완료 되었습니다. 

 

Why 원격 Cluster 로컬 PC 관리

아직 많은 분들이 원격 Cluster 관리를 로컬 PC 혹은 Bastion 서버 등이 중앙 서버가 아닌 직접 원격 서버에 접속해서 관리하고 있습니다. 아마도 기존 VM 관리하는 방식 그대로 따라해서 그런 것 같습니다.

 

하지만, 이러면 시간이 낭비 됩니다. 위 설치한 VS Code도 사용하지 못하니 일일이 vi 열어서 YAML 파일 작업하는것은 굉장히 비 효율적입니다. 그리고 많은 kubectl 명령어를 Alias 두어 간단히 실행하는 것도 일일이 작업해야 하는 등 많이 번거롭습니다. 

 

반드시 로컬 PC에서 관리 하도록 설정하는 것을 추천합니다.

 

Kubectl 설치 및 Remote Kube Cluster 관리를 위한 Local PC 환경 세팅(WSL, Window Terminal)

먼저,  WSL 환경에 kubectl Toolkit을 설치 합니다.

https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-linux/

 

리눅스에 kubectl 설치 및 설정

시작하기 전에 클러스터의 마이너(minor) 버전 차이 내에 있는 kubectl 버전을 사용해야 한다. 예를 들어, v1.21 클라이언트는 v1.20, v1.21, v1.22의 컨트롤 플레인과 연동될 수 있다. 최신 버전의 kubectl을

kubernetes.io

공식 가이드 그대로 따라 하시면 됩니다. 

spkr@erdia22:/mnt/c/Users/erdia$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   154  100   154    0     0     28      0  0:00:05  0:00:05 --:--:--    34
100 44.2M  100 44.2M    0     0  3545k      0  0:00:12  0:00:12 --:--:-- 11.1M

spkr@erdia22:/mnt/c/Users/erdia$ sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
[sudo] password for spkr:

spkr@erdia22:/mnt/c/Users/erdia$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.3", GitCommit:"ca643a4d1f7bfe34773c74f79527be4afd95bf39", GitTreeState:"clean", BuildDate:"2021-07-15T21:04:39Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"linux/amd64"}

다음으로 원격 Kube Cluster를 로컬 PC에서 관리하기 위하여 원격 VM의 ~/.kube/config 정보를 로컬 PC로 Copy 합니다.

 

VM에 접속합니다.

[spkr@erdia22 kubespray (ubuns:vm)]$ ssh ubun2010

root 계정의 ~/.kube/config 파일을 열어서 해당 내용을 local pc에 copy 합니다. 

spkr@ubun2010:~$ sudo bash
root@ubun2010:/home/spkr# su -
root@ubun2010:~# cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3F
(생략)
    server: https://127.0.0.1:6443
  name: cluster.local
contexts:
- context:
    cluster: cluster.local
    user: kubernetes-admin
  name: kubernetes-admin@cluster.local
current-context: kubernetes-admin@cluster.local
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJUlVrVXJPSVZwen
(생략)
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBMHVPNXhLMT
(생략)

창을 2개를 두고 위 내용을 로컬 PC ~/.kube/config copy 합니다. 원활한 작업을 위하여 vi 가 아닌 VS Code를 이용하여 작업하는 것을 권고 합니다.

주의 해야 할 사항으로 아래와 같이 IP 정보를 로컬이 아닌 원격 서버의 IP로 변경합니다.

Cluster
- Cluster
 server: https://172.17.29.60:6443
name: ubun2010

: VM의 실제 IP를 명시합니다.
: name 은 다른 cluster와 구분하기 쉬운 임의의 이름으로 합니다.

contexts:
- context:
    cluster: ubun2010
    user: ubun2010
  name: ubun2010

cluster, user, name 정보를 구분이 쉽게 단일 이름으로 설정합니다. (cluster, user 정보와 동일하게만 하시면 됩니다.)

users:
- name: ubun2010
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJUlVrVXJPSVZwen
(생략)
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBMHVPNXhLMT
(생략)

: contexts 에 등록한 이름과 name을 동일하게 맞추어 줍니다.

 

Kube Cluster의 물리 노드 정보 및 전체 POD 정보 확인

이제 원격 Cluster 관리를 위한 준비가 완료 되었습니다. 로컬 PC에서 kubectl 명령어를 통하여 원격 Cluster 노드 정보 확인이 가능합니다. 

[spkr@erdia22 kubespray (ubun2010:default)]$ kubectl get nodes
NAME       STATUS   ROLES                  AGE   VERSION
ubun2010   Ready    control-plane,master   25m   v1.21.2

파드 확인은 kubectl get pod로 확인이 가능하며 전체 파드는 -A(all namespace) 옵션 추가합니다.

[spkr@erdia22 kubespray (ubun2010:default)]$ kubectl get pod -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-5b4d7b4594-j6gwv   1/1     Running   0          26m
kube-system   calico-node-dnh9f                          1/1     Running   0          26m
kube-system   coredns-8474476ff8-scgt2                   0/1     Pending   0          26m
kube-system   coredns-8474476ff8-tj6bt                   1/1     Running   0          26m
kube-system   dns-autoscaler-7df78bfcfb-bb4zh            1/1     Running   0          26m
kube-system   kube-apiserver-ubun2010                    1/1     Running   0          27m
kube-system   kube-controller-manager-ubun2010           1/1     Running   0          27m
kube-system   kube-proxy-8cmnr                           1/1     Running   0          26m
kube-system   kube-scheduler-ubun2010                    1/1     Running   0          27m
kube-system   nodelocaldns-4ljxs                         1/1     Running   0          26m

정상적으로 node가 실행 중인 걸 확인 가능합니다.

 

감사합니다.

반응형