-
Notifications
You must be signed in to change notification settings - Fork 2
/
cri.go
134 lines (111 loc) · 3.83 KB
/
cri.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package services
import (
"context"
"fmt"
"os"
"github.com/containerd/containerd"
"github.com/containerd/containerd/defaults"
"google.golang.org/grpc/health/grpc_health_v1"
"github.com/aenix-io/talm/internal/app/machined/pkg/runtime"
"github.com/aenix-io/talm/internal/app/machined/pkg/system"
"github.com/aenix-io/talm/internal/app/machined/pkg/system/events"
"github.com/aenix-io/talm/internal/app/machined/pkg/system/health"
"github.com/aenix-io/talm/internal/app/machined/pkg/system/runner"
"github.com/aenix-io/talm/internal/app/machined/pkg/system/runner/process"
"github.com/aenix-io/talm/internal/app/machined/pkg/system/runner/restart"
"github.com/aenix-io/talm/internal/pkg/environment"
"github.com/siderolabs/talos/pkg/conditions"
"github.com/siderolabs/talos/pkg/machinery/constants"
"github.com/siderolabs/talos/pkg/machinery/resources/network"
)
var _ system.HealthcheckedService = (*CRI)(nil)
// CRI implements the Service interface. It serves as the concrete type with
// the required methods.
type CRI struct {
// client is a lazy-initialized containerd client. It should be accessed using the Client() method.
client *containerd.Client
}
// Client lazy-initializes the containerd client if needed and returns it.
func (c *CRI) Client() (*containerd.Client, error) {
if c.client != nil {
return c.client, nil
}
client, err := containerd.New(constants.CRIContainerdAddress)
if err != nil {
return nil, err
}
c.client = client
return c.client, err
}
// ID implements the Service interface.
func (c *CRI) ID(r runtime.Runtime) string {
return "cri"
}
// PreFunc implements the Service interface.
func (c *CRI) PreFunc(ctx context.Context, r runtime.Runtime) error {
return os.MkdirAll(defaults.DefaultRootDir, os.ModeDir)
}
// PostFunc implements the Service interface.
func (c *CRI) PostFunc(r runtime.Runtime, state events.ServiceState) (err error) {
if c.client != nil {
return c.client.Close()
}
return nil
}
// Condition implements the Service interface.
func (c *CRI) Condition(r runtime.Runtime) conditions.Condition {
return network.NewReadyCondition(r.State().V1Alpha2().Resources(), network.AddressReady, network.HostnameReady, network.EtcFilesReady)
}
// DependsOn implements the Service interface.
func (c *CRI) DependsOn(r runtime.Runtime) []string {
return nil
}
// Runner implements the Service interface.
func (c *CRI) Runner(r runtime.Runtime) (runner.Runner, error) {
// Set the process arguments.
args := &runner.Args{
ID: c.ID(r),
ProcessArgs: []string{
"/bin/containerd",
"--address",
constants.CRIContainerdAddress,
"--config",
constants.CRIContainerdConfig,
},
}
return restart.New(process.NewRunner(
r.Config().Debug(),
args,
runner.WithLoggingManager(r.Logging()),
runner.WithEnv(environment.Get(r.Config())),
runner.WithOOMScoreAdj(-500),
runner.WithCgroupPath(constants.CgroupPodRuntime),
runner.WithDroppedCapabilities(constants.DefaultDroppedCapabilities),
),
restart.WithType(restart.Forever),
), nil
}
// HealthFunc implements the HealthcheckedService interface.
func (c *CRI) HealthFunc(runtime.Runtime) health.Check {
return func(ctx context.Context) error {
client, err := c.Client()
if err != nil {
return err
}
resp, err := client.HealthService().Check(ctx, &grpc_health_v1.HealthCheckRequest{})
if err != nil {
return err
}
if resp.Status != grpc_health_v1.HealthCheckResponse_SERVING {
return fmt.Errorf("unexpected serving status: %d", resp.Status)
}
return nil
}
}
// HealthSettings implements the HealthcheckedService interface.
func (c *CRI) HealthSettings(runtime.Runtime) *health.Settings {
return &health.DefaultSettings
}