treewide: bump to k8s v1.33.2

Update Kubernetes to 1.33 which is already at patch version 2. As part
of K8s gomod dependencies containerd was bumped a minor release to 2.1.3.
The UserNamespacesSupport feature gate is now default-on and was thus
dropped. The netlink patches were upstreamed and can now be dropped as
part of the depenency update. A new klog sink adapter for our logging
interface was introduced as the client-go MutationCache now requires a
logger.

containerd abuses gRPC interfaces for mocking, thus they are not
forward-compatible and need a new patch to be compatible with the
CRI version now being used.

Change-Id: I4feb2ab3bcfca5b83c7ea38ed444b14ade1e9bf0
Reviewed-on: https://review.monogon.dev/c/monogon/+/4433
Tested-by: Jenkins CI
Reviewed-by: Lorenz Brun <lorenz@monogon.tech>
diff --git a/osbase/logtree/klog.go b/osbase/logtree/klog.go
index 54e7f68..6dd60e7 100644
--- a/osbase/logtree/klog.go
+++ b/osbase/logtree/klog.go
@@ -11,6 +11,8 @@
 	"strings"
 	"time"
 
+	"k8s.io/klog/v2"
+
 	"source.monogon.dev/go/logging"
 	"source.monogon.dev/osbase/logbuffer"
 )
@@ -200,3 +202,45 @@
 	// what we want, but we should formalize this.
 	return time.Parse(layout, fmt.Sprintf("%d %s %s", year, d, t))
 }
+
+// klogSink implements klog.LogSink on a logging.Leveld logger.
+type klogSink struct {
+	logging.Leveled
+}
+
+func (k *klogSink) Enabled(level int) bool {
+	return k.V(logging.VerbosityLevel(level)).Enabled()
+}
+
+func (k *klogSink) Error(err error, msg string, keysAndValues ...any) {
+	if err != nil {
+		k.Errorf("%s: %w - %v", msg, err, keysAndValues)
+	} else {
+		k.Errorf("%s: %v", msg, keysAndValues)
+	}
+}
+
+func (k *klogSink) Info(level int, msg string, keysAndValues ...any) {
+	k.Infof("%s: %v", msg, keysAndValues)
+}
+
+func (k *klogSink) Init(info klog.RuntimeInfo) {
+}
+
+// WithName is only need if we would want to wrap the logger with a new
+// name, but we don't need that.
+func (k *klogSink) WithName(name string) klog.LogSink {
+	k.Warning("logtree.klogSink: WithName() called but not implemented. This is a bug!")
+	return k
+}
+
+// WithValues is only need if we would want to wrap the logger with a list
+// of static keys/values, but we don't need that.
+func (k *klogSink) WithValues(keysAndValues ...any) klog.LogSink {
+	k.Warning("logtree.klogSink: WithValues() called but not implemented. This is a bug!")
+	return k
+}
+
+func NewKlogLogger(logger logging.Leveled) klog.Logger {
+	return klog.New(&klogSink{logger})
+}