Recently I needed to test the full HTTP stack between a Kubernetes cluster's member nodes and an external Internet routing setup, and so I wanted to quickly install K3s (which includes Traefik by default, and load balances through ports 80 and 443 on all nodes), then get a quick 'hello world' web page up, so I could see if the traffic was routing properly all the way from the external host through to a running container exposed via Traefik Ingress.
Here's how I set up a basic 'Hello World' web page on my K3s cluster:
First, I created an HTML file to be stored as a ConfigMap. Create a file named index.html
with the following contents:
<html>
<head>
<title>Hello World!</title>
</head>
<body>Hello World!</body>
</html>
Create a ConfigMap with the HTML from the file you just created:
$ kubectl create configmap hello-world --from-file index.html
Save the following to Kubernetes resource definitions into a file named hello-world.yml
:
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-world
annotations:
kubernetes.io/ingress.class: "traefik"
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: hello-world
port:
number: 80
---
apiVersion: v1
kind: Service
metadata:
name: hello-world
spec:
ports:
- port: 80
protocol: TCP
selector:
app: hello-world
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world-nginx
spec:
selector:
matchLabels:
app: hello-world
replicas: 3
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: hello-world-volume
mountPath: /usr/share/nginx/html
volumes:
- name: hello-world-volume
configMap:
name: hello-world
Then deploy the Nginx container deployment, Service, and Traefik Ingress resources with:
$ kubectl apply -f hello-world.yml
After a few seconds, you should be able to access port 80 on any member nodes (assuming networking is working), and get back:
$ curl localhost:80
<html>
<head>
<title>Hello World!</title>
</head>
<body>Hello World!</body>
</html>
And in my case, I could test out the external routing and make sure that same response was making it through. Yay!
Comments
Lets see the same thing with metallb rather than traefik for the load balancer !
Running the latest k3s on Debian 11, I don't get hello-world from localhost:80, I have to use
curl localhost:80/hello-world.html
I'm not sure what the issue is, I'll report back once I understand.
Please disregard my comment, I didn't name the file index.html
doesn't work.