====== Criar Volumes Persistente com NFS ======
==== NFS server ====
# yum install nfs-utils
# systemctl start rpcbind
# systemctl start nfs-server
# systemctl enable rpcbind
# systemctl enable nfs-server
# mkdir /var/nfs
# mkdir /var/nfs/app
# mkdir /var/nfs/data
# cat /etc/exports
/var/nfs/app 177.75.176.32/27(rw,no_root_squash)
/var/nfs/data 177.75.176.32/27(rw,no_root_squash)
# exportfs -arv
exporting 177.75.176.32/27:/var/nfs/data
exporting 177.75.176.32/27:/var/nfs/app
# exportfs -s
/var/nfs/app 177.75.176.32/27(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/var/nfs/data 177.75.176.32/27(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
# firewall-cmd --permanent --add-service=nfs
# firewall-cmd --permanent --add-service=mountd
# firewall-cmd --permanent --add-service=rpc-bind
# firewall-cmd --reload
==== Kubernets workers ====
$ sudo apt install nfs-common
$ sudo showmount -e 172.20.64.11
Export list for 172.20.64.11:
/var/nfs/data 177.75.176.32/27
/var/nfs/app 177.75.176.32/27
==== Kubernetes controller ====
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
namespace: 4labs
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
$ kubectl apply -f lab03/storage-class.yaml
storageclass.storage.k8s.io/local-storage unchanged
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: volume-nfs-app
namespace: 4labs
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
nfs:
server: 172.20.64.11
path: /var/nfs/app
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: claim-nfs-app
namespace: 4labs
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10G
$ kubectl apply -f lab03/volume-app.yaml
persistentvolume/volume-nfs-app created
persistentvolumeclaim/claim-nfs-app created
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: volume-nfs-mysql
namespace: 4labs
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
server: 172.20.64.11
path: /var/nfs/data
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: claim-nfs-mysql
namespace: 4labs
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10G
$ kubectl apply -f lab03/volume-mysql.yaml
persistentvolume/volume-nfs-mysql created
persistentvolumeclaim/claim-nfs-mysql created
$ kubectl get sc -n 4labs
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
local-storage kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 17h
$ kubectl get pv -n 4labs
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-deploy 1Gi RWO Retain Bound default/volume-claim-local local-storage 17h
volume-nfs-app 10Gi RWX Recycle Bound 4labs/claim-nfs-app 2m49s
volume-nfs-mysql 10Gi RWO Recycle Bound 4labs/claim-nfs-mysql 40s
$ kubectl get pvc -n 4labs
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
claim-nfs-app Bound volume-nfs-app 10Gi RWX 3m
claim-nfs-mysql Bound volume-nfs-mysql 10Gi RWO 51s
===== Atualizar Aplicação PHP com Volumes NFS =====
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: memcached1
name: memcached1
namespace: 4labs
spec:
replicas: 1
selector:
matchLabels:
app: memcached1
strategy: {}
template:
metadata:
labels:
app: memcached1
spec:
containers:
- image: memcached:latest
imagePullPolicy: IfNotPresent
name: memcached1
ports:
- containerPort: 11211
---
apiVersion: v1
kind: Service
metadata:
labels:
app: memcached1
name: memcached1
namespace: 4labs
spec:
clusterIP: None
ports:
- port: 11211
protocol: TCP
targetPort: 11211
selector:
app: memcached1
$ kubectl apply -f lab03/memcached1-deploy.yaml
deployment.apps/memcached1 created
service/memcached1 created
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: memcached2
name: memcached2
namespace: 4labs
spec:
replicas: 1
selector:
matchLabels:
app: memcached2
strategy: {}
template:
metadata:
labels:
app: memcached2
spec:
containers:
- image: memcached:latest
imagePullPolicy: IfNotPresent
name: memcached2
ports:
- containerPort: 11211
---
apiVersion: v1
kind: Service
metadata:
labels:
app: memcached2
name: memcached2
namespace: 4labs
spec:
clusterIP: None
ports:
- port: 11211
protocol: TCP
targetPort: 11211
selector:
app: memcached2
$ kubectl apply -f lab03/memcached2-deploy.yaml
deployment.apps/memcached2 created
service/memcached2 created
$ kubectl get all -l app=memcached1 -n 4labs
NAME READY STATUS RESTARTS AGE
pod/memcached1-6487bb895f-t5wrh 1/1 Running 0 2m55s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/memcached1 ClusterIP None 11211/TCP 2m55s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/memcached1 1/1 1 1 2m55s
NAME DESIRED CURRENT READY AGE
replicaset.apps/memcached1-6487bb895f 1 1 1 2m55s
$ kubectl get all -l app=memcached2 -n 4labs
NAME READY STATUS RESTARTS AGE
pod/memcached2-56fb6d54cf-2jkzj 1/1 Running 0 40s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/memcached2 ClusterIP None 11211/TCP 40s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/memcached2 1/1 1 1 40s
NAME DESIRED CURRENT READY AGE
replicaset.apps/memcached2-56fb6d54cf 1 1 1 40s
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: app
name: app
namespace: 4labs
spec:
replicas: 1
selector:
matchLabels:
app: app
strategy: {}
template:
metadata:
labels:
app: app
spec:
containers:
- image: instrutordocker/4linux-app:latest
name: app
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: app-configmaps
key: DB_HOST
- name: DB_PORT
valueFrom:
configMapKeyRef:
name: app-configmaps
key: DB_PORT
- name: DB_USER
valueFrom:
configMapKeyRef:
name: app-configmaps
key: DB_USER
- name: DB_NAME
valueFrom:
configMapKeyRef:
name: app-configmaps
key: DB_NAME
- name: DB_PASS
valueFrom:
secretKeyRef:
name: app-secrets
key: DB_PASS
volumeMounts:
- name: claim-nfs-app
mountPath: "/app"
- name: config-volume-php
mountPath: "/app/php-ini/"
volumes:
- name: claim-nfs-app
persistentVolumeClaim:
claimName: claim-nfs-app
- name: config-volume-php
configMap:
name: php-config
$ kubectl replace -f lab03/dep-app.yaml
deployment.apps/app configured
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: mysql
name: mysql
namespace: 4labs
spec:
replicas: 1
selector:
matchLabels:
app: mysql
strategy: {}
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.7
imagePullPolicy: IfNotPresent
name: mysql
env:
- name: MYSQL_DATABASE
valueFrom:
configMapKeyRef:
name: mysql-configmaps
key: MYSQL_DATABASE
- name: MYSQL_USER
valueFrom:
configMapKeyRef:
name: mysql-configmaps
key: MYSQL_USER
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secrets
key: MYSQL_ROOT_PASSWORD
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secrets
key: MYSQL_PASSWORD
volumeMounts:
- name: claim-nfs-mysql
mountPath: /var/lib/mysql
- name: mysql-db-config
mountPath: /docker-entrypoint-initdb.d/
- name: dump-usuarios
mountPath: /dump/
volumes:
- name: claim-nfs-mysql
persistentVolumeClaim:
claimName: claim-nfs-mysql
- name: mysql-db-config
configMap:
name: mysql-db-config
- name: dump-usuarios
configMap:
name: dump-usuarios
$ kubectl replace -f lab03/dep-mysql.yaml
deployment.apps/mysql configured
$ kubectl get all -n 4labs -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/app-577658dc67-9dvmc 1/1 Running 0 44m 172.16.213.140 kube-worker-02.juntotelecom.com.br
pod/memcached1-6487bb895f-t5wrh 1/1 Running 0 50m 172.16.213.139 kube-worker-02.juntotelecom.com.br
pod/memcached2-56fb6d54cf-2jkzj 1/1 Running 0 48m 172.16.101.74 kube-worker-01.juntotelecom.com.br
pod/mysql-9bcb6fb76-xzcpb 1/1 Running 0 41m 172.16.101.75 kube-worker-01.juntotelecom.com.br
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/app NodePort 10.102.86.152 8080:31541/TCP 2d app=app
service/memcached1 ClusterIP None 11211/TCP 50m app=memcached1
service/memcached2 ClusterIP None 11211/TCP 48m app=memcached2
service/mysql ClusterIP 10.101.224.168 3306/TCP 2d app=mysql
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/app 1/1 1 1 2d app instrutordocker/4linux-app:latest app=app
deployment.apps/memcached1 1/1 1 1 50m memcached1 memcached:latest app=memcached1
deployment.apps/memcached2 1/1 1 1 48m memcached2 memcached:latest app=memcached2
deployment.apps/mysql 1/1 1 1 2d mysql mysql:5.7 app=mysql
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/app-577658dc67 1 1 1 44m app instrutordocker/4linux-app:latest app=app,pod-template-hash=577658dc67
replicaset.apps/app-6df548778d 0 0 0 20h app instrutordocker/4linux-app:latest app=app,pod-template-hash=6df548778d
replicaset.apps/app-f549cf775 0 0 0 2d app instrutordocker/4linux-app:latest app=app,pod-template-hash=f549cf775
replicaset.apps/memcached1-6487bb895f 1 1 1 50m memcached1 memcached:latest app=memcached1,pod-template-hash=6487bb895f
replicaset.apps/memcached2-56fb6d54cf 1 1 1 48m memcached2 memcached:latest app=memcached2,pod-template-hash=56fb6d54cf
replicaset.apps/mysql-56b679f667 0 0 0 20h mysql mysql:5.7 app=mysql,pod-template-hash=56b679f667
replicaset.apps/mysql-9bcb6fb76 1 1 1 41m mysql mysql:5.7 app=mysql,pod-template-hash=9bcb6fb76
replicaset.apps/mysql-cc8b4bdf7 0 0 0 2d mysql mysql:5.7 app=mysql,pod-template-hash=cc8b4bdf7