GCP로 실습하면 이미 자동으로 이와 같은 역할을 하는 드라이버가 활성화 되어있기 때문에 해당 과정을 거치지 않아도 된다.
쿠버네티스 클러스터 상세 화면에서 '추가 기능' 탭에 진입

'추가 기능 가져오기' 버튼을 클릭해서 새로운 기능을 추가

'Amazon EBS CSI 드라이버'를 선택하고 '다음'버튼 클릭

다음으로 나온 페이지의 설정 옵션은 그대로 둔 상태에서, 계속 다음 버튼을 눌러 넘어가 생성을 완료


클러스터 상세 화면에서 '컴퓨팅' 탭을 클릭하여 아무 노드 그룹이나 상세 화면으로 진입

세부 정보탭의 노드 IAM 역할 ARN 항목의 'IAM에서 보기'를 클릭하여 IAM 설정 상세 화면으로 진입

권한 정책 항목에서 '권한 추가' -> '정책 연결' 버튼을 클릭해 새로운 정책을 연결하는 화면으로 진입

기타 권한 정책 항목에서 'EBS'를 검색한 후, 'AmazonEBSCSIDriverPolicy'를 선택 후, 권한 추가

GCP를 사용하는 사람들은 이미 자동으로 'standard'라는 이름으로 StorageClass가 등록되어 있기 때문에 별도로 등록 작업을 수행하지 않아도 된다.
스토리지 클래스란, PV(C)를 이용하기 위해 쿠버네티스에서 구분하는 스토리지의 종류를 나타내는 오브젝트이다.
스토리지 클래스 오브젝트를 다음과 같이 설정하게 되면, AWS의 스토리지 서비스인 EBS와 연결되어 PVC를 생성할 떄 자동으로 물리적인 스토리지를 빌려와 연결시켜주게 된다.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ebs-sc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
parameters:
csi.storage.k8s.io/fstype: ext4
type: gp3
allowedTopologies:
- matchLabelExpressions:
- key: topology.ebs.csi.aws.com/zone
values:
- ap-northeast-2a
- ap-northeast-2b
- ap-northeast-2c
- ap-northeast-2d

Q. Headless Service란?
A. yaml 파일의 내용을 잘 보면, clusterIP가 None으로 설정된 것을 확인할 수 있다.
이렇게 Service에 직접적으로 IP를 할당하지 않는 특수한 Service를 Headless Service라고 하는데, StatefulSet으로 만들어진 Pod의 경우 일반적으로 랜덤하게 부하 분산이 이루어지면 안되고, 특정 Pod를 지정해서 접속해야하기 때문에 Service가 Pod를 로드밸런싱하는 역할을 수행하지 않고 단순히 Pod에 DNS(도메인주소)만 붙여 접속을 쉽게 할 수 있도록 도와주는 역할만 수행한다.
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: default
labels:
app: mysql
spec:
clusterIP: None
selector:
app: mysql
ports:
- port: 3306
name: mysql
GCP로 실습하는 경우 storageClassName 항목을 'standard'로 설정해주자.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
namespace: default
spec:
serviceName: "mysql"
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
ports:
- containerPort: 3306
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "sparta"
- name: MYSQL_DATABASE
value: "sparta"
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
cpu: "500m"
memory: "1Gi"
volumeClaimTemplates:
- metadata:
name: mysql-persistent-storage
spec:
accessModes:
- ReadWriteOnce
storageClassName: "ebs-sc"
resources:
requests:
storage: 20Gi


kubectl exec -it mysql-0 -- bash를 입력하여, mysql Pod의 CLI에 접속.
mysql -u root -p 를 입력하여, mysql 클라이언트에 접속하고 패스워드로 sparta를 입력
USE sparta;
CREATE TABLE users (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_code VARCHAR(20) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX (user_code)
);

