1
16
17 package kubelet
18
19 import (
20 "context"
21 "fmt"
22 "net"
23 "os"
24 "path/filepath"
25
26 cadvisorapiv1 "github.com/google/cadvisor/info/v1"
27 cadvisorv2 "github.com/google/cadvisor/info/v2"
28 "k8s.io/klog/v2"
29 "k8s.io/mount-utils"
30 utilpath "k8s.io/utils/path"
31 utilstrings "k8s.io/utils/strings"
32
33 v1 "k8s.io/api/core/v1"
34 "k8s.io/apimachinery/pkg/types"
35 "k8s.io/kubernetes/pkg/kubelet/cm"
36 "k8s.io/kubernetes/pkg/kubelet/config"
37 kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
38 kubelettypes "k8s.io/kubernetes/pkg/kubelet/types"
39 utilnode "k8s.io/kubernetes/pkg/util/node"
40 "k8s.io/kubernetes/pkg/volume/csi"
41 )
42
43
44
45
46
47 func (kl *Kubelet) getRootDir() string {
48 return kl.rootDirectory
49 }
50
51
52
53
54 func (kl *Kubelet) getPodLogsDir() string {
55 return kl.podLogsDirectory
56 }
57
58
59
60 func (kl *Kubelet) getPodsDir() string {
61 return filepath.Join(kl.getRootDir(), config.DefaultKubeletPodsDirName)
62 }
63
64
65
66
67
68 func (kl *Kubelet) getPluginsDir() string {
69 return filepath.Join(kl.getRootDir(), config.DefaultKubeletPluginsDirName)
70 }
71
72
73
74
75
76 func (kl *Kubelet) getPluginsRegistrationDir() string {
77 return filepath.Join(kl.getRootDir(), config.DefaultKubeletPluginsRegistrationDirName)
78 }
79
80
81
82
83 func (kl *Kubelet) getPluginDir(pluginName string) string {
84 return filepath.Join(kl.getPluginsDir(), pluginName)
85 }
86
87
88
89 func (kl *Kubelet) getCheckpointsDir() string {
90 return filepath.Join(kl.getRootDir(), config.DefaultKubeletCheckpointsDirName)
91 }
92
93
94
95
96
97 func (kl *Kubelet) getVolumeDevicePluginsDir() string {
98 return filepath.Join(kl.getRootDir(), config.DefaultKubeletPluginsDirName)
99 }
100
101
102
103
104 func (kl *Kubelet) getVolumeDevicePluginDir(pluginName string) string {
105 return filepath.Join(kl.getVolumeDevicePluginsDir(), pluginName, config.DefaultKubeletVolumeDevicesDirName)
106 }
107
108
109
110 func (kl *Kubelet) GetPodDir(podUID types.UID) string {
111 return kl.getPodDir(podUID)
112 }
113
114
115 func (kl *Kubelet) ListPodsFromDisk() ([]types.UID, error) {
116 return kl.listPodsFromDisk()
117 }
118
119
120
121 func (kl *Kubelet) HandlerSupportsUserNamespaces(rtHandler string) (bool, error) {
122 rtHandlers := kl.runtimeState.runtimeHandlers()
123 if rtHandlers == nil {
124 return false, fmt.Errorf("runtime handlers are not set")
125 }
126 for _, h := range rtHandlers {
127 if h.Name == rtHandler {
128 return h.SupportsUserNamespaces, nil
129 }
130 }
131 return false, fmt.Errorf("the handler %q is not known", rtHandler)
132 }
133
134
135 func (kl *Kubelet) GetKubeletMappings() (uint32, uint32, error) {
136 return kl.getKubeletMappings()
137 }
138
139 func (kl *Kubelet) GetMaxPods() int {
140 return kl.maxPods
141 }
142
143
144
145 func (kl *Kubelet) getPodDir(podUID types.UID) string {
146 return filepath.Join(kl.getPodsDir(), string(podUID))
147 }
148
149
150
151
152 func (kl *Kubelet) getPodVolumeSubpathsDir(podUID types.UID) string {
153 return filepath.Join(kl.getPodDir(podUID), config.DefaultKubeletVolumeSubpathsDirName)
154 }
155
156
157
158
159 func (kl *Kubelet) getPodVolumesDir(podUID types.UID) string {
160 return filepath.Join(kl.getPodDir(podUID), config.DefaultKubeletVolumesDirName)
161 }
162
163
164
165
166 func (kl *Kubelet) getPodVolumeDir(podUID types.UID, pluginName string, volumeName string) string {
167 return filepath.Join(kl.getPodVolumesDir(podUID), pluginName, volumeName)
168 }
169
170
171
172
173 func (kl *Kubelet) getPodVolumeDevicesDir(podUID types.UID) string {
174 return filepath.Join(kl.getPodDir(podUID), config.DefaultKubeletVolumeDevicesDirName)
175 }
176
177
178
179 func (kl *Kubelet) getPodVolumeDeviceDir(podUID types.UID, pluginName string) string {
180 return filepath.Join(kl.getPodVolumeDevicesDir(podUID), pluginName)
181 }
182
183
184
185
186 func (kl *Kubelet) getPodPluginsDir(podUID types.UID) string {
187 return filepath.Join(kl.getPodDir(podUID), config.DefaultKubeletPluginsDirName)
188 }
189
190
191
192
193 func (kl *Kubelet) getPodPluginDir(podUID types.UID, pluginName string) string {
194 return filepath.Join(kl.getPodPluginsDir(podUID), pluginName)
195 }
196
197
198
199
200 func (kl *Kubelet) getPodContainerDir(podUID types.UID, ctrName string) string {
201 return filepath.Join(kl.getPodDir(podUID), config.DefaultKubeletContainersDirName, ctrName)
202 }
203
204
205 func (kl *Kubelet) getPodResourcesDir() string {
206 return filepath.Join(kl.getRootDir(), config.DefaultKubeletPodResourcesDirName)
207 }
208
209
210
211 func (kl *Kubelet) GetPods() []*v1.Pod {
212 pods := kl.podManager.GetPods()
213
214
215 for i, p := range pods {
216 if kubelettypes.IsStaticPod(p) {
217 if status, ok := kl.statusManager.GetPodStatus(p.UID); ok {
218 klog.V(2).InfoS("Pod status updated", "pod", klog.KObj(p), "status", status.Phase)
219
220 p = p.DeepCopy()
221 p.Status = status
222 pods[i] = p
223 }
224 }
225 }
226 return pods
227 }
228
229
230
231
232
233 func (kl *Kubelet) GetRunningPods(ctx context.Context) ([]*v1.Pod, error) {
234 pods, err := kl.runtimeCache.GetPods(ctx)
235 if err != nil {
236 return nil, err
237 }
238
239 apiPods := make([]*v1.Pod, 0, len(pods))
240 for _, pod := range pods {
241 apiPods = append(apiPods, pod.ToAPIPod())
242 }
243 return apiPods, nil
244 }
245
246
247
248 func (kl *Kubelet) GetPodByFullName(podFullName string) (*v1.Pod, bool) {
249 return kl.podManager.GetPodByFullName(podFullName)
250 }
251
252
253
254 func (kl *Kubelet) GetPodByName(namespace, name string) (*v1.Pod, bool) {
255 return kl.podManager.GetPodByName(namespace, name)
256 }
257
258
259
260 func (kl *Kubelet) GetPodByCgroupfs(cgroupfs string) (*v1.Pod, bool) {
261 pcm := kl.containerManager.NewPodContainerManager()
262 if result, podUID := pcm.IsPodCgroup(cgroupfs); result {
263 return kl.podManager.GetPodByUID(podUID)
264 }
265 return nil, false
266 }
267
268
269 func (kl *Kubelet) GetHostname() string {
270 return kl.hostname
271 }
272
273
274 func (kl *Kubelet) getRuntime() kubecontainer.Runtime {
275 return kl.containerRuntime
276 }
277
278
279 func (kl *Kubelet) GetNode() (*v1.Node, error) {
280 if kl.kubeClient == nil {
281 return kl.initialNode(context.TODO())
282 }
283 return kl.nodeLister.Get(string(kl.nodeName))
284 }
285
286
287
288
289
290
291 func (kl *Kubelet) getNodeAnyWay() (*v1.Node, error) {
292 if kl.kubeClient != nil {
293 if n, err := kl.nodeLister.Get(string(kl.nodeName)); err == nil {
294 return n, nil
295 }
296 }
297 return kl.initialNode(context.TODO())
298 }
299
300
301 func (kl *Kubelet) GetNodeConfig() cm.NodeConfig {
302 return kl.containerManager.GetNodeConfig()
303 }
304
305
306 func (kl *Kubelet) GetPodCgroupRoot() string {
307 return kl.containerManager.GetPodCgroupRoot()
308 }
309
310
311 func (kl *Kubelet) GetHostIPs() ([]net.IP, error) {
312 node, err := kl.GetNode()
313 if err != nil {
314 return nil, fmt.Errorf("cannot get node: %v", err)
315 }
316 return utilnode.GetNodeHostIPs(node)
317 }
318
319
320
321 func (kl *Kubelet) getHostIPsAnyWay() ([]net.IP, error) {
322 node, err := kl.getNodeAnyWay()
323 if err != nil {
324 return nil, err
325 }
326 return utilnode.GetNodeHostIPs(node)
327 }
328
329
330
331
332 func (kl *Kubelet) GetExtraSupplementalGroupsForPod(pod *v1.Pod) []int64 {
333 return kl.volumeManager.GetExtraSupplementalGroupsForPod(pod)
334 }
335
336
337
338 func (kl *Kubelet) getPodVolumePathListFromDisk(podUID types.UID) ([]string, error) {
339 volumes := []string{}
340 podVolDir := kl.getPodVolumesDir(podUID)
341
342 if pathExists, pathErr := mount.PathExists(podVolDir); pathErr != nil {
343 return volumes, fmt.Errorf("error checking if path %q exists: %v", podVolDir, pathErr)
344 } else if !pathExists {
345 klog.V(6).InfoS("Path does not exist", "path", podVolDir)
346 return volumes, nil
347 }
348
349 volumePluginDirs, err := os.ReadDir(podVolDir)
350 if err != nil {
351 klog.ErrorS(err, "Could not read directory", "path", podVolDir)
352 return volumes, err
353 }
354 for _, volumePluginDir := range volumePluginDirs {
355 volumePluginName := volumePluginDir.Name()
356 volumePluginPath := filepath.Join(podVolDir, volumePluginName)
357 volumeDirs, err := utilpath.ReadDirNoStat(volumePluginPath)
358 if err != nil {
359 return volumes, fmt.Errorf("could not read directory %s: %v", volumePluginPath, err)
360 }
361 unescapePluginName := utilstrings.UnescapeQualifiedName(volumePluginName)
362
363 if unescapePluginName != csi.CSIPluginName {
364 for _, volumeDir := range volumeDirs {
365 volumes = append(volumes, filepath.Join(volumePluginPath, volumeDir))
366 }
367 } else {
368
369
370 for _, volumeDir := range volumeDirs {
371 path := filepath.Join(volumePluginPath, volumeDir)
372 csimountpath := csi.GetCSIMounterPath(path)
373 if pathExists, _ := mount.PathExists(csimountpath); pathExists {
374 volumes = append(volumes, csimountpath)
375 }
376 }
377 }
378 }
379 return volumes, nil
380 }
381
382 func (kl *Kubelet) getMountedVolumePathListFromDisk(podUID types.UID) ([]string, error) {
383 mountedVolumes := []string{}
384 volumePaths, err := kl.getPodVolumePathListFromDisk(podUID)
385 if err != nil {
386 return mountedVolumes, err
387 }
388
389
390
391
392
393 for _, volumePath := range volumePaths {
394 isNotMount, err := kl.mounter.IsLikelyNotMountPoint(volumePath)
395 if err != nil {
396 return mountedVolumes, fmt.Errorf("fail to check mount point %q: %v", volumePath, err)
397 }
398 if !isNotMount {
399 mountedVolumes = append(mountedVolumes, volumePath)
400 }
401 }
402 return mountedVolumes, nil
403 }
404
405
406
407 func (kl *Kubelet) getPodVolumeSubpathListFromDisk(podUID types.UID) ([]string, error) {
408 volumes := []string{}
409 podSubpathsDir := kl.getPodVolumeSubpathsDir(podUID)
410
411 if pathExists, pathErr := mount.PathExists(podSubpathsDir); pathErr != nil {
412 return nil, fmt.Errorf("error checking if path %q exists: %v", podSubpathsDir, pathErr)
413 } else if !pathExists {
414 return volumes, nil
415 }
416
417
418 volumePluginDirs, err := os.ReadDir(podSubpathsDir)
419 if err != nil {
420 klog.ErrorS(err, "Could not read directory", "path", podSubpathsDir)
421 return volumes, err
422 }
423 for _, volumePluginDir := range volumePluginDirs {
424 volumePluginName := volumePluginDir.Name()
425 volumePluginPath := filepath.Join(podSubpathsDir, volumePluginName)
426 containerDirs, err := os.ReadDir(volumePluginPath)
427 if err != nil {
428 return volumes, fmt.Errorf("could not read directory %s: %v", volumePluginPath, err)
429 }
430 for _, containerDir := range containerDirs {
431 containerName := containerDir.Name()
432 containerPath := filepath.Join(volumePluginPath, containerName)
433
434
435 subPaths, err := utilpath.ReadDirNoStat(containerPath)
436 if err != nil {
437 return volumes, fmt.Errorf("could not read directory %s: %v", containerPath, err)
438 }
439 for _, subPathDir := range subPaths {
440 volumes = append(volumes, filepath.Join(containerPath, subPathDir))
441 }
442 }
443 }
444 return volumes, nil
445 }
446
447
448 func (kl *Kubelet) GetRequestedContainersInfo(containerName string, options cadvisorv2.RequestOptions) (map[string]*cadvisorapiv1.ContainerInfo, error) {
449 return kl.cadvisor.GetRequestedContainersInfo(containerName, options)
450 }
451
452
453 func (kl *Kubelet) GetVersionInfo() (*cadvisorapiv1.VersionInfo, error) {
454 return kl.cadvisor.VersionInfo()
455 }
456
457
458 func (kl *Kubelet) GetCachedMachineInfo() (*cadvisorapiv1.MachineInfo, error) {
459 kl.machineInfoLock.RLock()
460 defer kl.machineInfoLock.RUnlock()
461 return kl.machineInfo, nil
462 }
463
464 func (kl *Kubelet) setCachedMachineInfo(info *cadvisorapiv1.MachineInfo) {
465 kl.machineInfoLock.Lock()
466 defer kl.machineInfoLock.Unlock()
467 kl.machineInfo = info
468 }
469
View as plain text