NFS Persistent Volume
NFS Persistent Volume 을 생성 합니다. Test 시 사용할 서비스는 mysql 과 wordpress 입니다.
테스트시 아래와 동일하게 설정해도 무방 하지만 온프레미스 에서 서비스를 하신다면 기본적으로 Storage 라인을 분리해야 하며, NFS 라인은 10G Network 를 이용해야 합니다.
참고페이지: https://docs.okd.io/latest/install_config/persistent_storage/persistent_storage_nfs.html
별도의 vm 에 nfs-utils 를 설치 하고 /data 디렉토리를 공유 합니다.
[root@k8s-storage ~]# yum install -y nfs-utils
[root@k8s-storage ~]# mkdir -p /data/{mysql,html}
[root@k8s-storage ~]# chmod -R 755 /data
[root@k8s-storage ~]# chown -R nfsnobody:nfsnobody /data/
[root@k8s-storage ~]# vi /etc/exports
/data/html *(rw,sync,no_root_squash)
/data/mysql *(rw,sync,no_root_squash)
[root@k8s-storage ~]#
[root@k8s-storage ~]# systemctl enable nfs-server ; systemctl start nfs-server
[root@k8s-storage ~]# systemctl status nfs-server
nfs-utils 패키지를 모든노드에 설치 합니다.
k8s-master 설치
[root@k8s-master ~]# yum install -y nfs-utils
k8s-node01 설치
[root@k8s-node01 ~]# yum install nfs-utils
k8s-node02 설치
[root@k8s-node01 ~]# yum install nfs-utils
[root@k8s-master ~]# mkdir wordpress
[root@k8s-master ~]# cd wordpress
wordpress 와 mysql 에서 사용할 Persistent Volume 을 생성 합니다.
[root@k8s-master wordpress]# vi pv-wordpress.yaml
kind: PersistentVolume
apiVersion: v1
metadata:
name: wordpress-volume
labels:
type: local
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
server: 10.10.10.18
# Exported path of your NFS server
path: "/data/html"
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: mysql-volume
labels:
type: local
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
server: 10.10.10.18
# Exported path of your NFS server
path: "/data/mysql"
pv-wordpress.yaml 파일을 이용하여 Persistent Volume 을 생성 합니다.
[root@k8s-master wordpress]# kubectl create -f pv-wordpress.yaml
persistentvolume/wordpress-volume created
persistentvolume/mysql-volume created
[root@k8s-master wordpress]#
[root@k8s-master wordpress]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
mysql-volume 10Gi RWX Retain Available 15s
wordpress-volume 10Gi RWX Retain Available 15s
[root@k8s-master wordpress]#
Persistent Volume Claim 을 생성 합니다.
[root@k8s-master wordpress]# vi pvc-wordpress.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: wordpress-volumeclaim
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mysql-volumeclaim
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
pvc-wordpress.yaml 파일을 이용하여 Persistent Volume Claim 을 생성 합니다.
[root@k8s-master wordpress]# kubectl create -f pvc-wordpress.yaml
persistentvolumeclaim/wordpress-volumeclaim created
persistentvolumeclaim/mysql-volumeclaim created
[root@k8s-master wordpress]#
[root@k8s-master wordpress]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-volumeclaim Bound mysql-volume 10Gi RWX 6s
wordpress-volumeclaim Bound wordpress-volume 10Gi RWX 6s
[root@k8s-master wordpress]#
- mysql-password 생성
- secret 삭제시 kubectl delete secret mysql-password
[root@k8s-master wordpress]# kubectl create secret generic mysql-password --from-literal=password=mysqlpassword
secret/mysql-password created
[root@k8s-master wordpress]# kubectl describe secret mysql-password
Name: mysql-password
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 13 bytes
[root@k8s-master wordpress]#
[root@k8s-master wordpress]# vi mysql.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-password
key: password
- name: MYSQL_DATABASE
value: wordpress # WP 에서 사용할 DB명
- name: MYSQL_USER
value: wordpress # WP 에서 사용할 USER명
- name: MYSQL_ROOT_HOST
value: '%'
- name: MYSQL_PASSWORD
value: wordpress # WP 데이터베이스 Password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-volumeclaim
[root@k8s-master wordpress]# kubectl create -f mysql.yaml
deployment.apps/mysql created
[root@k8s-master wordpress]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-5d4c989597-w9s2s 0/1 ContainerCreating 0 6s <none> k8s-node01 <none> <none>
약 1~2분 소요 됩니다.
[root@k8s-master wordpress]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-5d4c989597-w9s2s 1/1 Running 0 34s 20.20.2.2 k8s-node01 <none> <none>
[root@k8s-master wordpress]#
[root@k8s-master wordpress]# vi mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
type: ClusterIP
ports:
- port: 3306
selector:
app: mysql
[root@k8s-master wordpress]# kubectl create -f mysql-service.yaml
service/mysql created
[root@k8s-master wordpress]#
[root@k8s-master wordpress]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 82d <none>
mysql ClusterIP 10.102.149.39 <none> 3306/TCP 7s app=mysql
[root@k8s-master wordpress]#
[root@k8s-master wordpress]# vi wordpress.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- image: wordpress
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: mysql:3306
- name: WORDPRESS_DB_NAME
value: wordpress
- name: WORDPRESS_DB_USER
value: wordpress
- name: WORDPRESS_DB_PASSWORD
value: wordpress
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wordpress-volumeclaim
[root@k8s-master wordpress]# kubectl create -f wordpress.yaml
deployment.apps/wordpress created
[root@k8s-master wordpress]# kubectl get pods
NAME READY STATUS RESTARTS AGE
NAME READY STATUS RESTARTS AGE
mysql-6845698854-46pmx 1/1 Running 0 2m12s
wordpress-74747f4dbf-fbbnh 1/1 Running 0 12s
[root@k8s-master wordpress]#
[root@k8s-master wordpress]# vi wordpress-service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: wordpress
name: wordpress
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: wordpress
[root@k8s-master wordpress]# kubectl create -f wordpress-service.yaml
service/wordpress created
[root@k8s-master wordpress]#
[root@k8s-master wordpress]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 95d <none>
mysql ClusterIP 10.99.245.34 <none> 3306/TCP 65s app=mysql
wordpress NodePort 10.104.25.182 <none> 80:31868/TCP 4s app=wordpress
[root@k8s-master wordpress]#

