Skip to main content

Minikube: Deploying to Our Cluster

Hands-On Lab

 

Photo of Michael McClaren

Michael McClaren

Linux Training Architect I in Content

Length

00:30:00

Difficulty

Beginner

In this hands-on lab we will be creating a deployment from scratch, using a YAML template, and deploying it to our Minikub cluster. Once everything looks like it's up and running, we'll run some tests.

What are Hands-On Labs?

Hands-On Labs are scenario-based learning environments where learners can practice without consequences. Don't compromise a system or waste money on expensive downloads. Practice real-world skills without the real-world risk, no assembly required.

Minikube: Deploying to Our Cluster

Introduction

In this hands-on lab we will be creating a deployment from scratch, using a YAML template, and deploying it to our Minikub cluster. Once everything looks like it's up and running, we'll run some tests.

The Scenario

We have been asked to create an Nginx deployment so that developers can use local storage to update the index file that is normally found in /usr/share/nginx/html. That file needs to be mapped to /home/cloud_user/indexdoc. And since this has to be maintained in version control, it needs to be a single file deployment that also contains an external service for the Nginx server.

Logging In

Use the credentials provided on the hands-on lab overview page, and log in as cloud_user.

Start the Minikube Cluster Using the Correct Driver

Issue the command to start minikube

sudo minikube start --vm-driver none

Create an Nginx Deployment from the Template

We can create the deployment using the file ~/nginx-deployment-template.yaml. Use the Nginx pv-deployment.yaml file as a reference if needed.

Our deployment should look similar to this:

kind: Service
apiVersion: v1
metadata:
    name: nginx-service
    labels:
      app: nginx-volume
spec:
    type: NodePort
    selector:
      app: nginx-volume
    ports:
        - nodePort: 30002
          port: 8080
          targetPort: 80
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nginx-stor
  labels:
    app: nginx-deploy
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/home/cloud_user/indexdoc"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
  labels:
    app: nginx-deploy
spec:
 storageClassName: manual
 accessModes:
   - ReadWriteOnce
 resources:
   requests:
     storage: 3Gi
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx-deploy
spec:
  selector:
    matchLabels:
      app: nginx-deploy
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nginx-deploy
    spec:
      containers:
          - name: nginx-cont
            image: nginx
            ports:
            - containerPort: 80
            volumeMounts:
            - name: nginx-vol
              mountPath: "/usr/share/nginx/html"
      volumes:
      - name: nginx-vol
        persistentVolumeClaim:
          claimName: nginx-pvc

Create the Index File and Create the Nginx Deployment

Run the following to create the index:

mkdir ~/indexdoc
echo 'this is the local index file' > ./indexdoc/index.html

Now let's create the Nginx deployment using kubectl:

sudo kubectl create -f ~/nginx-deployment-template.yaml

We need make sure the Nginx pod is up and running, and get its IP:

sudo kubectl get po -o wide

And now we can run curl on that IP, to see if the index loads:

curl <POD_IP>

The output of that should be the this is the local index file that we put in ./indexdoc/index.html a couple minutes ago.

Conclusion

That concludes the lab. We created an Nginx deployment and were able to map the normal index to a local index file. Congratulations!