본문 바로가기

42cursus

ft_services - 가이드 및 참고자료 정리하기 (42seoul)

다음 포스팅은 ft_services를 진행하기 싫거나, 막막할 때 42cadet들을 위한 글임 (음슴체 주의)

큰 도움은 되지 않겠지만, 어느정도의 가이드, 참고자료를 남겨두려고 함

 

 

 

ft_services가 어렵거나 막막한 이유

1) 어디서 부터 시작해야 할지 막막함, 서브젝트를 읽어도 용어 & 키워드를 모름, 쿠버네티스가 뭔데?

-> 위의 3가지일 경우 그냥 "쿠버네티스" 공부하면 됨

-> 공식 홈페이지도 좋겠지만 개인적으로 빠르게 알고 싶으면 subicura 설명글보는게 정신건강에 이로움

-> 왜냐하면 쿠버네티스는 추상화를 엄청해놨기 때문에 잘 모르는 초보자가 보면 용어보고 기절함

 

2) 배포는 상관없으나 이제 도커 이미지를 만드는 게 힘듦, Alpine Linux의 개같음

 -> 자료가 충분하지 않으나 결국 구글링이 답

 -> 구글링하면 다 나온다는 말도 물론 거지같음, 원하는 자료가 먹기좋게 안나오거든

 -> Alpine의 Wiki나 공홈을 적극 활용해야 어느정도 각이 잡힘

 -> 예로들면 alpine grafana install 하면 원하는 자료 안나오나, (alpine apk, alpine package)에 대해서 알아두면 설치방법을 깨닫게 됨

 -> openrc로 service restart하는 것은 테스트에만 하는게 좋음 (뭐만하면 사용중 혹은 에러나옴, 데몬을 직접 죽이고 키고 하는게 편함)

 

3) 안될 때 뭐가 안되는지 정확히 모름

 -> 구글링, 슬랙을 통해 질문해야 함, 하다보면 해결되는 게 웃김, 천천히, 차분히 경우의 수를 줄인다는 생각으로 임해야 함

 -> kubectl describe or logs or exec -it 적극활용

 

 

 

0. 프로젝트 목표

쿠버네티스, 도커를 이용하여 클러스터 관리, 배포하기

 

아래와 같은 토폴로지 구성하기

 

 

 

1. 키워드 정리 (위키백과)

Kuberetes

 - web dashboard : 웹 대시보드(UI)를 통해 컨테이너화 된 애플리케이션을 클러스터에 배포하거나 관리가능하게 함

 - 쿠버네티스는 컨테이너화된 애플리케이션의 자동 디플로이(deploy, 배포), 스케일링을 제공하는 오픈 소스

 - 목적은 여러 클러스터의 호스트 간에 애플리케이션 컨테이너의 배치, 운영을 자동화하기 위한 플랫폼을 제공

 - 도커를 포함하여 일련의 컨테이너 도구들과 함께 동작함

 

Clustering

 - 여러개의 컴퓨터를 연결한 병렬 시스템

 - 서로 통신이 가능하고 업무를 분담하여 수행함

 

Deployment

 - 배포를 의미하는 것으로 애플리케이션이나 소프트웨어를 배포한다는 의미로 자주 사용함

 - 쿠버네티스의 용어중 하나

 

Alpine Linux

 - 작은 크기, 단순성, 빠른 부팅을 제공하는 컨테이너에 흔히 사용되는 리눅스 배포판

 - 우분투나 센토스에 비해 보기 좋은 자료가 부족함

 

Load Balancer

 - 하나의 인터넷 서비스가 발생하는 트래픽이 많을 때 분산처리하여 해결해 주는 서비스

 - 실행 속도를 높임, 다운타임 최소화

 - L4로드밸런서 : ip, port, mac, protocol로 트래픽을 나눔 (말 그대로 4계층 구분)

 - L7로드밸런서 : http헤더, 쿠키등으로 트래픽을 나눔 (말 그대로 7계층 구분)

 

Grafana

 - Time-series DB의 데이터를 시각화 하는데 가장 최적화된 대시보드를 제공해주는 오픈소스 툴 킷

 - 다양한 DB를 연결, 시각화, 그래프를 그리는 방법도 마우스로 간단히 할 수 있음

 

InfluxDB

 - Time-series DB, 시계열 데이터를 저장하고 활용하는데 특화된 DB

 - timestamp기반의 모든 데이터의 백업 저장소로 용이

 - Grafana와 많이 연동

 

MetalLB

 - 표준 라우팅 프로토콜을 사용하여 베어 메탈 쿠버네티스 클러스터를 위한 로드 밸런서

 

 

 

2. 쿠버네티스

학습자료

1) 쿠버네티스 공홈

- 문서가 정리가 잘되어 있지만 애초에 용어가 어색해 읽히지도 않음..ㅜ

 

쿠버네티스 문서

쿠버네티스는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하기 위한 오픈소스 컨테이너 오케스트레이션 엔진이다. 오픈소스 프로젝트는 Cloud Native Computing Foundation에서 주관한다.

kubernetes.io

 

2) Docker로도 유명한 subicura님의 쿠버네티스 포스팅 (subicura블로그 상단에 "쿠버네티스 안내서"까지 보기를 추천)

 

쿠버네티스 시작하기 - Kubernetes란 무엇인가?

쿠버네티스는 컨테이너를 쉽고 빠르게 배포/확장하고 관리를 자동화해주는 오픈소스 플랫폼입니다. 1주일에 수십억 개의 컨테이너를 생성하는 구글이 내부 배포시스템으로 사용하던 borg를 기

subicura.com

 

3) 내가 subicura님의 강좌를 보고 정리한 개념 (subicura와 같음)

 

Kubernetes(쿠버네티스) 개념 알아보기

ㅁㄴㅇㅁㄴㅇ ㅁㄴㅇㅁㄴㅇ

malbongcode.tistory.com

 

yaml 작성 연습

1) Deployment 작성해보기 (모든 의미 파악)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  minReadySeconds: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2
          livenessProbe:
              httpGet:
                path: /
                port: 80
          readinessProbe:
              httpGet:
                path: /
                port: 80
cs

 

2) Service 작성해보기 (모든 의미 파악)

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Service
metadata:
  name: echo
spec:
  type: NodePort
  ports:
    - port: 3000
      nodePort: 32000
      protocol: TCP
  selector:
    app: echo
cs

 

3) 워드프레스 올려보기 + 조금 더 복잡한 배포해보기

subicura.com/k8s/guide/sample.html#%E1%84%8B%E1%85%AF%E1%84%83%E1%85%B3%E1%84%91%E1%85%B3%E1%84%85%E1%85%A6%E1%84%89%E1%85%B3-%E1%84%87%E1%85%A2%E1%84%91%E1%85%A9

 

웹 애플리케이션 배포

Pod, ReplicaSet, Deployment, Service를 이용하여 기본적인 웹 애플리케이션을 배포합니다.

subicura.com

 

-> yaml을 이해하면서 작성할 줄 알고, kubectl의 명령어를 어느정도 안다면, ft_services를 어떻게 해야할지 감이 잡힘

 

 

 

3. 도커 이미지 굽기 순서 (추천)

metalLB -> nginx -> phpmyadmin(+mysql) -> wordpress(+mysql) -> ftps -> grafana(+influxdb)

 

 

 

4. 이미지 만들다가 개인적으로 막혔던 곳

nginx

- alpine에서 기본적으로 service를 제공하지 않음 (openrc도 사용하지 않았음)

 -> nginx -s reload로 새로고침 했음

- nginx데몬을 실행하려면 아마 /var/run/nginx 디렉토리가 있어야 했음

- alpine ssh는 아래 링크 그대로 따라하면 됨 (테스트는 로컬에서 # ssh [user]@[ip] 로 접근)

zetawiki.com/wiki/SSH_%EC%A0%91%EC%86%8D_%EA%B0%80%EB%8A%A5%ED%95%9C_%EC%95%8C%ED%8C%8C%EC%9D%B8_%EB%8F%84%EC%BB%A4_%EC%9D%B4%EB%AF%B8%EC%A7%80_%EB%B9%8C%EB%93%9C

 

SSH 접속 가능한 알파인 도커 이미지 빌드 - 제타위키

다음 문자열 포함...

zetawiki.com

- nginx 포그라운드 실행 (nginx -g "daemon off;")

- 나머지는 ft_server와 동일

 

 

MySQL

- alpine wiki에서 설치 및 초기화를 알아 볼 것 (MySQL (MariaDB) - Production usage 쪽을 봐야 함)

- MySQL도 conf파일을 만져야 다른 곳과 통신이 가능함

 -> 본인은 mariadb-server.cnf만 수정하고 완성함 (github참고하면 다들 my.cnf를 바꿈, 난 모름)

 -> skip-networking을 주석처리해야 하고, bind-address를 0.0.0.0으로 풀어주면 됨

- wordpress db를 만드는 sql과 wordpress db에 테이블과 값을 넣는 것은 약간에 차이가 있음에 유의

 -> wpdb를 만드는건 ft_server와 유사하고, 미리 유저를 만드는 것은 wpdb에 넣어야 함

- mysqld --user=root & 로 mysqld를 활성화 시키면 할당 늦게 켜짐에 주의 (sleep을 걸던지, shellscript if로 체크를 하던지 하기)

 

 

Wordpress

- wp에 필요한 php설치 및 nginx.conf작성은 위키가 잘 나와 있음

 -> alpine wordpress로 검색 + alpine php nginx로 검색

- wp-config.php에 설정 필요

 -> mysql에 작성한 wpdb를 만드는 sql에 db_name, db_user, db_password가 무조건 있을 텐데 그대로 넣어주면 됨

 -> 마찬가지로 db_host는 mysql의 아이피를 적던지 쿠버네티스가 dns를 클러스터내에서 제공하니 그냥 'mysql'적어도 됨

 -> ping mysql 해보길 바람

- 유저가 이미 세팅되어 있는 상태여야 함

 -> phpmyadmin에서 wpdb를 선택하고 내보내기 하면 그대로 쓸 수 있는 SQL파일이 나옴

 -> 내보내기 할 때 커스텀 내보내기는 하면 안됨 -> 잘못하면 컨테이너 재시작 때 덮어쓰기 될 수도 있음

 -> 그것을 MySQL에 넣어주면 됨 (참고로 MySQL의 wpdb에 넣어줘야 함)

 -> mysql < create_user.sql

 -> mysql wordpress_db < wpdb.sql

- php-fpm7 & nginx -g "daemon off;"로 실행

 

 

PhpMyAdmin

- 마찬가지로 conf파일 수정해야 함 (config.inc.php)

 -> phpmyadmin remote mysql이라고 검색하면 나옴

 -> 나는 호스트부분만 수정함

- php-fpm7 & nginx -g "daemon off;"로 실행

 

 

ftps

- port 번호가 중요, 공부할 것

- active mode, passive mode 공부할 것

- 설정파일은 검색 + github참고 함

- 테스트는 파일질라로 할 것

 

 

grafana & influxdb & telegraf

- 설치 방법은 alpine package + alpine apk에 대해서 검색하고 찾아 볼 것

- telegraf.conf은 agent, output, input으로 크게 나뉘어져 있는데 몇가지 수정하지 않아도 해결 가능

- influxdb로 pvc를 잡았다면, 아마 /var/lib/influxdb 로 잡았을 텐데, 아무런 설정 및 옵션없이 influxd로 실행시키면 /var/lib/influxdb를 본인 데이터 디렉터리로 잡지 않음(아마 다른 default.conf파일이 존재하는 듯)

 -> 그래서 influxd run --config [conf file]로 실행시킬 것 (conf file는 아마 일반적으로 /etc/influxdb.conf로 존재)

- grafana-server 를 실행시킬려면 /usr/share/garfana에서 grafana-server 하던지 아니면 grafana-server -homepath옵션을 주면 됨

- grafana 데이터 파일 및 백업은 아래와 같음

-> grafana는 어디에 백업파일을?

community.grafana.com/t/backup-restore-grafana-server/121

 

Backup/restore grafana server

We could do with a mechanism that would allow a restored copy of grafana.db to successfully run on a new/different server. This would also be useful for running a mirror without the need to manually import dashboards between servers. Is there a good way to

community.grafana.com

 

 

 

%%% 참고 문서는 워낙 많음에 유의 %%%