Kubernetes 설치를 저와 같이 했다면, addon으로 Dashboard도 설치가 되었을 것이다.

https://www.whatwant.com/entry/Kubernetes-Install-1

 

 

그런데, 정말 설치가 잘 되었을까?

K8s master 서버에 접속 후 한 번 살펴보자.

 

(master)$ kubectl get deployments --namespace kube-system

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
calico-kube-controllers      1/1     1            1           3d19h
coredns                      2/2     2            2           3d19h
dns-autoscaler               1/1     1            1           3d19h
kubernetes-dashboard         1/1     1            1           3d19h
kubernetes-metrics-scraper   1/1     1            1           3d19h
metrics-server               1/1     1            1           3d19h

 

오옷! 뭔가 보인다.

"kubernetes-dashboard"라는 항목이 보인다.

 

어떻게 접근해야할지 확인하기 위해 service 항목들을 살펴보자.

 

(master)$ kubectl get services --namespace kube-system

NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
coredns                     ClusterIP   10.233.0.3      <none>        53/UDP,53/TCP,9153/TCP   3d19h
dashboard-metrics-scraper   ClusterIP   10.233.43.183   <none>        8000/TCP                 3d19h
kubernetes-dashboard        ClusterIP   10.233.51.126   <none>        443/TCP                  3d19h
metrics-server              ClusterIP   10.233.30.232   <none>        443/TCP                  3d19h

 

아직 ClusterIP로만 연결되었기 때문에 K8s 밖에서 연결해볼 수 없는 상태다.

밖에서 접근할 수 있는 경로를 만들어보자.

 

dashboard의 service 항목을 수정해보자.

 

(master)$ kubectl edit service --namespace kube-system kubernetes-dashboard

 

ClusterIP 부분을 "NodePort"로 변경하면 된다.

 

...
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

 

다시 확인해보자.

 

(master)$ kubectl get services --namespace kube-system

NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
coredns                     ClusterIP   10.233.0.3      <none>        53/UDP,53/TCP,9153/TCP   3d21h
dashboard-metrics-scraper   ClusterIP   10.233.43.183   <none>        8000/TCP                 3d21h
kubernetes-dashboard        NodePort    10.233.51.126   <none>        443:31934/TCP            3d21h
metrics-server              ClusterIP   10.233.30.232   <none>        443/TCP                  3d21h

 

NodePort로 잘 변경되었으며 "31934"포트로 연결할 수 있음을 알려주고 있다.

바로 웹브라우져로 열어보자.

 

 

kubernetes-dashboard는 기본적으로 443포트, https 방식으로 제공되고 있다.

하지만, 당연하게도 인증서가 공인 인증서가 아니기에 ...

 

그러나, 고급 버튼을 누르면 길이 보인다.

 

 

안전하지 않다고 하지만, 전부 내거인데 뭐~ 그냥 이동하자 ^^

 

 

어!? 인증이 필요하단다.

이런...

 

그래... 권한이 필요하겠지...

 

 

dashboard를 위한 Service Account를 하나 생성하자.

 

(master)$ nano dashboard-serviceaccount.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
   name: k8s-dashboard
   namespace: kube-system

 

ClusterRole Admin 권한을 부여하자.

 

(master)$ nano dashboard-clusterrolebinding.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: k8s-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: k8s-dashboard
  namespace: kube-system

 

전부 create 해주면 된다.

 

(master)$  kubectl create -f dashboard-serviceaccount.yaml

(master)$  kubectl create -f dashboard-clusterrolebinding.yaml

 

만들어진 Service Account 정보를 살펴보자.

 

(master)$ kubectl describe serviceaccounts --namespace kube-system k8s-dashboard

Name:                k8s-dashboard
Namespace:           kube-system
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   <none>
Tokens:              <none>
Events:              <none>

 

어?! Tokens 부분에 아무런 정보가 없다! 이게 뭐지!?

https://kubernetes.io/docs/concepts/configuration/secret/#service-account-token-secrets

 

Kubernetes 1.22 이후 버전부터는 token이 자동 생성되지 않는단다! 이런!

 

(master)$ kubectl get nodes

NAME       STATUS   ROLES           AGE     VERSION
master     Ready    control-plane   3d20h   v1.25.6
worker01   Ready    <none>          3d20h   v1.25.6
worker02   Ready    <none>          3d20h   v1.25.6

 

나는 지금 v1.25.6 버전이구나.

그럼 직접 token을 생성하는 수밖에 ...

 

(master)$ nano dashboard-token.yaml

apiVersion: v1
kind: Secret
metadata:
  name: k8s-dashboard-secret
  annotations:
    kubernetes.io/service-account.name: "k8s-dashboard"
type: kubernetes.io/service-account-token

 

Service Account가 있는 kube-system namespace에다가 만들어주면 된다.

 

(master)$ kubectl create -f dashboard-token.yaml --namespace kube-system

 

만들어진 secret 정보를 살펴보면 token 정보도 보일 것이다.

 

(master)$ kubectl describe secrets --namespace kube-system k8s-dashboard-secret

Name:         k8s-dashboard-secret
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: k8s-dashboard
              kubernetes.io/service-account.uid: 037ee808-781e-424b-a17a-215113708a3b

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1099 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IkdBa0Mtc29XS1NGYl9pb1VuZzhpOHhQWlZaZEVOVTBIMWFQTHlVY21VNVUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrOHMtZGFzaGJvYX...

 

그러면, Service Account 정보를 다시 살펴보자.

 

(master)$ kubectl describe serviceaccounts --namespace kube-system k8s-dashboard

Name:                k8s-dashboard
Namespace:           kube-system
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   <none>
Tokens:              k8s-dashboard-secret
Events:              <none>

 

token 정보가 연결되었음을 볼 수 있다.

 

이제, 앞에서 확인한 token 정보를 복사한 뒤에 dashboard에 입력해보자.

 

 

음?! 표시할 데이터가 없단다.

얼마나 힘들게 여기까지 들어왔는데!!!!

 

 

검색창 옆에 namespace 부분을 "kube-system"으로 변경해보자.

 

 

뭔가 많이 보인다~~~!!!

 

 

 

눈에 뭔가 보이니까 좋다! ^^

반응형

간만에 Kubernetes 실습 환경 구축할 일이 생겨서

새로운 마음으로 진행하면서 기록으로 남겨 보고자 한다.

 

 

1. Server

  - master 1대 + worker 2대 = 총 3대의 Server를 준비하자.

  - 실습 환경은 VirtualBox로 하겠지만, 물리적인 Server로 이하 과정을 진행해도 무방하다.

 

VirtualBox

 

① CPU / Memory

  - Kubernetes 설치를 위해서는 다음과 같은 최소 사양이 필요하다

    . master: 2core, 2048MB

    . worker: 1core, 1280MB

  - 하지만, 원활한 동작을 위해서는 모두 2core, 2GB Spec으로 구성하자

 

CPU

 

Memory

 

② Network

  - VirtualBox의 경우 사실 NAT 방식으로도 Kubernetes 설치가 가능하긴 하다.

  - 하지만, 실제 서버 구성과 같은 환경으로 실습을 진행해보기 위해서는 브리지 방식으로 구성해보자.

 

네트워크

 

  - 보통 집에서 인터넷을 쓰는 방식이라고 하면 아래 그림과 같은 구성이 될 것이다.

 

 

③ Hostname, IP

  - 각 서버의 hostname 및 IP를 확인해 놓자.

 

hostname, IP

 

  - worker01 / worker02 서버들의 정보도 추가 확인하자.

 

 

2. Server Configure

  - Kubernetes 설치를 위해 서버 환경 셋팅을 좀 해줘야 한다.

  - 아래 과정은 서버 3대 모두 똑같이 진행해줘야 한다.

 

① swap off

  - K8s에서는 swap 기능이 켜져 있으면 문제가 발생할 수 있으므로 꺼줘야 한다.

 

(master/worker)$ sudo swapoff -a

(master/worker)$ sudo nano /etc/fstab

 

  - 재부팅되더라도 유지될 수 있도록 아래와 같이 swap 부분을 주석 처리해준다.

 

# /swap.img   none    swap    sw  0   0

 

② ip_forward

  - 가상화 머신끼리 패킷을 주고받을 수 있도록 ip_forward 기능을 켜줘야 한다.

 

(master/worker)$ sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

 

③ hosts

  - 서버끼리 서로 알 수 있도록 hosts 정보도 등록해주자.

 

(master/worker)$ sudo nano /etc/hosts

 

  - 정보는 각자 상황에 맞춰서...

 

192.168.100.150 master
192.168.100.151 worker01
192.168.100.152 worker02

 

  - 혹시 상단에 아래와 같은 부분이 있으면 삭제하자

 

127.0.0.1 master

 

 

 

여기까지 진행했으면 깔끔한 진행을 위해 재부팅을 한 번 해주자.

VirtualBox의 장점을 살리기 위해서는 안전한 진행을 위해 snapshot 한 번 찍어주는 것도 좋다.

 

 

3. Kubernetes 설치

  - Kubespray를 이용해서 Kubernetes 설치를 진행하도록 하겠다.

 

① Python3 설치

  - 일단 기본 패키지로 설치하자

 

(master)$ sudo apt install -y python3 python3-pip

 

② ssh-key 생성

  - 서버間 연결을 위해 ssh-key 생성 및 등록 과정이 필요하다.

  - 이와 관련해 가장 깔끔한 가이드 문서는 아래와 같다. 참고하면 좋다.

    . https://cloud.google.com/compute/docs/connect/create-ssh-keys?hl=ko 

 

  - 여기에서는 가장 간단하게 그냥 무조건 기본값으로 그냥 막 엔터만 쳐서 생성하도록 하자.

 

(master)$ ssh-keygen

Generating public/private rsa key pair.
Enter file in which to save the key (/home/whatwant/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/whatwant/.ssh/id_rsa
Your public key has been saved in /home/whatwant/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:MtIQVARuKNcksL0D3beQ2aMMbMYfcdybNFVZVRGgDnQ whatwant@master
The key's randomart image is:
+---[RSA 3072]----+
|....*=+. o.E.+o+*|
| * B B. = . o    |
|+ @ @ +. = .     |
| * * B oo o      |
|  o = = S  .     |
|   . . o         |
|                 |
|                 |
|                 |
+----[SHA256]-----+

 

③ copy key

  - ssh-key 인증을 통해 master에서 worker로 접속할 수 있도록 하기 위한 과정이다

  - 명령어에 있는 IP는 worker들의 IP이다. 각자 상황에 맞춰 사용하면 된다.

  - 자기 자신(master)에도 등록을 하자.

 

(master)$ ssh-copy-id 192.168.100.151

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/whatwant/.ssh/id_rsa.pub"
The authenticity of host '192.168.100.151 (192.168.100.151)' can't be established.
ED25519 key fingerprint is SHA256:Nu127IO/HdpFbO3HvWB8J61ZdhGjXpYDBSb3qg3rSY8.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
whatwant@192.168.100.151's password:

Number of key(s) added: 1

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

(master)$ ssh-copy-id 192.168.100.152

(master)$ ssh-copy-id 192.168.100.150

 

④ Kubespray 내려받기

  - git clone 방식으로 내려 받고, 최신 버전으로 switch 하자.

 

(master)$ git clone https://github.com/kubernetes-sigs/kubespray.git

(master)$ cd kubespray

(master)$ git switch release-2.21

 

⑤ 의존성 패키지 설치

  - Kubespray에서 필요로 하는 의존성 패키지들을 설치해주자

 

(master)$ sudo pip3 install -r requirements.txt

 

⑥ 인벤토리 생성

  - sample을 기반으로 나만의 설정을 업데이트해주면 된다.

  - 당연히 아래 IP 정보는 각자 상황에 맞춰서...

 

(master)$ cp -rfp inventory/sample inventory/mycluster


(master)$ declare -a IPS=(192.168.100.150 192.168.100.151 192.168.100.152)
(master)$ CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}

 

  - 이렇게 생성된 hosts.yaml 파일을 확인 및 수정하자.

 

(master)$ nano ./inventory/mycluster/hosts.yaml

 

  - 아래 수정 내역은 공부를 위한 설정이다. 실제 운영 환경이라면 기본 설정대로 하는 것이 낫다.

 

all:
  hosts:
    master:
      ansible_host: 192.168.100.150
      ip: 192.168.100.150
      access_ip: 192.168.100.150
    worker01:
      ansible_host: 192.168.100.151
      ip: 192.168.100.151
      access_ip: 192.168.100.151
    worker02:
      ansible_host: 192.168.100.152
      ip: 192.168.100.152
      access_ip: 192.168.100.152
  children:
    kube_control_plane:
      hosts:
        master:
    kube_node:
      hosts:
        worker01:
        worker02:
    etcd:
      hosts:
        master:
    k8s_cluster:
      children:
        kube_control_plane:
        kube_node:
    calico_rr:
      hosts: {}

 

  - addon은 다음 3가지 정도만 설정해보자.

 

(master)$ nano ./inventory/mycluster/group_vars/k8s_cluster/addons.yml
dashboard_enabled: true
helm_enabled: true
metrics_server_enabled: true

 

  - proxy mode도 iptables로 설정하자.

 

(master)$ nano ./inventory/mycluster/group_vars/k8s_cluster/k8s-cluster.yml
# Kube-proxy proxyMode configuration.
# Can be ipvs, iptables
kube_proxy_mode: iptables

 

⑦ install

  - 이제 설치를 진행하자 !

 

(master)$ ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root cluster.yml

 

  - 혹시라도 에러가 발생하면 윗 단계들을 다시 한 번 꼼꼼하게 살펴보기 바란다.

  - 지금 직접 해보면서 포스팅하는 것이기에, 분명히 된다 !!! ^^

 

 

4. kubectl

  - master 서버에서 root 아닌 계정도 kubectl 명령을 사용할 수 있도록 하자

 

① 인증 정보 복사

  - root 계정에 등록된 인증 정보를 복사해오면 된다.

 

(master)$ mkdir -p ~/.kube

(master)$ sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config

(master)$ sudo chown $(id -u):$(id -g) ~/.kube/config

 

② 자동완성

  - bash 쉘 환경에서 자동완성 기능을 추가하려면 다음과 같이 하면 된다.

 

(master)$ echo 'source <(kubectl completion bash)' >>~/.bashrc

(master)$ source ~/.bashrc

 

③ check

  - 잘 동작하는지 해보자.

 

(master)$ kubectl cluster-info

Kubernetes control plane is running at https://127.0.0.1:6443

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.


(master)$ kubectl get nodes

NAME       STATUS   ROLES           AGE   VERSION
master     Ready    control-plane   21m   v1.25.6
worker01   Ready    <none>          20m   v1.25.6
worker02   Ready    <none>          20m   v1.25.6

 

 

잘 된다!!!!!

 

반응형

 

1대의 개발PC에서

여러 대의 Server 환경을 구축하고자 할 때 VirtualBox를 이용하곤 한다.

 

VirtualBox

 

Kubernetes 실습 환경을 구축하기 위해서

master 1대 + worker 2대 = 총 3대의 Ubuntu Server 머신이 필요한 경우를 생각해보자.

 

개인적인 취향으로 Ubuntu를 애용하는데,

Ubuntu를 설치하고 나면 locale 설정, timezone 설정 等 나름 여러가지로 셋팅을 할 것들이 많다.

 

그렇게 우선 master 역할을 할 1대의 Ubuntu Server를 셋팅을 했다고 해보자.

- https://www.whatwant.com/entry/Ubuntu-Server-2204-LTS

 

이제 worker 역할을 할 2대의 Ubuntu Server를 만들어야 하는데,

다시 또 OS 설치하고 셋팅하는 과정을 반복해야하는 것은 너무나 비효율적인 것 같다.

 

그래서 VirtualBox의 머신 복제 기능을 이용해보고자 한다.

 

복제

 

좀 더 많은 정보를 보려면 "전문가 모드"를 선택하면 된다.

원하는 머신 이름과 경로(Path)를 입력하고, MAC 정책은 새로운 MAC 주소 설정을 하도록 하자.

 

설정

 

이걸로 준비는 끝났다.

"Finish"를 눌러주면 복사가 이뤄진다. 생각보다 오래걸린다(개인적인 PC 환경 차이일 수도 있다^^).

 

Finish

 

이것으로 끝났을까!? 아니다!!!

일단 시작해서 부팅해보자.

 

부팅

 

여기에서 어떤 것이 문제가 될 수 있는지 찾아보기 바란다! ^^

 

$ hostname

master

 

그렇다! 원본과 같은 hostname을 쓰고 있다.

그러면 바꿔주면 된다 ^^

 

$ sudo hostnamectl set-hostname worker01

$ hostname

worker01

 

여기까지~

 

반응형

 

간만에 Server 버전을 설치해야할 상황이 생겨서 기록을 남겨보고자 한다.

 

https://ubuntu.com/download/server

 

현재 정확한 버전은 22.04.02 LTS 이다.

Server 버전임에도 용량이 1.8GB 라니 .... 대박이구만...

 

일단 아래 과정은 Windows 10 Host 환경의 VirtualBox 7.0.6 버전에서 진행을 했다.

 

운영체제는 Ubuntu (64-bit) 로 선택해야 한다.

 

VirtualBox - OS

 

지금 필요로 하는 환경이 낮은 Spec이어야 해서 2GB 메모리로만 설정을 했고,

core가 2개 이상이어야 해서 일단 2개로 선택했다.

 

VirtualBox - HW

 

디스크 용량은 어짜피 동적 용량이기에 조금은 여유있게 설정해주는 것이

혹시 모를 나중에 대비해 바람직한 선택이다.

 

VirtualBox - HDD

 

네트워크 설정은 "NAT"를 선택하는 것이 일반적이지만,

여기에서는 "어댑터에 브리지"를 선택해서 Host와 동일한 레벨에서 IP를 받을 수 있도록 하겠다.

(집에서 공유기를 쓰는 환경이라고 하면 공유기로부터 IP를 직접 받도록 하는 것)

 

VirtualBox - Network

 

이제 다운로드 받은 Ubuntu Server ISO 이미지를 등록해서 부팅 및 설치를 진행하자.

별도로 설명하지 않은 부분은 기본 설정으로 진행한 것이다.

 

Ubuntu Server

 

IP도 잘 받아온 것을 볼 수 있다.

 

IP

 

기본이 LVM 이다. 흐음... 그냥 가자.

 

LVM

 

기본 설정은 free 공간을 두는데, 그냥 전체를 다 사용하는 것으로 변경해보자.

 

Before

 

ubuntu-lv 설정을 아래와 같이 잡아주면 된다.

 

edit

 

after

 

OpenSSH server 설치는 필수다!!!

 

OpenSSH server

 

설치가 끝나면 Close 해줘야 한다.

 

Close

 

재부팅 하면 아래와 같이 에러 화면이 나오기도 한다.

걱정하지 말자.

 

cloud-init

 

엔터 한 번 치고

앞에서 입력한 계정 및 패스워드 치면 로그인 된다.

 

login

 

기분 나쁘게 에러 발생한 패키지부터 삭제하자

 

$ sudo apt purge cloud-init

 

sudo 했을 때 패스워드 입력하는게 기분나쁘니(?) 해결하자.

 

$ sudo visudo

 

제일 밑에 아래와 같이 (각자 계정으로) 입력해놓고 저장하면 된다.

 

whatwant ALL=(ALL) NOPASSWD:ALL

 

패키지 전체적으로 업데이트 및 업그레이드 하자.

 

$ sudo apt update

$ sudo apt upgrade

 

아래와 같은 화면이 나올 수 있는데, 그냥 바로 OK 하자.

 

 

필요 없는 것들 지우고 깔끔히 재부팅하자.

 

$ sudo apt autoremove

$ sudo reboot

 

 

Server에서 굳이 한글이 필요할까 싶지만, 그래도 세종대왕님을 생각하며...

 

$ sudo apt install language-pack-ko

$ sudo locale-gen ko_KR.UTF-8

$ sudo dpkg-reconfigure locales

$ sudo update-locale LANG=ko_KR.UTF-8 LC_MESSAGES=POSIX

 

locale

 

네트워크 관련 도구들을 사용하기 위해 net-tools 패키지를 설치하자.

 

$ sudo apt install net-tools

 

많이 쓰는 git 패키지도 설치하고, 기본 환경 설정까지 해놓자.

 

$ sudo apt install git

$ git config --global user.name "whatwant"
$ git config --global user.email "whatwant@gmail.com"

 

우리는 한국에 살고 있으니, TimeZone을 맞춰보자.

 

$ sudo timedatectl

               Local time: 금 2023-04-14 16:14:51 UTC
           Universal time: 금 2023-04-14 16:14:51 UTC
                 RTC time: 금 2023-04-14 16:14:51
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

 

정확한 TimeZone 명칭을 확인해보고,

 

$ sudo timedatectl list-timezones | grep Seoul

Asia/Seoul

 

설정해주면 된다.

 

$ sudo timedatectl set-timezone Asia/Seoul

$ sudo timedatectl

               Local time: 토 2023-04-15 01:16:05 KST
           Universal time: 금 2023-04-14 16:16:05 UTC
                 RTC time: 금 2023-04-14 16:16:05
                Time zone: Asia/Seoul (KST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

 

심지어 "System clock synchronized: yes"라고 되어있는 것을 보면 시간 동기화 설정도 이미 되어있다!

 

 

 

개인적인 취향에 따른 설정도 추가적으로 해보자.

 

vi를 싫어하고 nano를 사용하기에 nano 기본 설정값을 넣어보겠다.

 

$ nano ~/.nanorc

 

tab을 공백 4칸으로 설정하는 것이다.

 

set tabsize 4
set tabstospaces

 

root 권한으로 사용하는 경우, 특히 sudo 사용할 때를 위해서 추가적으로... (내용은 동일)

 

 $ sudo nano /root/.nanorc

 

 

지극히 개인적인 취향으로 작업 공간 설정도 해놓겠다.

 

$ sudo mkdir /srv/workspace
$ sudo mkdir /srv/install

$ sudo chown whatwant:whatwant /srv/workspace/
$ sudo chown whatwant:whatwant /srv/install/

 

Server 환경이니만큼 굳이 zsh 등까지는 설치하지 않겠다.

 

 

추가적으로 VirtualBox Guest-Additions를 설치해보자.

GUI 환경이 없기에 생략할 수도 있긴 한데.... 그래도 성능 향상이 있다고 하니 해보자.

 

게스트 확장 CD 이미지

 

우리는 지금 Server 버전의 Ubuntu이기에 직접 마운트 작업을 해줘야 한다 ^^

 

$ sudo mkdir /media/cdrom

$ sudo mount /dev/cdrom /media/cdrom

 

해당 디렉토리로 이동해보자.

 

$ cd /media/cdrom/

$ ls -al

total 41763
dr-xr-xr-x 5 root root     2570  1월 12 01:28 .
drwxr-xr-x 3 root root     4096  4월 15 13:40 ..
-r--r--r-- 1 root root     1049  8월 23  2022 AUTORUN.INF
dr-xr-xr-x 2 root root     1252  1월 12 01:28 NT3x
dr-xr-xr-x 2 root root     2828  1월 12 01:28 OS2
-r--r--r-- 1 root root      592  1월 12 01:28 TRANS.TBL
-r--r--r-- 1 root root  2202917  1월 11 23:38 VBoxDarwinAdditions.pkg
-r-xr-xr-x 1 root root     4225  1월 11 23:35 VBoxDarwinAdditionsUninstall.tool
-r-xr-xr-x 1 root root  5968312  1월 11 23:36 VBoxLinuxAdditions.run
-r--r--r-- 1 root root  9332736  1월 11 23:38 VBoxSolarisAdditions.pkg
-r-xr-xr-x 1 root root 15755216  1월 12 01:27 VBoxWindowsAdditions-amd64.exe
-r-xr-xr-x 1 root root  9227840  1월 12 01:08 VBoxWindowsAdditions-x86.exe
-r-xr-xr-x 1 root root   243728  1월 11 23:38 VBoxWindowsAdditions.exe
-r-xr-xr-x 1 root root     6849  1월 11 23:35 autorun.sh
dr-xr-xr-x 2 root root     1468  1월 12 01:28 cert
-r-xr-xr-x 1 root root     5097  1월 11 23:35 runasroot.sh
-r--r--r-- 1 root root      259 10월  2  2021 windows11-bypass.reg

 

Guest-Additions를 설치하기 위해서 필요한 패키지들을 먼저 설치해줘야 한다.

 

$ sudo apt install -y dkms build-essential linux-headers-generic linux-headers-$(uname -r)

 

이제 설치를 진행하면 된다.

 

$ sudo ./VBoxLinuxAdditions.run

 

무슨 이상한 에러메시지가 나올 수 있으나 쫄지 말자.

GUI 환경이 없기에 발생하는 것이다.

 

재부팅하고 잘 설치되었는지 확인까지 해보자.

 

$ sudo reboot

---

$ lsmod | grep vbox

vboxguest             434176  0

$ modinfo vboxguest

filename:       /lib/modules/5.15.0-69-generic/misc/vboxguest.ko
version:        7.0.6 r155176
license:        GPL
description:    Oracle VM VirtualBox Guest Additions for Linux Module
author:         Oracle and/or its affiliates
srcversion:     55B45B43FE1759D12174E93
alias:          pci:v000080EEd0000CAFEsv00000000sd00000000bc*sc*i*
depends:
retpoline:      Y
name:           vboxguest
vermagic:       5.15.0-69-generic SMP mod_unload modversions

 

여기까지~ 끝~

반응형

ChatGPT의 인기에 힘입어

이제는 AI/ML을 공부하지 않는 분들도 누구나 알고 있다는 트랜스포머(Transformer)

 

너무나 훌륭한 공부 자료들이 많기에

여기에서는 그 자료들을 알아보도록 하겠다.

 

 

1. Paper

- "Attention Is All You Need"

  . https://arxiv.org/abs/1706.03762#

- 2017년도에 Ashish Vaswani 외 7명이 작성한 15 pages, 5 figures 구성된 논문

  . 논문에 포함된 그림의 수준이 정말 '역시 구글'이다.

 

model architecture

 

 

2. Review

- [딥러닝 기계 번역] Transformer: Attention Is All You Need (꼼꼼한 딥러닝 논문 리뷰와 코드 실습)
  . https://www.youtube.com/watch?v=AA621UofTUA 

  . 구독자가 16만명이 넘는 "동빈나"님의 멋진 리뷰

 

- Transformer 외에도 나동빈님의 많은 리뷰들이 담겨있다.

  . https://github.com/ndb796/Deep-Learning-Paper-Review-and-Practice#natural-language-processing-자연어-처리

 

 

동빈나 - Transformer 리뷰

 

- Code Practice

  . https://github.com/ndb796/Deep-Learning-Paper-Review-and-Practice/blob/master/code_practices/Attention_is_All_You_Need_Tutorial_(German_English).ipynb 

  . 위 링크에서 "Open in Colab"을 선택하면 Colab을 통해서 실행해볼 수 있다.

  . "Drive로 복사" 선택

Colab

 

  . 오래 전에 만들어진 코드이다 보니 지금 실행하면 맞지 않는 부분이 있으니 아래와 같이 수정하자.

import spacy

# spacy_en = spacy.load('en') # 영어 토큰화(tokenization)
# spacy_de = spacy.load('de') # 독일어 토큰화(tokenization)

spacy_en = spacy.load('en_core_web_sm')
spacy_de = spacy.load('de_core_news_sm')

 

 

3. More Detail

- 트랜스포머(Transformer) 심층 분석

  . https://wandb.ai/wandb_fc/korean/reports/-Transformer---Vmlldzo0MDIyNDc
  . 아래와 같이 몇 몇 부분에 대한 개선 방안을 엿볼 수 있다.

 

 

sample

 

- Transformer Positional Encoding

  . https://hongl.tistory.com/231

  . Positional Encoding에서 사용되는 sin/cos 함수에 대한 고찰

 

Transformer Positional Encoding

 

- Tensorflow 공식 가이드

  . https://www.tensorflow.org/text/tutorials/transformer?hl=ko

 

tensorflow

 

  . Colanb에서 실행을 선택하면 아래와 같이 예쁘게 표현된 encoder-decoder 애니메이션을 볼 수 있다.

 

encoder-decoder

 

 

4. Visualize

- Jay Alammar: The Illustrated Transformer

  . https://jalammar.github.io/illustrated-transformer/

 

The Illustrated Transformer

 

 

5. Extra

- Hugging Face

  . https://huggingface.co/

  . 자연어 처리를 공부/활용하는 분이라면 누구나 아는 그 곳

 

Hugging Face

 

- Transformers (신경망 언어모델 라이브러리) 강좌

  . https://wikidocs.net/book/8056

  . Hugging Face 사용법을 배울 수 있는 너무나 좋은 교재

 

Transformer 강좌

 

- Transformers.js

  . 트랜스포머를 브라우저에서 실행할 수 있도록 해주는 JS

  . https://xenova.github.io/transformers.js/

  . BERT, ALBERT, DistilBERT, T5, T5v1.1, FLAN-T5, GPT2, BART, CodeGen, Whispe 등 지원

 

Transformer.js

 

여기까지~

반응형

ChatGPT로 온세상이 떠들썩하다.

얼마전 발표한 GPT-4는 어지간한 인간보다 더 똑똑하다고 난리다.

 

이런 GPT와 같은 언어 모델의 바탕이 되는 것이 바로 트랜스포머(Transformers)이다.

 

과거(?) 딥러닝을 공부한다고 하면

이미지 처리를 위한 CNN 계열들 공부하고, 시계열 데이터를 다루기 위한 RNN 계열들 공부하고...

나중에 가면 음성처리 하던지 이미지 디텍션이라던지 하는 도메인별 특성에 따른 연구/공부를 하곤 했는데,

요즘은 그냥 무조건 그 끝은 전부 트랜스포머이다.

 

음성처리와 같은 것들도 그냥 End-to-End Model을 트랜스포머로 구성하곤 한다.

 

말 그대로 그냥 닥치고 트랜스포머인 세상이다.

 

표지

 

NLP를 공부하면서 Transformer를 공부한다고 하면

논문부터 찾아서 encoder가 어쩌고 decoder가 어쩌고 Self-attention이 뭐고.... 공부를 하곤 하는데,

 

우리가 직접 GPT 같은 것을 만들어야 한다면 이런 공부가 필수이겠지만

OpenAI와 같은 충분한 인력과 자본이 없다면

지금 우리에게 필요한 것은 활용이다.

 

초판

 

원서를 찾아보면 2022년 1월에 초판이 나왔고, 22년 5월에 Revised Color Edition이 나왔다.

번역본은 아마도 22년 5월에 나온 Revised Edition을 기반으로 했을테니, 아직은 1년이 되지 않은 책이다 ^^

 

옮긴이

 

옮긴이는 개인적으로 너무나 좋아하는 박해선님이다.

박해선님의 책은 무조건 추천!!! 와아~~~!!!

 

NLP 성장 동력

 

NLP 혁명의 성장 동력은 트랜스포머, 사전 훈련한 모델, 허깅페이스의 3가지라고 한다.

 

저자 자랑

 

결국은 책 자랑인데 ^^

트랜스포머 개발자와 허깅페이스 개발자들이 모여서 책을 썼으니

이 책은 킹왕짱 !!!

 

거기에다가 옮긴이가 박해선님이라니 !!!

정말 울츠라 슈퍼 초 킹왕짱 !!!

 

대상 독자

 

이 책은 절대 입문서가 아니다.

그리고 활용을 주 목적으로 한다.

 

예제 코드

 

위의 3개 사이트는 그냥 그런게 있다라고 하면 된다.

그런데, 3번째로 나와있는 '페이퍼스페이스 그레이디언트 노트북'이라는 곳은

처음 듣는 것이라 접속을 해봤더니 '404'로 페이지를 찾을 수 없었다.

 

- https://www.paperspace.com/gradient/notebooks

 

위 주소로 접속할 수 있었는데, 뭐 사실 그냥 구글 코랩이면 충분하지 싶다 ^^

 

github

 

박해선님의 책을 좋아하는 이유는 정말 정말 충실한 예제 코드 제공이다.

꼼꼼히 직접 실행해보시며 만들어주시는 예제는 정말 정말 애정이다.

 

타임라인

 

정말 긴 시간인 것 같지만 Transformer가 세상에 나온지는 얼마되지 않았다.

그리고 InstructGPT/GPT-3.5 이어서 얼마전 나온 GPT-4까지 ...

 

전이 학습

 

허깅페이스를 활용해서 우리가 해볼 것은 위와 같은 전이 학습이다.

 

허깅페이스

 

허깅페이스를 통해 데이터셋을 다운로드 받을 수 있다.

별것 아닌 것처럼 보이지만, 정말 편리하다.

 

결론

 

각 챕터의 뒷 부분에는 위와 같은 결론을 제공해준다.

그냥 단순한 summary가 아니라 참고 자료도 제공해주고, 어떤 의미가 있는지도 친근하게(?) 정리해준다.

 

아키텍처

 

흔하게 볼 수 있는 이미지가 아니라,

나름의 방법으로 표현된 아키텍처를 볼 수 있어서 좋았다.

 

 

이 책을 살펴보면서 느낀점은 다음과 같다.

딥러닝 공부를 하면서 트랜스포머가 무엇인지 맛을 본 분들에게 활용에 대해서 안내해주는 친절한 가이드.

 

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

반응형

우연히 보게된 노마드 코더(Nomad Coders)의 유튜브.

파이썬 코드만가지고 JS, React, NextJS 인터랙티브 웹앱을 만들어주는 프레임워크가 나타났단다.

 

 

최근 정말 많은 주목을 받고 있는 오픈소스 프로젝트인 것은 분명한 것 같다.

 

https://pynecone.io/

 

Pynecone: The easiest way to build web apps.

Completely customizable. All Pynecone components are fully customizable. Change the colors, fonts, and styles to match your project. Styling guide ->

pynecone.io

 

발음이 같은 'pinecone'을 상징하는 솔방울을 로고로 사용하고 있다 ^^

 

공식 웹사이트도 Pynecone을 사용해서 만들었다고 한다.

왠지 Unix is Not Unix 같은 느낌인데!? 아닌가?! ^^

 

 

Pynecone은 파이썬으로 작성한 코드를

React/NextJS로 컴파일을 하는 방식이기에 성능이 뛰어나며 그래서 node를 필요로 하고 있다.

 

보다 더 나은 성능을 위해 node를 bun으로 교체하는 작업을 하고 있지만

아직 100% 호환성을 보장하지 못하기에 당분간은 node를 계속 필요로 할 것이라고 한다.

 

 

서두가 길었다.

이제 직접 한 번 사용해보자.

 

 

이하 과정은 다음 링크의 내용을 따라갔다.

- https://pynecone.io/docs/getting-started/installation

 

 

0. PoC Environment

  - 이하 과정을 진행한 환경은 Ubuntu 20.04 64bit Desktop 이다.

 

 

2. Prerequisites

  - Python 3.7+

  - NodeJS 12.22.0+

 

  ① Python 여러 버전을 관리할 수 있는 pyenv 기반으로 설치해보자.

    . https://www.whatwant.com/entry/pyenv

    . 설치한 버전은 다음과 같이 했다.

      - v3.8.16

 

  ② node 설치도 여러 버전을 관리할 수 있는 nvm 기반으로 설치를 진행해보자.

    . https://www.whatwant.com/entry/npm

    . 설치한 버전은 다음과 같이 했다.

      - v18.15.0   (Latest LTS: Hydrogen)

 

 

3. Virtual Environment

  - Optional 이라지만, 사실 필수이지 않을까 싶다.

❯ cd ./workdir

❯ python -m venv .venv

source .venv/bin/activate

 

 

4. Installing

  - 이제 pynecone 설치하면 된다!

 pip install pynecone

 

 

5. Create a Project

  - 일단 프로젝트 생성하는 방법부터 알아보자.

 mkdir my_app_name

 cd my_app_name

 pc init

 

 

6. Run the App

  - 일단 한 번 띄워보자.

 pc run

 

  - 브라우저로 확인해보자.

 

 

 

7. Edit

  - 본문을 살짝 살펴보자.

❯ nano my_app_name/my_app_name.py

  - 눈꼽만큼 변경해보자.

"""Welcome to Pynecone! This file outlines the steps to create a basic app."""
from pcconfig import config

import pynecone as pc

docs_url = "https://pynecone.io/docs/getting-started/introduction"
filename = f"{config.app_name}/{config.app_name}.py"


class State(pc.State):
    """The app state."""

    pass


def index() -> pc.Component:
    return pc.center(
        pc.vstack(
            pc.heading("Welcome to WHATWANT!", font_size="2em"),
            pc.box("Get started by editing ", pc.code(filename, font_size="1em")),
            pc.link(
                "Check out our docs!",
                href=docs_url,
                border="0.1em solid",
                padding="0.5em",
                border_radius="0.5em",
                _hover={
                    "color": "rgb(107,99,246)",
                },
            ),
            spacing="1.5em",
            font_size="2em",
        ),
        padding_top="10%",
    )


# Add state and page to the app.
app = pc.App(state=State)
app.add_page(index)
app.compile()

 

  - 포트도 변경하고, debug log도 찍어보자.

❯ pc run --port 8282 --loglevel debug

 

  - http://localhost:8282/

 

 

8. Fast Refresh

  - Pynecone은 실시간으로 변경 사항이 반영된다.

  - 웹브라우저가 띄워져 있는 상황에서, 다른 터미널로 파일을 수정해보자.

❯ nano my_app_name/my_app_name.py

 

  - 파일을 수정한 뒤, 저장을 하면 조금 있다가 브라우저에 자동으로 페이지 내용이 변경된다.

 

 

 

일단 여기까지 살짝 맛만 봤고

시간이 나면 다음 단계로 넘어가보겠다. (시간이 날까?! ^^)

 

반응형

 

AI로 그린 그림이 엄청나게 유행이다.

카툰과 같은 그림 뿐만 아니라 이제는 사진과 같은 실사 느낌의 그림까지 나오고 있다.

 

best-inventions-2022-OpenAI-DALL-E-2

 

AI 그림이라는 것은

자연어 서술로부터 이미지를 생성하는 Machine-Learning 모델로 만들어진 것을 의미하는데,

 

요즘 ChatGPT 라는 것으로 이제는 누구나 알게 된 OpenAI라는 곳에서 개발(?)한

DALL·E 2로 인해서 AI로 그린 그림이 유명해지게 되었고

 

2022년 콜로라도의 미술대회에서 1등을 차지한 그림이

Midjourney 라는 ML 모델로 만들어진 것이라는 것이 밝혀지면서 엄청난 논란이 되었었다.

 

Midjourney

 

이렇게 AI로 그림 그리는 것이 엄청난 유행을 하고 있는데,

명색이 IT로 밥 값을 벌고 있는 입장에서 직접 한 번 다뤄봐야 하지 않을까?!

 

 

 

DALL·E 2, Midjourney 와 같은 모델들은 모두 상용으로 서비스 되고 있다.

하지만, 우리가 원하는 것은?! 오픈소스!!!

 

 

https://github.com/CompVis/stable-diffusion

 

Stable-Diffusion

 

Stable-Diffusion은 2022년 8월에

Stability AI에서 오픈소스 라이선스로 배포한 text-to-image 인공지능 모델이다.

 

오픈소스이지만 상용 모델 못지 않은 성능을 보여주며

더더군다나 비교적 낮은 컴퓨팅 파워 환경에서도 구동이 가능하다 !!!

 

 

그리고, 오픈소스 프로젝트로 공개되었다보니

이를 기반으로 파생된 정말 유용한 프로젝트들이 정말 많다.

 

 

https://github.com/AUTOMATIC1111/stable-diffusion-webui/

 

Stable Diffusion web UI

 

CLI 방식이 아니라 웹 기반의 Interface를 이용해

Stable Diffusion 모델을 편리하게 사용할 수 있도록 만들어 주는 프로젝트이다.

 

그리고 여기에 덧붙여서

Colab에서 구동 가능하도록 해주는 프로젝트도 있다!!!

 

 

https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Online-Services

 

Online Services - Colab

 

위 목록 중에서 camenduru를 선택해보자.

 

https://github.com/camenduru/stable-diffusion-webui-colab

 

 

https://github.com/camenduru/stable-diffusion-webui-colab

 

Jupyter Notebook 형태로 제공해주고 있는데,

어떤 것을 선택하면 좋을지는 README 를 참고하면 된다.

 

colab

 

카툰 스타일 보다는 실사와 같은 것들을 해보고 싶어서 "dreamlike-photoreal-2.0"을 선택해 보았다.

Huggingface에 있는 설명들을 참고하자.

 

https://huggingface.co/dreamlike-art/dreamlike-photoreal-2.0

 

음... 뭔지는 잘 모르겠지만

Stable-Diffusion 1.5 버전을 기반으로 해서 만들어진 사진과 같은 이미지를 생성하는 모델이란다.

 

이런 것들을 만들 수 있단다.

 

example

 

그러면, 원하는 모델에 있는 "Open in Colab" 아이콘을 클릭하자.

 

link

 

Colab에서 열리고 나면, "Drive에 사본 저장" 메뉴를 통해 복사해놓자.

 

Drive에 사본 저장

 

상단에 "노트북 설정"을 할 수 있다고 나오는데, 링크를 클릭하자.

 

비공개 출력

 

설정창이 열렸으니

'하드웨어 가속기' 부분에서 GPU를 선택하고

하단에 있는 체크 박스 부분도 설정 해제해놓자.

 

셀 출력

 

위 설정창은 "런타임 유형 변경" 메뉴로도 설정 확인 및 변경 가능하다.

 

런타임 유형 변경

 

자~ 이제 준비는 다 되었다.

런타임 연결(실행)하자.

 

연결중

 

그리고 코드를 실행하면 된다.

 

실행

 

엄청 오래걸리니 (5분~10분 사이) 그동안 유용한 사이트 하나 가입하자.

 

https://civitai.com/

 

https://civitai.com/

 

AI 그림들을 자랑하고 공유하는 곳이다.

 

Tifa

 

따라해보고 싶은 그림이 있으면 그림 오른쪽 하단에 있는 ⓘ 부분을 눌러보면 된다.

 

prompt

 

그러면, 어떤 Prompt, Parameter로 만들었는지 정보를 얻을 수 있다.

 

text-to-image 모델에서 그림을 그리기 위해 사용한 text를 "prompt"라고 지칭한다.

원하지 않는 내용에 대한 설명(text)는 "negative prompt"라고 한다.

 

또한, 원하는 그림에 대한 설명 외에

어떤 sampler인지, Random 함수에 대한 Seed 값이라던지 하는 온갖 설정값들 정보도 중요하다.

 

 

이쯤 했으면 Colab 실행 완료되었을테니, 계속 이어서 진행해보면 ...

 

URL

 

잘 실행이 되었으면, 위와 같은 URL 정보가 보일 것이다.

가운데에 있는 "*.gradio.app" URL을 선택해서 클릭하면 창이 뜰 것이다.

 

Run

 

와우!!!

나만의 AI 그림 생성기가 나타났다 !!!

 

 

어떻게 사용하면 되는지도 알아볼 겸해서, 남들이 만들어 놓은 것을 참조해보자.

CIVITAI에서 우리가 선택한 "dreamlike photoreal 2.0"을 검색해보자.

 

dreamlike photoreal 2.0을 이용해서 만들어진 그림을 찾기 위함이다.

 

Dreamlike Photoreal 2.0

 

찾은 다음에 마음에 드는 이미지 하나 선택해서 ⓘ를 클릭해서 정보를 확인해보자.

 

sample

 

Prompt, Negative prompt를 비롯해서 Sampling Steps, Sampling method, CFG Scale, Seed 값 등도 모두 넣어주자.

 

generate

우와~~~!!! 나온다 !!!

 

당연하게도 완전히 똑같은 그림이 나오지는 않지만, 얼추 비슷한 이미지가 나온다.

 

 

 

이제, 시간과 정신의 방으로 갈 시간이다.

다양하게 이것 저것 바꿔보면서 만들다보면 ... 날짜가 바뀌어 있을 것이다 ^^

 

반응형

+ Recent posts