GitHub-Actions를 어떻게 사용했는지 기억도 잘 떠오르지도 않고

Secret을 어떻게 다뤘는지도 기억이 가물거려서 간단한 예제 겸 교육자료로 써먹고자 진행해봤다.

 

1. git clone

  - 각자 상황에 맞는 Repository를 이용하면 된다.

❯ git clone git@github.com:whatwant-school/node-web.git

 

 

2. coding

  - 예제를 위해, node.js 웹 서비스를 하나 만들어 보자.

❯ nano app.js

  - 그냥, 간단히 어느 host에서 서비스를 하고 있는 것인지를 보여주는 웹페이지이다.

const http = require('http');
const os = require('os');
console.log(“node-web server starting...");
var handler = function(request, response) {
  console.log("Received request from " + request.connection.remoteAddress);
  response.writeHead(200);
  response.end("You've hit " + os.hostname() + "\n");
};
var www = http.createServer(handler);
www.listen(8080);

 

 

3. write Dockerfile

  - 위에서 작성한 웹서비스를 구동할 container image를 어떻게 구성할지를 작성해보자.

❯ nano Dockerfile

  - 내용은 심플하다.

FROM node:latest

ADD app.js /app.js

ENTRYPOINT ["node", "app.js"]

 

 

4. ready DockerHub

  - Actions를 이용해 만들어진 container image를 업로드할 DockerHub의 Repository를 준비하자.

  - 이미 1.0 버전이 있지만 해당 버전을 업데이트하는 방식으로 구성할 것이다.

 

 

5. get Token

  - Actions에서 DockerHub로 업로드 하기 위해서는 계정 인증이 필요하고, 이 때 사용할 Token을 발행해보자.

  - Write 권한을 필수로 넣어줘야 한다.

 

 

6. mkdir

  - Repository 내부에 Actions workflow를 작성할 경로를 생성하자.

❯ mkdir -p .github/workflows/

 

 

7. write Action

  - 내가 사용할 Action workflow를 작성하자.

❯ nano .github/workflows/deploy-image.yml

  - 일부 내용은 각자의 상황에 맞춰서 업데이트 하면 된다.

name: Build and Push Docker Image
on:
  push:
    branches:
      - main  
jobs:
  build-and-push-image:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v1

    - name: Login to DockerHub
      uses: docker/login-action@v1
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_TOKEN }}

    - name: Build and push
      id: docker_build
      uses: docker/build-push-action@v2
      with:
        push: true
        tags: whatwant/node-web:1.0

 

 

8. Set Secret

  - Action workflow에서 사용하는 Secret 변수 값을 입력하자.

  - USERNAME과 TOKEN을 입력하면 된다.

 

 

 

9. push

  - 이제 준비는 끝났다. push 해보자.

❯ git add -A

❯ git commit -m "make action's workflow"

❯ git push origin main

 

 

10. Actions

  - 입력한대로 잘 동작했는지 확인해보자.

  - 상세 내용도 확인해볼 수 있다.

 

  - 로그 레벨로도 확인해볼 수 있다.

 

  - 정말 DockerHub에 업로드까지 잘 되었는지 확인해보자.

 

 

여기까지~

 

반응형

IT 관련 직업에 있는 사람이 아니더라도

최근 대부분의 사람들이 모두 알고 있을 ChatGPT !!!

 

그냥 심심풀이로 사용해보는 것에서 그치지 않고

본인의 업무에 실제로 도움이 되도록 사용하려면 어떻게 해야하는지를 알려주는 책이 나왔다.

 

 

ChatGPT는 이름 그대로 Chatting 방식을 통해서 인터페이스(interface)를 하는 도구이다.

그렇기에 어떻게 대화를 해야하는지가 대단히 중요하고

이러한 대화법을 바로 "프롬프트(prompt)"라고 한다.

 

이 책은

원하는 결과를 얻기 위한 프롬프트 작성 방법을 알려주는 책이다.

 

 

따끈따끈한 ChatGPT와 관련된 책이기에 번역본이 아니라 생각했는데 (시간이 좀 걸리는 것이 일반적이기에)

"이안 클레이턴"이라는 분이 쓴 책을 "김상규"님이 옮기셨다.

 

 

2023년 5월 12일에 초판 1쇄가 발행된 따끈따끈한 신간이다.

 

크게 3부로 구성된 책이다.

 

 

1부에서는 프롬프트에 대해서 알아야할 것들을 소개해준다.

 

 

2부에서는 본격적으로 산업별로 어떻게 프론프트를 작성해야하는지를 알려준다.

 

 

3분에서는 자기 계발을 위해 어떻게 ChatGPT를 활용할 수 있는지를 알려준다.

 

 

메인이 되는 내용은 2부에 있는 산업별 프롬프트 부분인데,

여기에서 소개해주는 산업 분야를 보면 엄청나게 세분화 되어 있다.

자신이 속한 산업 분야를 찾아보면 되는 것이다.

 

 

책의 내용을 보면 다양한 상황과 조건에 대해서 Example 형식으로 보여준다.

 

 

책을 보다보면 좀... 왠지 성의 없어보이는 페이지도 보이긴 하지만,

자세히 살펴보면 조금씩 미묘하게 차이가 있는 모두 필요한 내용들이다.

 

 

글을 쓰고자 할 때 알아야할 내용들을 설명해주는 페이지를 살펴보자.

 

쓰고자 하는 글의 분류가 어떻게 되는지

글의 핵심 요소가 무엇인지를 잘 설명해주고 있다.

이런 내용들을 파악하고 있어야 ChatGPT를 제대로 활용할 수 있는 것이다.

 

그냥 무조건 글을 써달라고 하면

ChatGPT는 그냥 그저그런 내용만 답변할 뿐이다.

 

구체적으로 무엇을 어떻게 해야하는지,

지금 필요로 하는 내용이 어떤 것인지 명확히 전달을 해줘야

그에 걸맞는 내용을 답변한다.

 

 

뉴스에서 새로 생긴 프롬프트 개발자의 연봉이 엄청 높다는 이야기가 나오면

고작 ChatGPT와 대화하는 것이 왜 그런 연봉을 받는지 의아해하는 사람이 많다.

 

ChatGPT를 효과적으로 사용하기 위해서는

필요한 도메인에 대한 충분한 지식과 분석적이며 논리적인 접근을 통해

제대로된 대화를 할 줄 알아야 하는 것이고

그런 능력을 갖고 있는 사람이 흔하지는 않기에 몸값이 비싼 것이다.

 

최근 다양한 생성형 AI가 쏟아지고 있고

이러한 생성형 AI를 효과적으로 다루기 위해서는 어떻게 해야하는지

이 책을 통해 충분히 느끼고 배우기를 바란다.

 

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

 

반응형

아이폰의 등장과 같은, 아니 그보다 더한 파급력을 보여주고 있는 ChatGPT !!!!

 

일부 사람만 사용할 수 있는 어려운 interface가 아니라 누구나 사용할 수 있으며

IT 분야에 제한되지 않는 모든 분야는 물론 일상적인 용도로도 사용할 수 있는

즉, 대중성을 갖고 있기에 이런 어머어마한 인기를 얻는 것이 아닌가 생각된다.

 

모든 사람을 똑똑하게 만들어 줄 수 있는 훌륭한 도구 - ChatGPT !!!

 

이런 ChatGPT의 활용도를 높여주는 많은 서비스들이 우후죽순 쏟아지고 있는데

그 중에서 논문 살펴볼 때 많은 도움을 주는 훌륭한 아이가 있어서 소개하고자 한다.

 

https://www.chatpdf.com/

 

chatpdf.com

 

PDF 문서를 입력으로 주고

그에 대해서 여러가지 질문을 던지거나 요청을 하면 ChatGPT를 이용해 답변을 해주는 서비스다.

 

가격 정책은 다음과 같다.

 

Pricing

 

그리고 로그인 하지 않아도 기본적인 사용은 가능하지만

나의 Chat 내역 기록이 필요하면 로그인 해주는 것이 좋다.

 

login

 

으음?! fIrebase로 구현을 했네!? ^^

다시 한 번 말하지만, 굳이 필요 없다면 로그인 없이도 사용할 수 있다.

 

 

그러면, 일단 오늘 살펴볼 논문을 검색해볼까!?

 

https://paperswithcode.com/

 

https://paperswithcode.com/

 

살펴볼 논문의 Paper 버튼을 통해 다운로드를 받던지

아니면 파일의 경로를 복사하던지 하면 된다.

 

Paper

 

그런 다음 ChatPDF에 파일을 등록하던지 아니면 경로를 입력하면 된다.

 

Drop PDF

 

그러면, 추천하는 질문들도 알려준다.

 

Example questions

 

그 질문 그대로 입력하면 당연히 잘 대답해준다.

 

 

혹시 한글로 물어봐도 대답 잘 해주려나?

 

 

질문은 이해하는데, 답은 영어로 하네?!

뭔가 좀 아쉬운데...

 

 

어!? 된다!!!!

조금 아쉬운데...

 

 

논문 공부하기에 정말 훌륭하지 않은가!?

설명만으로 그치지 않고, 궁금한 것에 대해서 물어볼 수도 있다는 점이 대단하다!!!

 

 

PDF를 업로드 한다고 하면 보안에 대해서는 잘 되어있을까!?

 

FAQ

 

뭐 나름 보안에 신경쓰는 것 같기는 하지만

회사 업무 문서를 업로드해서 사용하는 것에는 절대 권장할 수 없을 것 같다.

 

제목에도 쓴 것 처럼

공부를 위해 논문들을 살펴보는 용도 정도로 사용하기를 권장 드린다.

 

 

아! 그리고 아직은 GPT 3.5 기반이다.

GPT 4.0을 연결하는 것에 대해서는 계속 노력하고 있다고 한다.

반응형

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

 

여기까지~

 

반응형

+ Recent posts