Ubuntu 환경에서 Docker 설치를 조금은 색다르게 해보고자 한다.

 

여러 편한 방법이 있겠지만, 직접 버전을 선택해서 패키지 파일을 내려 받아 설치하는 것이다.

특정 버전을 직접 관리하면서 사용할 수 있다는 장점이 있다.

 

 

1. Ubuntu 버전 확인

  - 지금 사용하고 있는 버전이 어떤 것인지 확인을 해보자.

 

❯ lsb_release -a

No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.6 LTS
Release: 20.04
Codename: focal

 

 

2. Docker 패키지 파일 확인

  - 어떤 버전이 있는지, 그리고 다운로드 주소가 어떻게 되는지 확인 해보자.

    . https://download.docker.com/linux/ubuntu/dists/

 

 

  - 우리가 확인해야할 패키지는 다음의 3 종류이다.

    . containerd

    . docker-ce-cli

    . docker-ce

 

 

3. 패키지 다운로드 및 설치

  - 이제 내려받아서 설치하자.

 

❯ wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/containerd.io_1.6.21-1_amd64.deb
❯ wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-ce-cli_23.0.6-1~ubuntu.20.04~focal_amd64.deb
❯ wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-ce_23.0.6-1~ubuntu.20.04~focal_amd64.deb

❯ sudo dpkg --install ./containerd.io_1.6.21-1_amd64.deb
❯ sudo dpkg --install ./docker-ce-cli_23.0.6-1~ubuntu.20.04~focal_amd64.deb
❯ sudo dpkg --install ./docker-ce_23.0.6-1~ubuntu.20.04~focal_amd64.deb

 

 

4. 실행 권한 설정

  - root가 아닌 현재 사용자 계정에서 docker를 사용하기 위해 그룹 설정을 해주자.

 

❯ sudo usermod -aG docker $USER

 

  - 설정한 다음, 재부팅 또는 로그 오프 후 재로그인을 해줘야 한다.

  - 그리고 잘 되는지 확인해보자.

 

❯ docker --version

Docker version 23.0.6, build ef23cbc

 

 

5. 실습을 위한 파일 작성

  - docker build 실습을 위한 파일 2개를 다음과 같이 준비하자.

 

❯ nano index.html

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Kubernetes</title>
</head>
<body>
  <h2>Hello, This is K8s World</h2>
</body>
</html>

 

❯ nano Dockerfile

FROM nginx:latest

COPY ./index.html /usr/share/nginx/html/index.html

 

 

6. docker build

  - 이미지 생성해보자.

  - 마지막에 . 찍어주는 것 잊지 말자 ^^

 

❯ docker build -t webserver .

DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
            Install the buildx component to build images with BuildKit:
            https://docs.docker.com/go/buildx/

Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM nginx:latest
latest: Pulling from library/nginx
9e3ea8720c6d: Pull complete 
bf36b6466679: Pull complete 
15a97cf85bb8: Pull complete 
9c2d6be5a61d: Pull complete 
6b7e4a5c7c7a: Pull complete 
8db4caa19df8: Pull complete 
Digest: sha256:480868e8c8c797794257e2abd88d0f9a8809b2fe956cbfbc05dcc0bca1f7cd43
Status: Downloaded newer image for nginx:latest
 ---> 448a08f1d2f9
Step 2/2 : COPY ./index.html /usr/share/nginx/html/index.html
 ---> 32317f8e7b5c
Successfully built 32317f8e7b5c
Successfully tagged webserver:latest

 

  - 응?! DEPRECATED ?! BuildKit을 사용해야 한단다.

 

 

7. BuildKit 설치

  - docker 패키지 살펴볼 때 눈치 빠르신 분은 이미 찾았을 것이다.

 

 

❯ wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-buildx-plugin_0.10.4-1~ubuntu.20.04~focal_amd64.deb

❯ sudo dpkg --install ./docker-buildx-plugin_0.10.4-1~ubuntu.20.04~focal_amd64.deb

 

 

 

8 docker buildx build

  - 이제 새롭게 빌드해보자. 명령어는 크게 다르지 않다.

 

❯ docker buildx build -t webserver2 .

[+] Building 0.4s (7/7) FINISHED                                                                                                                                
 => [internal] load build definition from Dockerfile                                                                                                       0.1s
 => => transferring dockerfile: 107B                                                                                                                            0.0s
 => [internal] load .dockerignore                                                                                                                                  0.1s
 => => transferring context: 2B                                                                                                                                    0.0s
 => [internal] load metadata for docker.io/library/nginx:latest                                                                                      0.0s
 => [internal] load build context                                                                                                                                   0.1s
 => => transferring context: 199B                                                                                                                                0.0s
 => [1/2] FROM docker.io/library/nginx:latest                                                                                                              0.2s
 => [2/2] COPY ./index.html /usr/share/nginx/html/index.html                                                                                     0.1s
 => exporting to image                                                                                                                                                 0.1s
 => => exporting layers                                                                                                                                                0.1s
 => => writing image sha256:3f0130968d1e78db17dc061d1363da5f49c8157a1a73ffb10d923d9d7af16af               0.0s
 => => naming to docker.io/library/webserver2 

 

여기까지~

 

 

간만에 docker build 해봤다가 명령어가 deprecated 되었다고 해서 깜짝 놀라 급히 정리해봤다 ^^

 

 

반응형

구글에서 "chatgpt"를 검색하고 뉴스 항목을 선택하면 아래와 같은 뉴스가 보인다. (2023-04-30)

  - https://www.google.com/search?q=chatgpt&tbm=nws 

 

 

많은 사람들, 특히 기업 입장에서는 기업 내부의 비밀들이 유출될 우려가 있기에 머리가 아플 것이다.

 

심지어 이탈리아에서는 국가차원에서 chatgpt를 차단하기도 했었다. 물론 지난 금요일(04/28)에 차단을 해지하기는 했지만 개인정보 유출이라던지 기밀사항에 대한 유출 우려에 대해서 모두들 심각하게 받아들이고 있음을 엿볼 수 있다.

 

그래서 openai에서 사용자들의 이력 사항들을 학습에 사용하지 않도록 할 수 있는 옵션을 추가해줬다.

 

 

옵션을 해제하면 이력을 관리하지 않는다고는 하는데.... 믿어야겠죠!? ^^

 

 

뭐 이런 심각한 이야기는 잠시 미뤄두고... ^^

 

 

youtube에서 "chatgpt 개발"이라는 키워드로 검색해보면 많은 동영상들을 볼 수 있다.

 

 

구글에 "chatgpt debugging", "Unit Test Generation with ChatGPT" 등의 키워드로 검색해보면

정말 유용하고 신기한 많은 사례들을 찾아볼 수 있다.

 

그리고 아래와 같이 kubeflow를 어떻게 설치해야하는지 등과 같은 질문에도 나름 대답을 하기도 하고,

 

 

카카오톡 메시지를 보내는 파이썬 코드를 보여달라고하면 아래와 같이 샘플 코드를 보여주기도 한다.

 

 

개발할 때 chatgpt를 이용하면 분명 많은 도움이 될 것 같다.

물론 GitHub Copilot보다 더 유용할지에 대해서는 여러 의견이 있을 수 있지만

사용하기에 따라서 다른 의미로 chatgpt가 유용할 수 있음은 분명한 사실일 것이다.

 

 

여기에서 다시 한 번 생각해보자.

회사와 같은 곳에서 chatgpt를 이용해서 개발을 하는 것에 문제가 될까? 안될까?

 

질문(chatgpt 세상에서는 prompt라고 불리우는!?)에 너무 많은 내부 정보를 담는 것은 무조건 문제가 될 것이다.

그러면, 질문을 할 때 보내는 정보만 조심하면 문제가 안될까!?

 

내가 생각해보았을 때 2가지 정도가 더 문제가 될 수 있다고 본다.

 

① 검색 결과 품질

② 검색 결과 출처

 

 

"chatgpt"는 질문에 대해서 나름의 대답을 한가지 해준다.

그것이 원하는 결과가 아니라고 하면 추가 질문을 통해서 다른 대답을 받아볼 수는 있지만

기본적으로 기존 검색엔진과 같이 여러가지를 보여주는 방식은 아니다.

 

그리고,

해당 결과의 출처가 무엇인지를 알 수 없기에 가져다 써도 무방한 것인지

혹시 compliance 이슈가 있을 수 있는 것인지도 확인이 어렵다.

 

더더욱 문제가 되는 것은

GPT3 및 GPT4 모두 데이터가 2021년 8월까지의 데이터로 학습되어있기에 최신 정보에 약하다.

물론 검색 결과를 다시 입력으로 넣는 등의 방법으로 우회할 수 있다고는 하지만

이는 변칙적인 우회 방법이지 제대로 된 chatgpt의 사용 방법은 아니다.

 

 

 

이런 부분들을 조금은 해소해 줄 수 있는, 개발자들을 위한 AI 검색엔진이 등장했다.

  - https://www.phind.com/

 

 

하단에 있는 문구가 아주 재미있다.

 

Made with ❤️ in San Francisco.

 

미국의 이런 문화가 좀 신기해보이면서도 재미있게 느껴지고, 왠지 멋져보이기까지 한다.

음... 나는 "Made with ❤️ in Dong Tan" 이렇게 해볼까!? ^^

 

검색 결과는 어떻게 나오는지 살펴볼까!?

 

 

chatgpt 화면과 비슷하면서도 좀 다르다.

가운데에 나름의 답변을 해주면서, 그 대답을 만들기 위한 출처 목록을 오른쪽에 보여주고 있다.

 

chatgpt 처럼 Session 개념이 있기에 추가적인 검색을 같은 맥락으로 이어가며 할 수 있다.

또한 현재 검색 결과를 반영하기 때문에 최신 정보들도 잘 가지고 온다.

 

왼쪽 하단에 있는 "Customize search" 버튼을 눌러보자.

 

 

내가 특정 개발 사이트를 좀 더 선호한다던지, 아니면 특정 사이트 결과를 좀 후순위로 하고 싶다던지 하면

그러한 옵션들을 반영할 수 있다.

 

 

전문가(Expert) 모드도 있고, 좀 더 간략히 본다거나, 좀 더 창의적인 결과를 나오게 할 수도 있다.

그냥 구글 검색하는 것 보다는 좀 더 효율적으로 활용할 수 있는 검색엔진이 아닐까 한다.

 

 

하지만, phind도 정보 유출 등의 우려에서 자유롭지는 않다.

 

 

anonymously 하게 저장되고, 3rd party에 정보를 공유하지 않는다고 하지만

여하튼 내가 입력한 질문을 가지고 자신들의 서비스를 향상시키는데 사용한단다.

 

 

그렇다면,

chatgpt를 대체하는 용도로서 사용하기 보다는 그냥 google을 사용하는 것을 대체하는 용도라고 생각해야 한다.

 

 

설마 회사에서 google까지 막지는 않을테니 ^^

google 대신 사용하는 개발자를 위한 검색엔진으로 phind를 사용해보자.

반응형

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가 아니라 참고 자료도 제공해주고, 어떤 의미가 있는지도 친근하게(?) 정리해준다.

 

아키텍처

 

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

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

 

 

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

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

 

 

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

반응형

+ Recent posts