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-claim
and request a250Mi
of 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
NodePort
type service namedmysql
and set nodePort to30007
.5.) Create a secret named
mysql-root-pass
having a key pair value, where key ispassword
and its value isYUIidhb667
, create another secret namedmysql-user-pass
having some key pair values, where frist key isusername
and its value iskodekloud_tim
, second key ispassword
and value isTmPcZjtRQx
, create one more secret namedmysql-db-url
, key name isdatabase
and value iskodekloud_db4
6.) Define some Environment variables within the container:
a)
name: MYSQL_ROOT_PASSWORD
, should pick value from secretKeyRefname: mysql-root-pass
andkey: password
b)
name: MYSQL_DATABASE
, should pick value from secretKeyRefname: mysql-db-url
andkey: database
c)
name: MYSQL_USER
, should pick value from secretKeyRefname: mysql-user-pass
keykey: username
d)
name: MYSQL_PASSWORD
, should pick value from secretKeyRefname: mysql-user-pass
andkey: password
Note:
Thekubectl
utility onjump_host
has 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