Skip to content

Commit caa8fce

Browse files
committed
Workaround konnectivity ingress issue
Signed-off-by: Alexey Makhov <[email protected]> Signed-off-by: makhov <[email protected]>
1 parent 6f3016f commit caa8fce

File tree

3 files changed

+140
-1
lines changed

3 files changed

+140
-1
lines changed

e2e/ingress_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"time"
3030

3131
e2eutil "github.com/k0sproject/k0smotron/e2e/util"
32+
podexec "github.com/k0sproject/k0smotron/internal/exec"
3233
"github.com/k0sproject/k0smotron/internal/util"
3334
"github.com/stretchr/testify/require"
3435
corev1 "k8s.io/api/core/v1"
@@ -152,6 +153,14 @@ func ingressSupportSpec(t *testing.T) {
152153
clusterv1.ClusterNameLabel: workloadClusterName,
153154
}), "Should list machines")
154155

156+
podList := &corev1.PodList{}
157+
err = bootstrapClusterProxy.GetClient().List(ctx, podList, client.InNamespace(testNamespace.Name))
158+
require.NoError(t, err, "Should list k0smotron pods")
159+
time.Sleep(10 * time.Second) // Wait a bit for konnectivity agent to have logs
160+
out, err := podexec.PodExecCmdOutput(ctx, bootstrapClusterProxy.GetClientSet(), bootstrapClusterProxy.GetRESTConfig(), podList.Items[0].Name, testNamespace.Name, "k0s kc logs -n kube-system ds/konnectivity-agent")
161+
require.NoError(t, err)
162+
t.Logf("Konnectivity agent logs:\n%s", string(out))
163+
155164
for _, m := range machineList.Items {
156165
var (
157166
stdout bytes.Buffer

internal/controller/k0smotron.io/k0smotroncluster_configmap.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ func getV1Beta1Spec(kmc *km.Cluster, sans []string) map[string]interface{} {
281281
}
282282
v1beta1Spec["konnectivity"] = map[string]any{
283283
"externalAddress": kmc.Spec.Ingress.KonnectivityHost,
284-
"agentPort": kmc.Spec.Ingress.Port,
284+
"agentPort": int64(kmc.Spec.Service.KonnectivityPort),
285285
}
286286
}
287287

internal/controller/k0smotron.io/k0smotroncluster_ingress.go

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,18 @@ func (scope *kmcScope) reconcileIngress(ctx context.Context, kmc *km.Cluster) er
2929
return fmt.Errorf("failed to patch haproxy configmap for ingress: %w", err)
3030
}
3131

32+
configMap, err = scope.generateKonnectivityIngressConfigMap(kmc)
33+
if err != nil {
34+
return fmt.Errorf("failed to generate ingress manifests configmap: %w", err)
35+
}
36+
_ = kcontrollerutil.SetExternalOwnerReference(kmc, &configMap, scope.client.Scheme(), scope.externalOwner)
37+
38+
err = scope.client.Patch(ctx, &configMap, client.Apply, patchOpts...)
39+
40+
if err != nil {
41+
return fmt.Errorf("failed to patch haproxy configmap for ingress: %w", err)
42+
}
43+
3244
var foundManifest bool
3345
for _, manifest := range kmc.Spec.Manifests {
3446
if manifest.Name == kmc.GetIngressManifestsConfigMapName() {
@@ -46,6 +58,15 @@ func (scope *kmcScope) reconcileIngress(ctx context.Context, kmc *km.Cluster) er
4658
},
4759
},
4860
},
61+
}, corev1.Volume{
62+
Name: "konnectivity",
63+
VolumeSource: corev1.VolumeSource{
64+
ConfigMap: &corev1.ConfigMapVolumeSource{
65+
LocalObjectReference: corev1.LocalObjectReference{
66+
Name: kmc.GetIngressManifestsConfigMapName() + "-konnectivity",
67+
},
68+
},
69+
},
4970
})
5071
}
5172

@@ -173,6 +194,115 @@ spec:
173194
return configMap, nil
174195
}
175196

197+
func (scope *kmcScope) generateKonnectivityIngressConfigMap(kmc *km.Cluster) (corev1.ConfigMap, error) {
198+
configMap := corev1.ConfigMap{
199+
TypeMeta: metav1.TypeMeta{
200+
Kind: "ConfigMap",
201+
APIVersion: "v1",
202+
},
203+
ObjectMeta: metav1.ObjectMeta{
204+
Name: kmc.GetIngressManifestsConfigMapName() + "-konnectivity",
205+
Namespace: kmc.Namespace,
206+
Annotations: kcontrollerutil.AnnotationsForK0smotronCluster(kmc),
207+
},
208+
Data: map[string]string{
209+
"konnectivity-agent.yaml": fmt.Sprintf(`apiVersion: rbac.authorization.k8s.io/v1
210+
kind: ClusterRoleBinding
211+
metadata:
212+
name: system:konnectivity-server
213+
labels:
214+
kubernetes.io/cluster-service: "true"
215+
roleRef:
216+
apiGroup: rbac.authorization.k8s.io
217+
kind: ClusterRole
218+
name: system:auth-delegator
219+
subjects:
220+
- apiGroup: rbac.authorization.k8s.io
221+
kind: User
222+
name: system:konnectivity-server
223+
---
224+
apiVersion: v1
225+
kind: ServiceAccount
226+
metadata:
227+
name: konnectivity-agent
228+
namespace: kube-system
229+
labels:
230+
kubernetes.io/cluster-service: "true"
231+
---
232+
apiVersion: apps/v1
233+
kind: DaemonSet
234+
metadata:
235+
labels:
236+
k8s-app: konnectivity-agent
237+
namespace: kube-system
238+
name: konnectivity-agent
239+
spec:
240+
selector:
241+
matchLabels:
242+
k8s-app: konnectivity-agent
243+
template:
244+
metadata:
245+
labels:
246+
k8s-app: konnectivity-agent
247+
annotations:
248+
prometheus.io/scrape: 'true'
249+
prometheus.io/port: '8093'
250+
spec:
251+
securityContext:
252+
runAsNonRoot: true
253+
supplementalGroups: [0]
254+
nodeSelector:
255+
kubernetes.io/os: linux
256+
priorityClassName: system-cluster-critical
257+
tolerations:
258+
- operator: Exists
259+
containers:
260+
- image: quay.io/k0sproject/apiserver-network-proxy-agent:v0.33.0
261+
imagePullPolicy: IfNotPresent
262+
name: konnectivity-agent
263+
command: ["/proxy-agent"]
264+
env:
265+
- name: NODE_IP
266+
valueFrom:
267+
fieldRef:
268+
fieldPath: status.hostIP
269+
args:
270+
- --logtostderr=true
271+
- --ca-cert=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
272+
- --proxy-server-host=%s
273+
- --proxy-server-port=%d
274+
- --service-account-token-path=/var/run/secrets/tokens/konnectivity-agent-token
275+
- --agent-identifiers=host=$(NODE_IP)
276+
- --agent-id=$(NODE_IP)
277+
volumeMounts:
278+
- mountPath: /var/run/secrets/tokens
279+
name: konnectivity-agent-token
280+
livenessProbe:
281+
httpGet:
282+
port: 8093
283+
path: /healthz
284+
initialDelaySeconds: 15
285+
timeoutSeconds: 15
286+
readinessProbe:
287+
httpGet:
288+
port: 8093
289+
path: /readyz
290+
initialDelaySeconds: 15
291+
timeoutSeconds: 15
292+
serviceAccountName: konnectivity-agent
293+
volumes:
294+
- name: konnectivity-agent-token
295+
projected:
296+
sources:
297+
- serviceAccountToken:
298+
path: konnectivity-agent-token
299+
audience: system:konnectivity-server`, kmc.Spec.Ingress.KonnectivityHost, kmc.Spec.Ingress.Port),
300+
},
301+
}
302+
303+
return configMap, nil
304+
}
305+
176306
func (scope *kmcScope) generateIngress(kmc *km.Cluster) v1.Ingress {
177307
annotations := kcontrollerutil.AnnotationsForK0smotronCluster(kmc)
178308
if annotations == nil {

0 commit comments

Comments
 (0)