Followers

EBS-Persistent Volume

 

create namespace

To separate your cluster resources logically it is best practice to use namespaces. You can separate either by project, customer, team, environment,... The benefit you gain is by getting control over resource qoutas, access control etc

    kubectl create namespace ns-eks

Create a storageclass (gp2-storage.yaml)

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: gp2
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
reclaimPolicy: Retain
mountOptions:
  - debug
volumeBindingMode: Immediate

# Run below command to create above storage class

kubectl apply -f gp2-storage-class.yaml --namespace=ns-eks

check current situation:

kubectl get storageclasses --namespace=ns-eks

set default:

kubectl patch storageclass gp2 -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' --namespace=ns-eks

check again:

kubectl get storageclasses --namespace=ns-eks

define a persistent volume claim (pvcs.yaml)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

kubectl apply -f pvcs.yaml --namespace=ns-eks

and check:

kubectl get pvc --namespace=ns-eks

deploy mysql

create secret which stores mysql pw, to be injected as env var into container

kubectl create secret generic mysql-pass --from-literal=password=eks-course-mysql-pw --namespace=ns-eks

check:

kubectl get secrets --namespace=ns-eks

create deploy-mysql.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              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

launch mysql deployment

kubectl apply -f deploy-mysql.yaml --namespace=ns-eks

checks

  • persistent volumes
  • persistent volume claims
  • pods
kubectl get pv --namespace=ns-eks
kubectl get pvc --namespace=ns-eks
kubectl get pods -o wide --namespace=ns-eks
  • EBS volumes goto AWS mgm console => EC2 => Elastic Block store => volumes

deploy wordpress (deploy-wordpress.yaml)

apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: LoadBalancer
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: wordpress:4.8-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-claim

kubectl apply -f deploy-wordpress.yaml --namespace=ns-eks

get URL of the app:

kubectl describe service wordpress --namespace=ns-eks | grep Ingress

or goto AWS console => EC2

Create stateful

apiVersion: v1
kind: Service
metadata:
  name: wordpress-statefulset
  labels:
    app: wordpress-statefulset
spec:
  ports:
    - port: 80
  selector:
    app: wordpress-statefulset
    tier: frontend
  type: LoadBalancer
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: StatefulSet
metadata:
  name: wordpress-statefulset
  labels:
    app: wordpress-statefulset
spec:
  selector:
    matchLabels:
      app: wordpress-statefulset
      tier: frontend
  replicas: 1
  serviceName: wordpress-statefulset-frontend
  template:
    metadata:
      labels:
        app: wordpress-statefulset
        tier: frontend
    spec:
      containers:
      - image: wordpress:4.8-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
        ports:
        - containerPort: 80
          name: wordpress
  volumeClaimTemplates:
  - metadata:
      name: wordpress-persistent-storage
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      storageClassName: gp2

cleanup

delete Wordpress deployment

kubectl delete -f deploy-wordpress-by-deployment.yaml --namespace=ns-eks
kubectl delete -f deploy-wordpress-by-statefulset.yaml --namespace=ns-eks

delete MySQL deployment

kubectl delete -f deploy-mysql.yaml --namespace=ns-eks

delete EBS volumes
since we specified policy retain for the pv's, we have to delete them manually after deleting the pods, which had them in use. For that go to AWS mgm console => EC2 => Volumes => select and delete the detached ones

COMMENTS

BLOGGER
Sneeit.Com
Name

Ansible,6,AWS,1,Azure DevOps,1,Containerization with docker,2,DevOps,2,Docker file with buildkit,1,Docker file with buildx,1,Docker Image Scan,1,Docker Quiz,1,Docker Swarm,1,DockerCompose,1,ELK,2,git,2,git quiz,1,Git Worksheet,1,headless service DNS service record,1,ITIL,1,ITSM,1,Jira,3,Kubernetes,1,Kubernetes Quiz,5,SAST DAST Security Testing,1,SDLC Quiz,5,SonarQube,3,Splunk,2,vagrant kubernetes,1,Windows,1,YAML Basics,1,
ltr
static_page
DevOpsWorld: EBS-Persistent Volume
EBS-Persistent Volume
DevOpsWorld
https://www.devopsworld.co.in/p/ebs-persistent-volume.html
https://www.devopsworld.co.in/
https://www.devopsworld.co.in/
https://www.devopsworld.co.in/p/ebs-persistent-volume.html
true
5997357714110665304
UTF-8
Loaded All Posts Not found any posts VIEW ALL Readmore Reply Cancel reply Delete By Home PAGES POSTS View All RECOMMENDED FOR YOU LABEL ARCHIVE SEARCH ALL POSTS Not found any post match with your request Back Home Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sun Mon Tue Wed Thu Fri Sat January February March April May June July August September October November December Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec just now 1 minute ago $$1$$ minutes ago 1 hour ago $$1$$ hours ago Yesterday $$1$$ days ago $$1$$ weeks ago more than 5 weeks ago Followers Follow THIS PREMIUM CONTENT IS LOCKED STEP 1: Share to a social network STEP 2: Click the link on your social network Copy All Code Select All Code All codes were copied to your clipboard Can not copy the codes / texts, please press [CTRL]+[C] (or CMD+C with Mac) to copy Table of Content