ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 라즈베리파이를 이용한 멀티 노드 클러스터링 (3) - MySQL
    인프라/Docker & Kubernetes 2022. 4. 5. 02:58

    쿠버네티스 공부를 하겠다고 한 후 한참이 지났다.

    사실 그 동안 정말 오케스트레이션을 쓰는게 좋은 것인가?를 두고 많이 고민했다.

    정확히는 내가 만드는 서비스, 프로젝트에서 쿠버네티스가 정말 효용성이 있는지를 따지다보니 후순위로 밀린 감이 없지 않아 있다.

    이번에 진행 중인 프로젝트를 위해서 데이터베이스와 API 서버를 k3s에 배포해보려고 한다.

     

    다시금 쿠버네티스를 만져보면서 이전에 써둔 글을 그대로 따라했다. 물론 별 내용은 없지만 매 번 검색하고 찾는 것보다는 내가 정리한 글이 따라해보기 편한 것 같다. 그래서 이 글도 계속 작성하려한다.

     

    #pv-local.yaml
    
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: "pv-local"
      labels:
        type: local
    spec:
      storageClassName: db-storage-class
      capacity:
        storage: "10Gi"
      accessModes:
        - "ReadWriteOnce"
      hostPath:
        path: /tmp/k3s/db
      persistentVolumeReclaimPolicy: Recycle
    # local-pvc.yaml
    
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pv-local-claim
    spec:
      storageClassName: db-storage-class
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi

     

    우선 두 개의 파일을 생성하자.

    PV(Persistent Volume)와  PVC(Persistent Volume Claim)에 관한 스토리지 클래스이다.

    클러스터는 서비스를 동작시킬 수도 있지만 그와 별개로 스토리지에 대한 관리도 수행해야 한다.

    이때, PV와 PVC가 1대1로 매핑되면서 PV가 파일 시스템에 대한 동작을 수행하고 PVC는 그에 따라 적절한 자원을 요청한다.

     

    sudo kubectl create -f pv-local.yaml
    sudo kubectl create -f local-pvc.yaml
    sudo kubectl describe pv pv-local-volume

     

    내가 작성한 PV를 생성하고 다음 파일을 작성하자.

    echo "secret_key" | base64
    # mysql-keys.yaml
    
    apiVersion: v1
    kind: Secret
    metadata:
      name: mysql-secret
    data:
      password: bWVnYV9zZWNyZXRfa2V5Cg==
    sudo kubectl create -f db-keys.yaml
    sudo kubectl describe secret mysql-secret

    이제 우리는 DB에서 사용할 패스워드를 등록해줄 것이다.

    시크릿은 암호, 토큰, 키와 같은 소량의 중요한 정보를 담는 오브젝트다. 

    중요한 정보를 별도로 Key-Value를 통해 관리할 수 있다.

     

    #mysql-svc.yaml
    
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql
    spec:
      ports:
      - port: 3307
      selector:
        app: mysql
    #mysql-dep.yaml
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mysql
    spec:
      selector:
        matchLabels:
          app: mysql
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
          - image: mariadb # 수정)mysql은 이미지 Pull 에러가 발생할 수 있다.
            name: mysql
            imagePullPolicy: Always
            ports:
            - containerPort: 3307 
              name: mysql
            volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
            env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secret
                  key: password
          volumes:
          - name: mysql-persistent-storage
            persistentVolumeClaim:
              claimName: pv-local-claim

    마지막으로 우리가 배포할 mysql 서비스와 배치본에 대해 작성한다.

    나는 이것을 우리가 흔히 사용하는 도커의 이미지-컨테이너와 같은 인스턴스를 생성하는 관계라고 이해했다.

    이것 또한 마찬가지로 생성해주자.

     

    사실 수정하기 귀찮아서 여기다 적지만 MySQL 이미지는 Pull 에러가 발생할 수 있다.

    나도 에러가 나서 그냥 mariadb로 이미지를 바꾸었다.

    sudo kubectl create -f mysql-svc.yaml
    sudo kubectl create -f mysql-dep.yaml

     

     

    sudo kubectl delete pvc/pv-local-claim

    혹여 잘못 생성한 객체가 있다면 위와 같이 객체타입/객체명을 통해 삭제할 수 있다.

     

    sudo kubectl get pvc
    sudo kubectl get svc
    sudo kubectl get secret
    sudo kubectl get pods

    위 명령으로 각각 생성했던 여러 타입의 객체들과 우리가 배포한 파드(mysql)가 동작 중인 것을 확인해볼 수 있다.

     

    이번에 등록한 데이터베이스는 웹 서비스에서 계속 접근해야한다.

    이전에도 사실 Nginx를 통해서 웹 서비스를 쿠버네티스에 잠깐 배포해보면서 레플리카 셋을 적용해보았던 적이 있다.

    이번에는 거기까지는 조금 힘들 것 같다. 실제 해본 적은 없지만 올라갈 서비스들이 API 요청을 해야하는데 레플리카 셋이 발생하면 그 수 많큼... 더 발생할 것 같아서 걱정이 된다.

     

    댓글

Designed by Tistory.