Cloudflare Tunnels
Considerations:
https://github.com/STRRL/cloudflare-tunnel-ingress-controller?tab=readme-ov-file
https://github.com/adyanth/cloudflare-operator/tree/main
Followed getting started from adyanth/cloudflare-operator
$ kubectl apply -k https://github.com/adyanth/cloudflare-operator/config/default
namespace/cloudflare-operator-system created
customresourcedefinition.apiextensions.k8s.io/clustertunnels.networking.cfargotunnel.com created
customresourcedefinition.apiextensions.k8s.io/tunnelbindings.networking.cfargotunnel.com created
customresourcedefinition.apiextensions.k8s.io/tunnels.networking.cfargotunnel.com created
serviceaccount/cloudflare-operator-controller-manager created
role.rbac.authorization.k8s.io/cloudflare-operator-leader-election-role created
clusterrole.rbac.authorization.k8s.io/cloudflare-operator-manager-role created
clusterrole.rbac.authorization.k8s.io/cloudflare-operator-metrics-reader created
clusterrole.rbac.authorization.k8s.io/cloudflare-operator-proxy-role created
rolebinding.rbac.authorization.k8s.io/cloudflare-operator-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/cloudflare-operator-manager-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/cloudflare-operator-proxy-rolebinding created
configmap/cloudflare-operator-manager-config created
service/cloudflare-operator-controller-manager-metrics-service created
deployment.apps/cloudflare-operator-controller-manager created
kubectl -n cloudflare-operator-system create secret generic cloudflare-secrets --from-literal CLOUDFLARE_API_TOKEN=xxxx --from-literal CLOUDFLARE_API_KEY=xxxx
waji@DESKTOP-LAJ2REG:~$ k apply -f cloudflare-cluster-tunnel.yaml
clustertunnel.networking.cfargotunnel.com/cloudflare-cluster-tunnel created
waji@DESKTOP-LAJ2REG:~$ k get clustertunnel cloudflare-cluster-tunnel
NAME TUNNELID
cloudflare-cluster-tunnel 4f54909e-0963-4131-a33f-ed71b5dbc3d2
waji@DESKTOP-LAJ2REG:~$ k get cm -n cloudflare-operator-system
NAME DATA AGE
cloudflare-cluster-tunnel 1 16s
cloudflare-operator-manager-config 1 5m22s
kube-root-ca.crt 1 5m23s
waji@DESKTOP-LAJ2REG:~$ k get deploy -n cloudflare-operator-system
NAME READY UP-TO-DATE AVAILABLE AGE
cloudflare-cluster-tunnel 2/2 2 2 21s
cloudflare-operator-controller-manager 1/1 1 1 5m27s
Need to convert above into the Helm chart and then test again
Done helm chart.
Need to deploy it in a chart repo
Try to get the servicemonitor right → Maybe we can use ‘Probes’
Cloudflare Tunnels bind with Ingress Nginx Controller
We need ingress controller deployed with its Service as ClusterIP
homelab@bastion:~$ k get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller ClusterIP 10.96.16.136 <none> 80/TCP,443/TCP 15m
Deploy cloudflare operator
homelab@bastion:~$ helm install cloudflare-operator cloudflare-operator/ -n cloudflare-operator-system
NAME: cloudflare-operator
LAST DEPLOYED: Fri Apr 12 16:34:09 2024
NAMESPACE: cloudflare-operator-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
homelab@bastion:~$ k get secrets -n cloudflare-operator-system
NAME TYPE DATA AGE
cloudflare-secrets Opaque 2 7s
sh.helm.release.v1.cloudflare-operator.v1 helm.sh/release.v1 1 8s
homelab@bastion:~$ k get po -n cloudflare-operator-system
NAME READY STATUS RESTARTS AGE
cloudflare-cluster-tunnel-5994cf67f6-5rxf5 1/1 Running 0 24s
cloudflare-cluster-tunnel-5994cf67f6-ng78n 1/1 Running 0 24s
cloudflare-operator-controller-manager-89756d7b7-vzr6l 2/2 Running 0 46s
homelab@bastion:~$ k get clustertunnels.networking.cfargotunnel.com
NAME TUNNELID
cloudflare-cluster-tunnel 3cbd1598-9901-4084-9342-18d216ab2072
Then we need to deploy this tunnelbinding
apiVersion: networking.cfargotunnel.com/v1alpha1
kind: TunnelBinding
metadata:
name: ingress-nginx
namespace: ingress-nginx
subjects:
- name: ingress-nginx-controller
kind: Service
spec:
fqdn: "*.homek8s.cloud"
tunnelRef:
kind: ClusterTunnel
name: cloudflare-cluster-tunnel
We should be able to see
homelab@bastion:~$ k get tunnelbindings.networking.cfargotunnel.com -n ingress-nginx
NAME FQDNS
ingress-nginx *.homek8s.cloud
Our DNS records should show
The tunnel
Now we deploy a ingress resource
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hubble-ingress
namespace: kube-system
spec:
ingressClassName: nginx
rules:
- host: hubble.homek8s.cloud
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: hubble-ui
port:
number: 80
After deploying
homelab@bastion:~$ k get ing -n kube-system
NAME CLASS HOSTS ADDRESS PORTS AGE
hubble-ingress nginx hubble.homek8s.cloud 10.96.16.136 80 11m
Check hubble ui
Test another app