blob: e9d0332a9c14bd5e8a7cc6285185f0b33f24a397 [file] [log] [blame]
Lorenz Brun878f5f92020-05-12 16:15:39 +02001// Copyright 2020 The Monogon Project Authors.
2//
3// SPDX-License-Identifier: Apache-2.0
4//
5// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
16
17package kubernetes
18
19import (
20 "context"
Lorenz Brun878f5f92020-05-12 16:15:39 +020021 "encoding/json"
Lorenz Brun878f5f92020-05-12 16:15:39 +020022 "fmt"
Lorenz Brun8e3b8fc2020-05-19 14:29:40 +020023 "io"
Lorenz Brun8e3b8fc2020-05-19 14:29:40 +020024 "net"
Lorenz Brun878f5f92020-05-12 16:15:39 +020025 "os/exec"
26
Serge Bazanskie6030f62020-06-03 17:52:59 +020027 "git.monogon.dev/source/nexantic.git/core/internal/common/supervisor"
28 "git.monogon.dev/source/nexantic.git/core/internal/kubernetes/reconciler"
29 "git.monogon.dev/source/nexantic.git/core/pkg/fileargs"
30
Lorenz Brun878f5f92020-05-12 16:15:39 +020031 v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Lorenz Brun8e3b8fc2020-05-19 14:29:40 +020032 kubeletconfig "k8s.io/kubelet/config/v1beta1"
Lorenz Brun878f5f92020-05-12 16:15:39 +020033)
34
35type KubeletSpec struct {
36 clusterDNS []net.IP
37}
38
Lorenz Brun8e3b8fc2020-05-19 14:29:40 +020039func runKubelet(spec *KubeletSpec, output io.Writer) supervisor.Runnable {
40 return func(ctx context.Context) error {
41 fargs, err := fileargs.New()
42 if err != nil {
43 return err
44 }
45 var clusterDNS []string
46 for _, dnsIP := range spec.clusterDNS {
47 clusterDNS = append(clusterDNS, dnsIP.String())
48 }
Lorenz Brun878f5f92020-05-12 16:15:39 +020049
Lorenz Brun8e3b8fc2020-05-19 14:29:40 +020050 kubeletConf := &kubeletconfig.KubeletConfiguration{
51 TypeMeta: v1.TypeMeta{
52 Kind: "KubeletConfiguration",
53 APIVersion: kubeletconfig.GroupName + "/v1beta1",
Lorenz Brun878f5f92020-05-12 16:15:39 +020054 },
Lorenz Brun8e3b8fc2020-05-19 14:29:40 +020055 TLSCertFile: "/data/kubernetes/kubelet.crt",
56 TLSPrivateKeyFile: "/data/kubernetes/kubelet.key",
57 TLSMinVersion: "VersionTLS13",
58 ClusterDNS: clusterDNS,
59 Authentication: kubeletconfig.KubeletAuthentication{
60 X509: kubeletconfig.KubeletX509Authentication{
61 ClientCAFile: "/data/kubernetes/ca.crt",
62 },
63 },
Serge Bazanskie6030f62020-06-03 17:52:59 +020064 // TODO(q3k): move reconciler.False to a generic package, fix the following references.
Lorenz Brun8e3b8fc2020-05-19 14:29:40 +020065 ClusterDomain: "cluster.local", // cluster.local is hardcoded in the certificate too currently
Serge Bazanskie6030f62020-06-03 17:52:59 +020066 EnableControllerAttachDetach: reconciler.False(),
Lorenz Brun8e3b8fc2020-05-19 14:29:40 +020067 HairpinMode: "none",
Serge Bazanskie6030f62020-06-03 17:52:59 +020068 MakeIPTablesUtilChains: reconciler.False(), // We don't have iptables
69 FailSwapOn: reconciler.False(), // Our kernel doesn't have swap enabled which breaks Kubelet's detection
Lorenz Brun8e3b8fc2020-05-19 14:29:40 +020070 KubeReserved: map[string]string{
71 "cpu": "200m",
72 "memory": "300Mi",
73 },
Lorenz Brun0db90ba2020-04-06 14:04:52 +020074
Lorenz Brun8e3b8fc2020-05-19 14:29:40 +020075 // We're not going to use this, but let's make it point to a known-empty directory in case anybody manages to
76 // trigger it.
77 VolumePluginDir: "/kubernetes/conf/flexvolume-plugins",
78 }
Lorenz Brun878f5f92020-05-12 16:15:39 +020079
Lorenz Brun8e3b8fc2020-05-19 14:29:40 +020080 configRaw, err := json.Marshal(kubeletConf)
81 if err != nil {
82 return err
83 }
84 cmd := exec.CommandContext(ctx, "/kubernetes/bin/kube", "kubelet",
85 fargs.FileOpt("--config", "config.json", configRaw),
86 "--container-runtime=remote",
87 "--container-runtime-endpoint=unix:///containerd/run/containerd.sock",
88 "--kubeconfig=/data/kubernetes/kubelet.kubeconfig",
89 "--root-dir=/data/kubernetes/kubelet",
90 )
91 cmd.Env = []string{"PATH=/kubernetes/bin"}
92 cmd.Stdout = output
93 cmd.Stderr = output
94
95 supervisor.Signal(ctx, supervisor.SignalHealthy)
96 err = cmd.Run()
97 fmt.Fprintf(output, "kubelet stopped: %v\n", err)
Lorenz Brun878f5f92020-05-12 16:15:39 +020098 return err
99 }
Lorenz Brun878f5f92020-05-12 16:15:39 +0200100}