참고 사이트를 기반으로 하여 mysql를 배포하였습니다.
기본적으로 data가 많다면 kubernetes안에 mysql을 배포하는 것이 좋지 않은 선택이다. 그렇지만 데이터가 많지 않고 insert하고 나중에 delete하는 작업을 반복한다면 안에 넣어 관리하는 것도 나쁘지 않다고 생각한다.
1. 쿠버네티스 secret 만들기
: 암호, 토큰 또는 키와 같은 소량의 중요한 데이터를 포함하는 오브젝트이다. 이를 사용하지 않으면 중요한 정보가 파드 명세나 컨테이너 이미지에 포함될 수 있다.
vi mysql-secret.yaml
mysql의 secret파일을 만든다.
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: kubernetes.io/basic-auth
stringData:
password: @YourPassword$
- type : kubernetes.io/basic-auth: 이 유형은 보안 비밀이 일반적으로 사용자 이름과 비밀번호에 사용되는 기본 인증 자격 증명을 저장하기 위한 것임을 나타낸다.
- stringdata : 중요한 정보를 sercet에 넣어 저장한다. 여기서는 password를 넣는다.
immutable
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: kubernetes.io/basic-auth
stringData:
password: @YourPassword$
immutable: true
immutable은 말 그대로 변경할 수 없음을 의미하는 옵션인다.
- secret에 데이터를 바꿔버리면 애플리케이션이 중단되게 된다. 이로 인해 업데이트 안되거나 그럴 수 있는데, 이를 보호한다.
- immutable로 표시된 sercet에 대한 감시를 중단하며, kube-apiserver의 부하를 크게 줄인다. 또한 클러스터의 성능을 향상시킨다.
kubectl apply -f mysql-secret.yaml
위의 명령어를 넣어 클러스터에 저장한다.
2. 쿠버네티스 pv와 pvc 만들기
vi mysql-storage.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
위와 같이 작성하면 pv와 pvc가 같이 작성된다. 해당 스토리지가 어느 정도 되었으면 하는 것을 storage 부분에 할당하여 생성한다.
path로 하여 스토리지가 어디에 생성되는지 알 수 있다.
kubectl apply -f mysql-storage.yaml
위와 같이 이를 적용하여 생성해준다.
3. mysql 생성하기
vi mysql-deployment.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: mysql:latest
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
---
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
- strategy : 배포에 대한 것을 정의한다. 여기서 recreate로 하여 기존 pods가 종료되고 업데이트 중에 새 pods가 생성된다는 의미이다.
- image: mysql:latest: 최신 버전의 MySQL인 컨테이너에 사용할 Docker 이미지를 지정한다.
- 여기서 오류가 뜬다면 이미지가 없다는 뜻이므로, 수동으로 하여 이미지를 생성해준다.
- env : 환경변수에서 MYSQL_ROOT_PASSWORD가 존재한다. 이를 valueFrom에서 어디서 가져와야 하는지 알려준다.
- valueFrom : 위에서 생성한 sercet파일에서 가져와야 함을 알려준다.
- volumes-name : mysql-persistent-storage: 볼륨 이름이 VolumeMounts에 지정된 이름과 일치시킨다.
- persistVolumeClaim: "mysql-pv-claim"이라는 PertantVolumeClaim(PVC)을 참조한다. PVC는 포드에 대한 스토리지 리소스를 제공한다.
service
mysql deployment 생성한 것을 사용하기 위하여 service를 생성해준다.
- selector : 위에서 생성한 mysql deployment selector와 일치해야 한다.
kubectl apply -f mysql-deployment.yaml
위의 yaml파일을 적용시켜준다.
4. MySQL Instance에 접속하기
kubectl get pod
kubectl exec --stdin --tty <pod 이름> -- /bin/bash
위와 같이 입력하여 bash에 들어가도록 한다.
mysql -p
mysql 쉘에 들어간다. 그리고 나서 위에서 sercet file에 입력하여 password를 쳐주면 mysql shell이 보이게 된다.
SHOW DATABASES;
👇🏻 참고 사이트
https://medium.com/@midejoseph24/deploying-mysql-on-kubernetes-16758a42a746
docker mysql 배포하고 설치 👇🏻
https://postlude.github.io/2021/08/10/k8s-mysql/