[ft_services] 7. mariadb 이미지 파일 생성 및 yaml파일을 통한 배포

이호용·2021년 5월 12일
0

42_ft_services

목록 보기
7/8

mariadb 목표

  • 지난시간까지 nginx, wordpress, phpmyadmin을 올렸습니다.
  • wordpress를 통해, 서버에 회원정보 입력이나, 우편번호 입력등 동적인 입력들을 수행하려면 저장 장소가 필요하다.
  • 이번 시간에는 php같은 응용계층에서 입력 받은 데이터를 저장소인 mySQL로 저장하는 작업을 수행해보자.
  • 워드프레스는 MySQL 데이터베이스랑 같이 작동
  • The WordPress website will have
    several users and an administrator.

저는 mysql대신 mariadb를 사용했습니다. 제 글에선 mysql을 mariadb로 생각하시면 될거 같습니다.

과제는 mysql을 사용하는것이였지만, 저는 몰래 mariaDB를 사용햇습니다. ㅠ..ㅠ

marieadb이미지 빌드

docker build -t MySQL srcs/MySQL/

srcs/MySQL/dockerfile

FROM alpine:3.12

RUN apk update && apk upgrade \
    && apk add mariadb mariadb-client curl \
    && apk add openrc \
    && rm -rf /var/cache/apk/*

ADD https://dl.influxdata.com/telegraf/releases/telegraf-1.6.3-static_linux_amd64.tar.gz ./
RUN tar -C . -xzf telegraf-1.6.3-static_linux_amd64.tar.gz && \
        chmod +x telegraf/* && \
        cp telegraf/telegraf /usr/bin/ && \
        rm -rf *.tar.gz* telegraf/
COPY telegraf.conf /etc/telegraf/

COPY my.cnf /etc/
COPY start_mariadb.sh .
COPY hoylee_db.sql .
COPY create_db .
COPY ./healthy.sh /tmp/healthy.sh
VOLUME ["/var/lib/mysql"]

EXPOSE 3306

ENTRYPOINT sh start_mariadb.sh
  • 다른 내용들은 비슷합니다.
  • mariadb, mariadb-client 마리아 디비 서버와 클라이언트 두가지를 설치해줍니다. 이렇게 두가지를 설치하는 이유는, mariadb 서버는 말그대로, 실질적인 데이터를 저장하기 위한 공간이며, 클라이언트는 사용자가 서버에 접근하기 위한 라이브러리가 클라이언트 입니다.
  • mariaDB클라이언트로 입력하는 제어신호를 mariaDB서버로 통신해야합니다. 반대로 DB 서버의 데이터 시트나 정보들을 클라이언트로 받기도 합니다. 이러한 mariaDB서버와 클라이언트 사이의 통신은 소켓 통신으로 이루어집니다. 자세한 내용은 뒤에서 다루겠습니다.
  • my.cnf : mariaDB의 설정 파일을 my.cnf라고 한다. 아래에 정리해 두었다.
  • VOLUME ["/var/lib/mysql"] : 저장공간을 위해 볼륨 폴더를 설정했습니다. 이폴더를 쿠버네티스에서 제공하는 PersistentVolumeClaim 으로 PersistentVolume과 연결해주도록 하겠습니다. (연결은 yaml파일에서 진행합니다.)

    추가적으로 my.cnf 에서도 datadir 경로를 설저합니다.

my.cnf

  • my.cnf 는 mariadb(mysql server)의 configure파일이다. mariadb서버와 클라이언트가 소켓통신을 해야하고, php(wordpress)와도 통신을 해야하는데, 이에 필요한 데이터들을 설정해준다.
    my.cnf란?
[mysqld]
socket=/run/mysqld/mysqld.sock
port=3306
datadir=/var/lib/mysql
user=root
bind-address=0.0.0.0
skip-networking=false
  • 소켓통신을 하는데 필요한것, ip,port이므로 두가지를 입력해준다. ip는 127.0.0.1로 자기자신 아이피만 허용해주어도 되고 0.0.0.0 으로 모든 아이피를 허용해도 된다. (여기서는!) myriadb와 클라이언트 소켓통신?
  • 일반적으로 클라이언트의 포트는 3306이므로 3306포트를 지정했다.
  • 여기서 소켓에 대한게 나온다. 소켓이 뭘까!!!?
  • 소켓은 소프트웨어로 작성된 통신 접속점이라고 할 수 있는데 네트웍 응용 프로그램은 소켓을 통하여 통신망으로 데이터를 송수신하게 된다.

mysql.sock은 Unix Domain Socket 입니다.
unix domain soket은 컴퓨터가 다른 프로세스와는 통신할수 없고, 같은 컴퓨터에 있는 프로세스끼리 통신이 가능함. (tcp/ip보다 속도가 빠르다., 여기서는 mariadb서버와 mariadb클라이언트 사이를 연결하는데 사용한다., 아무래도 DB데이터 이다보니 소켓중에서도 tcp/ip를 쓰는 통신이 아닌 내부망끼리 연결하는 통신을 사용한거 같다. 추측입니다.)

사진참조

참고 : 소켓이란?

  • tcp/ip연결는 4계의 계층으로 연결되어 있다. 그림참조 7계층 설명

  • 우리가 만든 워드프레스와 mysql은 응용계층에 해당하고, 이 두개의 응용 개층끼리 통신을 하기 위해서는 아래와 같이 캡슐화 되는 작업이 필요하다.캡슐화그림참조

  • 만약 wordpress에서 marieaDB로 tcp/ip통신을 한다면 wordpress의 http 정보 -> 전송계층형태로 캠슐화 -> 네트워크 계층형태 캡슐화 -> 데이터링크 계층형태 캡슐화 -> 라우터 -> mariadb 데이터링크 -> mariadb 네트워크 계층 -> 전송계층 -> mariadb 응용계층 순으로 정보를 전달하게 된다. osi 7 계층 설명

  • datadir=/var/lib/mysql : 데이터 디렉토리 경로 지정

데이터 디렉토리란? : 데이터 디렉토리는 시스템 카탈로그에 수록된 데이터를 접근하기 위한 정보를 유지하는 시스템데이터디렉토리란? 참고

시스템 디렉토리란? : 시스템 카탈로그는 데이터베이스 관리자의 도구로, 데이터베이스에 저장되어 있는 모든 데이터 개체들에 대한 정의나 명세에 대한 정보가 수록되어 있는 시스템 테이블이다.시스템 디렉토리?

var/lib 폴더 = 해당 계층은 어플리케이션이나 시스템에 관련된 상태 정보를 수행한다. 상태 정보라 함은 프로그램이 실행되는 동한 수정하고 특정 호스트의 호출과 관련된 데이터를 말한다.var 폴더 정리 사이트 good!

  • bind-address=0.0.0.0 : bind-address는 mysql server의 listen ip로 맞추어 주면된다. (sudo net stat -ntlp |grep mysqld) 라고 입력해서 나오는 아이피로 입력해도 되고, 지금처럼 0.0.0.0으로 입력해줘도 된다. 클라이언트랑 서버사이에 연결을 위해 입력함.

  • skip-networking=false : skip-networking 이 지시가 활성화 되면, 오로지 sock 파일로만 통신 됨(우린 포트로 클라이언트랑 통신함.)

start_mariadb.sh

rc default
/usr/bin/telegraf &
/etc/init.d/mariadb setup
rc-service mariadb start
mysql -u root mysql < create_db
mysql -u root my_db < hoylee_db.sql
rc-service mariadb stop
/usr/bin/mysqld_safe & telegraf & /usr/bin/mysqld_safe
  • mariadb를 설치 해주고, rc를 통해 시작함. (debian os에서는 service mariadb start 이렇게 바로 실행햇는데 alpine에서는 바로 실행할수가 없어서 openrc를 이용함)

    앞에도 있는 내용이지만 한번더..

  • 실행한 mysql의 아이디와 설정들을 진행해주고, 설정한 계정을 적용시키기 위해,rc-service mariadb stop를통해 중지시키고 /usr/bin/mysqld_safe로 재시작해준다.

  • /usr/bin/mysqld_safe 명령어는 mariadb를 실행하는 명령어

create_db

  • mysql -u root mysql < create_db
CREATE DATABASE my_db;
CREATE USER 'admin'@'%' IDENTIFIED BY 'password';
GRANT ALL ON my_db.* TO 'admin'@'%' WITH GRANT OPTION;

mariadb 사용법

  • 디비를 생성하고 아이디와 비밀번호를 입력해줬다.

hoylee_db.sql

  • The WordPress website will have several users and an administrator.

  • 과제에서 워드프레스에 접속했을때 유저와 관리자가 있어야한다고 했다.

  • mysql과 wordpress가 연결된 상태에서 wordpress에 접속하면, sql파일이 생성되는데 이 파일에 관리자 사용자를 추가한 생태로 저장해서 marieadb 이미지를 구울때 업로드 해주는 원리다.(아래와 같이 유저를 추가한 상태로, phpmyadmin 접속)

  • phpmyadmin 에서 내보내기를 통해 파일을 다운받고, 원하이름으로 파일 명을 변경하면 된다. 나는 hoylee_db.sql로 변경했다.

  • mysql -u root my_db < hoylee_db.sql 그후 파일을 이렇게 절대 권한으로 들어가서 써주면 적용이된다.

deplyment, service, persistentvolumeclaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mariadb-volume-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mariadb-deploy
spec:
  selector:
    matchLabels:
      app: mariadb
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mariadb
    spec:
      containers:
        - name: mariadb-container
          image: mysql
          imagePullPolicy: Never
          ports:
            - containerPort: 3306
          volumeMounts:
            - mountPath: "/var/lib/mysql"
              name: mariadb-volume
      volumes:
        - name: mariadb-volume
          persistentVolumeClaim:
            claimName: mariadb-volume-claim
---
apiVersion: v1
kind: Service
metadata:
  name: cip-mariadb
spec:
  type: ClusterIP
  ports:
    - port: 3306
      name: mariadb
      targetPort: 3306
  selector:
    app: mariadb

PersistentVolumeClaim 이란? 일반적으로 디스크 볼륨을 설정하려면 물리적 디스크를 생성해야한다. 쿠버네티스는 물리적 디스크를 생성하는 복잡한 과정을 추상화를 통해서 간단하게 개발자가 볼륨을 생성하는 기능을 제공하는데 그건 바로 PersistentVolumeClaim와 PersistentVolume 을 이용하는 방법이다.

시스템 관리자가 실제 물리 디스크를 생성한 후에, 이 디스크를 PersistentVolume이라는 이름으로 쿠버네티스에 등록한다.
개발자는 Pod를 생성할때, 볼륨을 정의하고, 이 볼륨 정의 부분에 물리적 디스크에 대한 특성을 정의하는 것이 아니라 PVC를 지정하여, 관리자가 생성한 PV와 연결한다.
조대협님의 persistentvolume참고

  • nginx, wordpress와 차이점은, PersistentVolumeClaim 이 생겼다.
  • mysql의 경우 데이터를 저장해야하는데, 만약 어떠한 이유로 mysql pod이 꺼져버리면 데이터가 날라가 버린다.
  • 이러한 문제는 docker가 격리를 진행하였고, 어떠한 이유로 컨테이너가 만약 꺼진다면 해당 mysql도 함께 꺼진다. 이러한 문제점을 해결하기 위해 PersistentVolumeClaim을 사용했습니다.
  • service를 통해 팟들을 외부와 연결 시켜준다. 여기서는 wp-config를 설정할떄, db_host이름과 name 이름을 cip-mariadb으로 통일 시켜주어 연결했습니다.
  • deployment는 ningx, wordpress와 비슷하고, volume 마운트를 추가해주었고, 해당 볼륨을 persistentvoulumeclaim을 연결 시켜주었습니다.

0개의 댓글

관련 채용 정보