Task: 
A new MySQL server needs to be deployed on Kubernetes cluster. The Nautilus DevOps team was working on to gather the requirements. Recently they were able to finalize the requirements and shared them with the team members to start working on it. Below you can find the details:
1.) Create a PersistentVolume
mysql-pv, its capacity should be250Mi, set other parameters as per your preference.2.) Create a PersistentVolumeClaim to request this PersistentVolume storage. Name it as
mysql-pv-claimand request a250Miof storage. Set other parameters as per your preference.3.) Create a deployment named
mysql-deployment, use any mysql image as per your preference. Mount the PersistentVolume at mount path/var/lib/mysql.4.) Create a
NodePorttype service namedmysqland set nodePort to30007.5.) Create a secret named
mysql-root-passhaving a key pair value, where key ispasswordand its value isYUIidhb667, create another secret namedmysql-user-passhaving some key pair values, where frist key isusernameand its value iskodekloud_tim, second key ispasswordand value isTmPcZjtRQx, create one more secret namedmysql-db-url, key name isdatabaseand value iskodekloud_db46.) Define some Environment variables within the container:
a)
name: MYSQL_ROOT_PASSWORD, should pick value from secretKeyRefname: mysql-root-passandkey: passwordb)
name: MYSQL_DATABASE, should pick value from secretKeyRefname: mysql-db-urlandkey: databasec)
name: MYSQL_USER, should pick value from secretKeyRefname: mysql-user-passkeykey: usernamed)
name: MYSQL_PASSWORD, should pick value from secretKeyRefname: mysql-user-passandkey: password
Note:Thekubectlutility onjump_hosthas been configured to work with the kubernetes cluster.
Solution :
1.) Create a PersistentVolume mysql-pv, its capacity should be 250Mi, set other parameters as per your preference. 
thor@jump_host ~$ cat pv.yaml 
apiVersion: v1 
kind: PersistentVolume            
metadata:
  name: mysql-pv
  labels: 
    type: local 
spec:
  storageClassName: standard      
  capacity:
    storage: 250Mi
  accessModes: 
    - ReadWriteOnce
  hostPath:                       
    path: "/var/lib/mysql" 
  persistentVolumeReclaimPolicy: Retain  
thor@jump_host ~$ kubectl create -f pv.yaml
persistentvolume/mysql-pv created 
2.) Create a PersistentVolumeClaim to request this PersistentVolume storage. Name it as mysql-pv-claim and request a 250Mi of storage. Set other parameters as per your preference.
thor@jump_host ~$ cat pvc.yaml 
apiVersion: v1 
kind: PersistentVolumeClaim 
metadata:                          
  name: mysql-pv-claim
  labels:
    app: mysql-app 
spec:                              
  storageClassName: standard       
  accessModes:
    - ReadWriteOnce                
  resources:
    requests: 
      storage: 250Mi
thor@jump_host ~$ kubectl create -f pvc.yaml 
persistentvolumeclaim/mysql-pv-claim created
5.) Create a secret named mysql-root-pass having a key pair value, where key is password and its value is YUIidhb667, create another secret named mysql-user-pass having some key pair values, where frist key is username and its value is kodekloud_aim, second key is password and value is YchZHRcLkL, create one more secret named mysql-db-url, key name is database and value is kodekloud_db6
 thor@jump_host ~$ kubectl create secret generic mysql-root-pass --from-literal=password=YUIidhb667secret/mysql-root-pass created
thor@jump_host ~$ kubectl create secret generic mysql-user-pass --from-literal=username=kodekloud_aim --from-literal=password=YUIidhb667
secret/mysql-user-pass created
thor@jump_host ~$ kubectl create secret generic mysql-db-url --from-literal=database=kodekloud_db9secret/mysql-db-url created
4.) Create a NodePort type service named mysql and set nodePort to 30007.
thor@jump_host ~$ cat svc.yaml 
apiVersion: v1                    
kind: Service                      
metadata:
  name: mysql         
  labels:             
    app: mysql-app
spec:
  type: NodePort
  ports:
    - targetPort: 3306
      port: 3306
      nodePort: 30007
  selector:    
    app: mysql-app
    tier: mysql
thor@jump_host ~$ kubectl create -f svc.yaml 
service/mysql created
thor@jump_host ~$  
 
3.) Create a deployment named mysql-deployment, use any mysql image as per your preference. Mount the PersistentVolume at mount path /var/lib/mysql.
&& 
 6.) Define some Environment variables within the container
thor@jump_host ~$ cat deployment.yaml 
apiVersion: apps/v1 
kind: Deployment            
metadata:
  name: mysql-deployment       
  labels:                       
    app: mysql-app 
spec:
  selector:
    matchLabels:
      app: mysql-app
      tier: mysql 
  strategy:
    type: Recreate
  template:                    
    metadata:
      labels:                  
        app: mysql-app
        tier: mysql 
    spec:                       
      containers: 
      - image: mysql
        name: mysql
        env:                        
        - name: MYSQL_ROOT_PASSWORD 
          valueFrom:                
            secretKeyRef: 
              name: mysql-root-pass 
              key: password 
        - name: MYSQL_DATABASE
          valueFrom:
            secretKeyRef: 
              name: mysql-db-url 
              key: database 
        - name: MYSQL_USER
          valueFrom:
            secretKeyRef:
              name: mysql-user-pass
              key: username
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-user-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
thor@jump_host ~$ kubectl create -f deployment.yaml 
deployment.apps/mysql-deployment created
Validate all the Services:
thor@jump_host ~$ kubectl get all
NAME                                    READY   STATUS    RESTARTS   AGE
pod/mysql-deployment-84f954fc46-hxg46   1/1     Running   0          2m21s
NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
service/kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP          70m
service/mysql        NodePort    10.96.75.38   <none>        3306:30007/TCP   6m17s
NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mysql-deployment   1/1     1            1           2m21s
NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/mysql-deployment-84f954fc46   1         1         1       2m21s
 
  
 
 
No comments:
Post a Comment