-
라즈베리파이를 이용한 멀티 노드 클러스터링 (3) - MySQLDevOps, 클라우드/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 요청을 해야하는데 레플리카 셋이 발생하면 그 수 많큼... 더 발생할 것 같아서 걱정이 된다.
'DevOps, 클라우드 > Docker & Kubernetes' 카테고리의 다른 글
[HomeLab] Calico와 Tailscale 충돌 문제 (0) 2024.06.22 라즈베리파이를 이용한 멀티 노드 클러스터링 (4) - Spring Boot (0) 2022.04.06 라즈베리파이를 이용한 멀티 노드 클러스터링 (2) - 쿠버네티스 명령어 (2) 2021.08.15 라즈베리파이를 이용한 멀티 노드 클러스터링 (1) - 설치 (1) 2021.07.23 Windows 10 환경에서 Docker 및 nginx로 웹 서버 구성하기 (2) (1) 2021.01.27