/
controlled-cloudflared-connector.go
98 lines (91 loc) 路 2.47 KB
/
controlled-cloudflared-connector.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package controller
import (
"context"
cloudflarecontroller "github.com/STRRL/cloudflare-tunnel-ingress-controller/pkg/cloudflare-controller"
"github.com/pkg/errors"
appsv1 "k8s.io/api/apps/v1"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/utils/pointer"
"sigs.k8s.io/controller-runtime/pkg/client"
)
func CreateControlledCloudflaredIfNotExist(
ctx context.Context,
kubeClient client.Client,
tunnelClient *cloudflarecontroller.TunnelClient,
namespace string,
) error {
list := appsv1.DeploymentList{}
err := kubeClient.List(ctx, &list, &client.ListOptions{
Namespace: namespace,
LabelSelector: labels.SelectorFromSet(labels.Set{
"strrl.dev/cloudflare-tunnel-ingress-controller": "controlled-cloudflared-connector",
}),
})
if err != nil {
return errors.Wrapf(err, "list controlled-cloudflared-connector in namespace %s", namespace)
}
if len(list.Items) > 0 {
return nil
}
token, err := tunnelClient.FetchTunnelToken(ctx)
if err != nil {
return errors.Wrap(err, "fetch tunnel token")
}
deployment := cloudflaredConnectDeploymentTemplating(token, namespace)
err = kubeClient.Create(ctx, deployment)
if err != nil {
return errors.Wrap(err, "create controlled-cloudflared-connector deployment")
}
return nil
}
func cloudflaredConnectDeploymentTemplating(token string, namespace string) *appsv1.Deployment {
appName := "controlled-cloudflared-connector"
return &appsv1.Deployment{
ObjectMeta: metav1.ObjectMeta{
Name: appName,
Namespace: namespace,
Labels: map[string]string{
"app": appName,
"strrl.dev/cloudflare-tunnel-ingress-controller": "controlled-cloudflared-connector",
},
},
Spec: appsv1.DeploymentSpec{
Replicas: pointer.Int32(1),
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{
"app": appName,
},
},
Template: v1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Name: appName,
Labels: map[string]string{
"app": appName,
},
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Name: appName,
Image: "cloudflare/cloudflared:latest",
ImagePullPolicy: v1.PullIfNotPresent,
Command: []string{
"cloudflared",
"--no-autoupdate",
"tunnel",
"--metrics",
"0.0.0.0:44483",
"run",
"--token",
token,
},
},
},
RestartPolicy: v1.RestartPolicyAlways,
},
},
},
}
}