-
Kubernetes 에서 Wordpress + MySQL 구성하기 (Persistent Volume)HOWTO 2019. 1. 9. 09:25K8S Cluster 환경은 사전 구성이 되어 있어야 하고 2018/11/30 - [Naver Cloud Platform] - 네이버 클라우드에 Kubernetes (k8s) cluster 구성하기 (Calico)Pods 에서 Persistent volume 을 사용하기 위해 각 Node 마다 50GB 볼륨을 할당하고 마운트 한다. (예제에서는 /data001 로 마운트 함)아래 구성에서 Kubernetes 환경은 네이버클라우드플랫폼 싱가폴 리전에서 VM 으로 구성했으며, CNI 는 Calico 로 구성하였다.
1. PV (Persistent Volume) 생성
PV 는 K8S 관리자가 설정하는 클러스터의 저장소로 사용자가 PVC 를 생성하기 위해 설정해 두는 물리적인 공간이라고 볼 수 있다.지금 구성에서는 K8S Cluster 를 스스로 운영하기 때문에 PV 설정이 필요하고, GKE 와 같이 Cluster 를 구성해 주는 서비스의 경우 PVC 만 설정해서 사용하면 된다.50GB 파일시스템을 마운트 했으므로 25GB 짜리 PV 를 2개 생성한다.# vi pv1.yaml
kind: PersistentVolumeapiVersion: v1metadata:name: pv0001labels:type: localspec:capacity:storage: 25GiaccessModes:- ReadWriteOncehostPath:path: "/data001/pv0001"# vi pv2.yamlkind: PersistentVolumeapiVersion: v1metadata:name: pv0002labels:type: localspec:capacity:storage: 25GiaccessModes:- ReadWriteOncehostPath:path: "/data001/pv0002"
# kubectl create -f pv1.yaml
# kubectl create -f pv2.yaml# kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpv0001 25Gi RWO Retain Available 8spv0002 25Gi RWO Retain Available 5s2. PVC (Persistent Volume Claim) 생성
PVC 는 사용자가 Pod 를 만들면서 요청하는 스토리지로 PV 가 있어야 생성된다. 별도로 PV 를 지정하지 않아도 PV 에 알아서 할당된다.Wordpress 와 MySQL 이 각각 다른 PVC 를 사용하도록 생성한다.# vi wordpress-volumeclaim.yaml
kind: PersistentVolumeClaimapiVersion: v1metadata:name: wordpress-volumeclaimspec:accessModes:- ReadWriteOnceresources:requests:storage: 10Gi# vi mysql-volumeclaim.yaml
kind: PersistentVolumeClaimapiVersion: v1metadata:name: mysql-volumeclaimspec:accessModes:- ReadWriteOnceresources:requests:storage: 10Gi# kubectl create wordpress-volumeclaim.yaml
# kubectl create mysql-volumeclaim.yaml# kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEmysql-volumeclaim Bound pv0002 25Gi RWO 4swordpress-volumeclaim Bound pv0001 25Gi RWO 12s3. MySQL Root 패스워드 저장
mysql root 패스워드를 mysql-password 라는 secret object 에 저장한다.# kubectl create secret generic mysql-password --from-literal=password=rP@ssw0rd
# kubectl describe secret mysql-passwordName: mysql-passwordNamespace: defaultLabels: <none>Annotations: <none>Type: OpaqueData====password: 9 bytes4. MySQL Pod 배포
MySQL 이 설치된 Pod 를 배포하면서 Database , User, User password 도 함께 설정해준다.아래 예제에서 k8suser 의 패스워드를 노출했는데 위 Root 패스워드의 설정과 같이 secret 오브젝트 형태로 저장해도 된다.# vi mysql.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: mysqllabels:app: mysqlspec:replicas: 1selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- image: mysql:5.6name: mysqlenv:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-passwordkey: password- name: MYSQL_DATABASE # 구성할 database명value: k8sdb- name: MYSQL_USER # database에 권한이 있는 uservalue: k8suser- name: MYSQL_ROOT_HOST # 접근 호스트value: '%'- name: MYSQL_PASSWORD # database에 권한이 있는 user의 패스워드value: P@ssw0rd!!ports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-persistent-storagemountPath: /var/lib/mysqlvolumes:- name: mysql-persistent-storagepersistentVolumeClaim:claimName: mysql-volumeclaim# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODEmysql-86bb7c99f9-62jmj 1/1 Running 0 3m28s 172.27.116.214 c2node3 <none>5. MySQL 서비스 생성
앞에서 생성한 MySQL 컨테이너를 노출하기 위해 서비스를 생성하고 뒤에서 생성할 Wordpress 컨테이너가 접근할 수 있도록 설정한다.# vi mysql-service.yaml
apiVersion: v1
kind: Servicemetadata:name: mysqllabels:app: mysqlspec:type: ClusterIPports:- port: 3306selector:app: mysql# kubectl create -f mysql-service.yaml# kubectl get svc -o wideNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTORmysql ClusterIP 172.20.12.226 <none> 3306/TCP 3m40s app=mysql
6. Wordpress Pod 배포
wordpress pod 배포 파일에는 MySQL 접근이 가능한 정보가 포함되어야 한다.# vi wordpress.yaml
apiVersion: apps/v1
kind: Deploymentmetadata:name: wordpresslabels:app: wordpressspec:replicas: 1selector:matchLabels:app: wordpresstemplate:metadata:labels:app: wordpressspec:containers:- image: wordpressname: wordpressenv:- name: WORDPRESS_DB_HOSTvalue: mysql:3306- name: WORDPRESS_DB_NAMEvalue: k8sdb- name: WORDPRESS_DB_USERvalue: k8suser- name: WORDPRESS_DB_PASSWORDvalue: P@ssw0rd!!ports:- containerPort: 80name: wordpressvolumeMounts:- name: wordpress-persistent-storagemountPath: /var/www/htmlvolumes:- name: wordpress-persistent-storagepersistentVolumeClaim:claimName: wordpress-volumeclaim# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODEmysql-86bb7c99f9-62jmj 1/1 Running 0 3m28s 172.27.116.214 c2node3 <none>wordpress-7ff695b6c6-vp5rc 1/1 Running 0 2m52s 172.27.116.215 c2node3 <none>
7. Wordpress 서비스 배포
Kubernetes Pod IP 를 사설 IP 로 설정하여 직접 접근이 불가하므로 Node IP 와 Node Port 를 통해 접근할 수 있도록 Wordpress 서비스를 기동한다.# vi wordpress-service.yaml
apiVersion: v1kind: Servicemetadata:labels:app: wordpressname: wordpressspec:type: NodePortports:- port: 80targetPort: 80protocol: TCPselector:app: wordpress
# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTORmysql ClusterIP 172.20.12.226 <none> 3306/TCP 3m40s app=mysqlwordpress NodePort 172.17.70.243 <none> 80:31776/TCP 26s app=wordpress
8. Wordpress 웹 접속 및 설정
Wordpress 가 기동된 Pod 의 노드 IP 와 Wordpress 서비스의 Node Port 로 웹 브라우저를 통해 접속한다.아래와 같은 페이지가 노출되면 정상적으로 서비스 구성이 완료된 것이다.반응형'HOWTO' 카테고리의 다른 글
Kubernetes CrashLoopBackOff exit0 발생할 때 (0) 2020.01.31 squid proxy 를 활용한 object storage 접근 제어 (0) 2020.01.29 MySQL DB replication 구성하기 (2) 2018.12.29 Let's Encrypt 에서 ssl 인증서 발급 받기 (0) 2018.12.27 Mac OS 에 jq 설치하기 (0) 2018.11.28