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 Terminal 설치
https://www.microsoft.com/ko-kr/p/windows-terminal/9n0dx20hk701?rtc=1&activetab=pivot:overviewtab
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
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/
공식 가이드 그대로 따라 하시면 됩니다.
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가 실행 중인 걸 확인 가능합니다.
감사합니다.
'쿠버네티스 교육' 카테고리의 다른 글
Kubernetes 실습 과제 리스트 (0) | 2021.08.25 |
---|---|
02. kube 실습 과제 - kubectl 환경 최적화 및 kube tool 설치 (0) | 2021.07.26 |
Diamanti 교육 - dctl, kubectl Tool 설치 (0) | 2021.06.17 |
25. Kube 교육 - 중간 점검 (0) | 2021.06.16 |
24. Kube 교육 - Traefik Ingress L7 스위치 (0) | 2021.06.04 |