title | excerpt | updated |
---|---|---|
Deploying an application |
Find out how to deploy a "Hello World" application on an OVHcloud Managed Kubernetes cluster |
2023-06-06 |
OVHcloud Managed Kubernetes service provides you with Kubernetes clusters without the hassle of installation or operation. This guide will explain how to deploy a simple Hello World application on a OVHcloud Managed Kubernetes cluster.
- an OVHcloud Managed Kubernetes cluster
- at least one node on the cluster (see the ordering a node guide for details)
- a well configured
kubectl
(see the configuring kubectl guide for details)
Warning
When a LoadBalancer Service resource is created inside a Managed Kubernetes cluster, an associated Public Cloud Load Balancer is automatically created, allowing public access to your K8S application. The Public Cloud Load Balancer service is hourly charged and will appear in your Public Cloud project. For more information, please refer to the following documentation: Network Load Balancer price.
The following command will deploy a simple application (nginx image) using a Kubernetes Deployment and a Kubernetes Service.
Create a new namespace:
kubectl create ns hello-app
Create a hello.yml
file for our ovhplatform/hello
Docker image:
apiVersion: v1
kind: Service
metadata:
name: hello-world
labels:
app: hello-world
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
selector:
app: hello-world
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world-deployment
labels:
app: hello-world
spec:
replicas: 1
selector:
matchLabels:
app: hello-world
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: ovhplatform/hello
ports:
- containerPort: 80
And apply the file:
kubectl apply -f hello.yml -n hello-app
After applying the YAML file, a new hello-world
service and the corresponding hello-world-deployment
deployment are created in the hello-app
namespace:
$ kubectl apply -f hello.yml -n hello-app
service/hello-world created
deployment.apps/hello-world-deployment created
[!primary] The application you have just deployed is a simple Nginx server with a single static Hello World page. Basically it just deploys the Docker image
ovhplatform/hello
{.external}.
You have just deployed a hello-world
service in a pod in your worker node. Let's verify that everything is correct by listing the pods.
kubectl get pods -n hello-app -l app=hello-world
You should see your newly created pod:
$ kubectl get pods -n hello-app -l app=hello-world
NAME READY STATUS RESTARTS AGE
hello-world-deployment-d98c6464b-7jqvg 1/1 Running 0 47s
[!primary] In this tutorial, we chose to create a special namespace to isolate our application.
But if you want to use the
default
namespace instead, it's the default Kubernetes namespace so you don't need to specify it in your kubectl commands.
You can also verify that the deployment is active:
kubectl get deploy -n hello-app -l app=hello-world
And you will see the hello-service-deployment
:
$ kubectl get deploy -n hello-app -l app=hello-world
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
hello-world-deployment 1 1 1 1 1m
Now, you will use kubectl
to view your service:
kubectl get services -n hello-app -l app=hello-world
You should see your newly created service:
$ kubectl get services -n hello-app -l app=hello-world
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-world LoadBalancer 10.3.234.211 51.178.69.47 80:31885/TCP 6m54s
[!primary] In case you get
<pending>
underEXTERNAL-IP
, it may take a minute or two to provision the LoadBalancer, so try again in a few moments.
Retrieve the URL of the hello-world
application:
$ export SERVICE_URL=$(kubectl get svc hello-world -n hello-app -o jsonpath='{.status.loadBalancer.ingress[].ip}')
$ echo "http://$SERVICE_URL/"
http://135.125.83.30/
Copy/paste the URL in your browser to see your new running hello-world
application:
You can also test the newly created service, in command line, with curl:
curl $SERVICE_URL
You should see your newly created service:
curl $SERVICE_URL
<!doctype html>
<html>
<head>
<title>OVH K8S</title>
</head>
<body>
<div class="title">
<p>Hello from Kubernetes!</p>
<img src="./ovh.svg"/>
</div>
</body>
</html>
[!primary] If you have an error message "Failed to connect to 135.125.83.30 port 80: Connection refused", it's normal. The service is starting, so you have to wait a few seconds in order to test it again.
At the end, you can clean up by deleting the service and the deployment.
Let's delete the namespace (deleting the namespace will delete all resources created within it, including the deployment and the service):
kubectl delete ns hello-app
If you list the services, the deployments and the pods, you will see that hello-world
doesn't exist anymore:
$ kubectl delete service hello-world -n hello-app
namespace "hello-app" deleted
$ kubectl get services -l app=hello-world -n hello-app
No resources found in hello-app namespace.
$ kubectl get deployments -n hello-app -l app=hello-world
No resources found in hello-app namespace.
$ kubectl get pods -n hello-app -l app=hello-world
No resources found in hello-app namespace.
To learn more about using your Kubernetes cluster the practical way, we invite you to look at our OVHcloud Managed Kubernetes doc site.
-
If you need training or technical assistance to implement our solutions, contact your sales representative or click on this link to get a quote and ask our Professional Services experts for assisting you on your specific use case of your project.
-
Join our community of users.