...
1
16
17 package componentstatus
18
19 import (
20 "context"
21 "crypto/tls"
22 "fmt"
23 "sync"
24 "time"
25
26 utilnet "k8s.io/apimachinery/pkg/util/net"
27 "k8s.io/apiserver/pkg/storage/storagebackend"
28 "k8s.io/apiserver/pkg/storage/storagebackend/factory"
29 "k8s.io/kubernetes/pkg/probe"
30 httpprober "k8s.io/kubernetes/pkg/probe/http"
31 )
32
33 const (
34 probeTimeOut = 20 * time.Second
35 )
36
37 type ValidatorFn func([]byte) error
38
39 type Server interface {
40 DoServerCheck() (probe.Result, string, error)
41 }
42
43 type HttpServer struct {
44 Addr string
45 Port int
46 Path string
47 EnableHTTPS bool
48 TLSConfig *tls.Config
49 Validate ValidatorFn
50 Prober httpprober.Prober
51 Once sync.Once
52 }
53
54 type ServerStatus struct {
55
56 Component string `json:"component,omitempty"`
57
58 Health string `json:"health,omitempty"`
59
60 HealthCode probe.Result `json:"healthCode,omitempty"`
61
62 Msg string `json:"msg,omitempty"`
63
64 Err string `json:"err,omitempty"`
65 }
66
67 func (server *HttpServer) DoServerCheck() (probe.Result, string, error) {
68
69 server.Once.Do(func() {
70 if server.Prober != nil {
71 return
72 }
73 const followNonLocalRedirects = true
74 server.Prober = httpprober.NewWithTLSConfig(server.TLSConfig, followNonLocalRedirects)
75 })
76
77 scheme := "http"
78 if server.EnableHTTPS {
79 scheme = "https"
80 }
81 url := utilnet.FormatURL(scheme, server.Addr, server.Port, server.Path)
82
83 req, err := httpprober.NewProbeRequest(url, nil)
84 if err != nil {
85 return probe.Unknown, "", fmt.Errorf("failed to construct probe request: %w", err)
86 }
87 result, data, err := server.Prober.Probe(req, probeTimeOut)
88
89 if err != nil {
90 return probe.Unknown, "", err
91 }
92 if result == probe.Failure {
93 return probe.Failure, data, err
94 }
95 if server.Validate != nil {
96 if err := server.Validate([]byte(data)); err != nil {
97 return probe.Failure, data, err
98 }
99 }
100 return result, data, nil
101 }
102
103 type EtcdServer struct {
104 storagebackend.Config
105 }
106
107 func (server *EtcdServer) DoServerCheck() (probe.Result, string, error) {
108 prober, err := factory.CreateProber(server.Config)
109 if err != nil {
110 return probe.Failure, "", err
111 }
112 defer prober.Close()
113
114 ctx, cancel := context.WithTimeout(context.Background(), probeTimeOut)
115 defer cancel()
116 err = prober.Probe(ctx)
117 if err != nil {
118 return probe.Failure, "", err
119 }
120 return probe.Success, "ok", err
121 }
122
View as plain text