...
1
16
17 package exec
18
19 import (
20 "bytes"
21
22 utilfeature "k8s.io/apiserver/pkg/util/feature"
23 "k8s.io/kubernetes/pkg/features"
24 "k8s.io/kubernetes/pkg/kubelet/util/ioutils"
25 "k8s.io/kubernetes/pkg/probe"
26
27 "k8s.io/klog/v2"
28 "k8s.io/utils/exec"
29 )
30
31 const (
32 maxReadLength = 10 * 1 << 10
33 )
34
35
36 func New() Prober {
37 return execProber{}
38 }
39
40
41 type Prober interface {
42 Probe(e exec.Cmd) (probe.Result, string, error)
43 }
44
45 type execProber struct{}
46
47
48
49
50 func (pr execProber) Probe(e exec.Cmd) (probe.Result, string, error) {
51 var dataBuffer bytes.Buffer
52 writer := ioutils.LimitWriter(&dataBuffer, maxReadLength)
53
54 e.SetStderr(writer)
55 e.SetStdout(writer)
56 err := e.Start()
57 if err == nil {
58 err = e.Wait()
59 }
60 data := dataBuffer.Bytes()
61
62 klog.V(4).Infof("Exec probe response: %q", string(data))
63 if err != nil {
64 exit, ok := err.(exec.ExitError)
65 if ok {
66 if exit.ExitStatus() == 0 {
67 return probe.Success, string(data), nil
68 }
69 return probe.Failure, string(data), nil
70 }
71
72 timeoutErr, ok := err.(*TimeoutError)
73 if ok {
74 if utilfeature.DefaultFeatureGate.Enabled(features.ExecProbeTimeout) {
75
76 return probe.Failure, timeoutErr.Error(), nil
77 }
78
79 klog.Warningf("Exec probe timed out after %s but ExecProbeTimeout feature gate was disabled", timeoutErr.Timeout())
80 }
81
82 return probe.Unknown, "", err
83 }
84 return probe.Success, string(data), nil
85 }
86
View as plain text