From febcae1b2f6ee0f9735faa5f109c2599b478814c Mon Sep 17 00:00:00 2001 From: Forest-L Date: Mon, 1 Mar 2021 16:45:19 +0800 Subject: [PATCH 1/3] add ntp check Signed-off-by: Forest-L --- cmd/nsenter.go | 12 ++++ cmd/nsenter_ntp.go | 26 ++++++++ examples/ntp.yaml | 16 +++++ pkg/validator/nsenter.go | 138 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 192 insertions(+) create mode 100644 cmd/nsenter.go create mode 100644 cmd/nsenter_ntp.go create mode 100644 examples/ntp.yaml create mode 100644 pkg/validator/nsenter.go diff --git a/cmd/nsenter.go b/cmd/nsenter.go new file mode 100644 index 0000000..8799295 --- /dev/null +++ b/cmd/nsenter.go @@ -0,0 +1,12 @@ +package cmd + +import "github.com/spf13/cobra" + +var nsenterCmd = &cobra.Command{ + Use: "nsenter", + Short: "Debug host in the container", +} + +func init() { + rootCmd.AddCommand(nsenterCmd) +} diff --git a/cmd/nsenter_ntp.go b/cmd/nsenter_ntp.go new file mode 100644 index 0000000..1033cf4 --- /dev/null +++ b/cmd/nsenter_ntp.go @@ -0,0 +1,26 @@ +package cmd + +import ( + "fmt" + "github.com/spf13/cobra" + "kubeeye/pkg/validator" +) + +var ntpImage string + +var nsenterNtpCmd = &cobra.Command{ + Use: "ntp", + Short: "Check that the cluster NTP service is working", + Run: func(cmd *cobra.Command, args []string) { + err := validator.CheckNtp(cmd.Context(), ntpImage) + if err != nil { + fmt.Println(err) + } + }, +} + +func init() { + nsenterCmd.AddCommand(nsenterNtpCmd) + nsenterNtpCmd.Flags().StringVarP(&ntpImage, "image", "i", "kubespheredev/alpine:3.12", "Customize ntp image") + +} diff --git a/examples/ntp.yaml b/examples/ntp.yaml new file mode 100644 index 0000000..4848e98 --- /dev/null +++ b/examples/ntp.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Pod +metadata: + name: ntp + namespace: default +spec: + containers: + - command: ["sh"] + args: ["-c", "echo 'kubectl cp default/ntp:/root/check_ntp.sh /tmp/check_ntp.sh && chmod +x /tmp/check_ntp.sh && sh /tmp/check_ntp.sh' | nsenter -t 1 -m -u -i -n;sleep 600"] + image: {{.NtpImage}} + name: ntp + securityContext: + privileged: true + hostIPC: true + hostNetwork: true + hostPID: true diff --git a/pkg/validator/nsenter.go b/pkg/validator/nsenter.go new file mode 100644 index 0000000..c0211b5 --- /dev/null +++ b/pkg/validator/nsenter.go @@ -0,0 +1,138 @@ +package validator + +import ( + "bytes" + "context" + "fmt" + "github.com/gobuffalo/packr/v2" + "github.com/pkg/errors" + "github.com/sirupsen/logrus" + "io" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/yaml" + "k8s.io/client-go/kubernetes" + "os/exec" + "sigs.k8s.io/controller-runtime/pkg/client/config" + "text/template" + "time" +) + +var ntpBox = (*packr.Box)(nil) + +type NtpImageName struct { + NtpImage string +} + +func CheckNtp(ctx context.Context, ntpImage string) error { + var tplWriter bytes.Buffer + imageName := NtpImageName{NtpImage: ntpImage} + + dsTmplString, err := getNtpBox().FindString("ntp.yaml") + if err != nil { + return errors.Wrap(err, "Failed to get ntp.yaml") + } + + dsTemplate, err := template.New("ntp").Parse(dsTmplString) + if dsTemplate == nil || err != nil { + return errors.Wrap(err, "Failed to get ntp.yaml template") + } + err = dsTemplate.Execute(&tplWriter, imageName) + if err != nil { + return errors.Wrap(err, "Failed to render ntp.yaml template") + } + + tplWriter.Bytes() + + pod := podParse(tplWriter.Bytes()) + + //Create ntp + _, err5 := createNtpPodSet(ctx, pod) + if err5 != nil { + return errors.Wrap(err5, "Failed to create ntp") + } + + return nil +} +func getNtpBox() *packr.Box { + if ntpBox == (*packr.Box)(nil) { + ntpBox = packr.New("Ntp", "../../examples") + } + return ntpBox +} + +func createNtpPodSet(ctx context.Context, conf *v1.Pod) (*v1.Pod, error) { + kubeConf, configError := config.GetConfig() + + if configError != nil { + logrus.Errorf("Error fetching KubeConfig: %v", configError) + return nil, configError + } + + api, err1 := kubernetes.NewForConfig(kubeConf) + if err1 != nil { + logrus.Errorf("Error fetching api: %v", err1) + return nil, err1 + } + listOpts := metav1.CreateOptions{} + getOpts := metav1.GetOptions{} + deleteOpts := metav1.DeleteOptions{} + _, err2 := api.CoreV1().Pods(conf.ObjectMeta.Namespace).Get(ctx, conf.ObjectMeta.Name, getOpts) + if err2 != nil { + fmt.Println("Installing Ntp ...") + _, err3 := api.CoreV1().Pods(conf.ObjectMeta.Namespace).Create(ctx, conf, listOpts) + if err3 != nil { + return nil, err3 + } + fmt.Println("Ntp Installation is successful. ") + for i := 10; i > 0; i-- { + status, err4 := api.CoreV1().Pods(conf.ObjectMeta.Namespace).Get(ctx, conf.ObjectMeta.Name, getOpts) + if err4 != nil { + return nil, err4 + } + time.Sleep(time.Second * 5) + if status.Status.Phase == "Running" { + output, _ := exec.Command("/bin/sh", "-c", "/usr/local/bin/kubectl logs ntp").CombinedOutput() + fmt.Println(string(output)) + api.CoreV1().Pods(conf.ObjectMeta.Namespace).Delete(ctx, conf.ObjectMeta.Name, deleteOpts) + break + } + } + return nil, err3 + } + return nil, nil +} + +func deleteNtpPodSet(ctx context.Context, conf *v1.Pod) (*v1.Pod, error) { + kubeConf, configError := config.GetConfig() + + if configError != nil { + logrus.Errorf("Error fetching KubeConfig: %v", configError) + return nil, configError + } + + api, err1 := kubernetes.NewForConfig(kubeConf) + if err1 != nil { + logrus.Errorf("Error fetching api: %v", err1) + return nil, err1 + } + + deleteOpts := metav1.DeleteOptions{} + api.CoreV1().Pods(conf.ObjectMeta.Namespace).Delete(ctx, conf.ObjectMeta.Name, deleteOpts) + fmt.Println("Delete Ntp") + return nil, nil +} +func podParse(rawBytes []byte) *v1.Pod { + reader := bytes.NewReader(rawBytes) + var conf *v1.Pod + d := yaml.NewYAMLOrJSONDecoder(reader, 4096) + for { + if err := d.Decode(&conf); err != nil { + if err == io.EOF { + break + } + return conf + } + } + return conf +} From 7a65eccbd322bf6bd6ed9e145d627d8a949a4de4 Mon Sep 17 00:00:00 2001 From: Forest-L Date: Mon, 1 Mar 2021 16:48:49 +0800 Subject: [PATCH 2/3] add ntp check Signed-off-by: Forest-L --- pkg/validator/nsenter.go | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/pkg/validator/nsenter.go b/pkg/validator/nsenter.go index c0211b5..a62d224 100644 --- a/pkg/validator/nsenter.go +++ b/pkg/validator/nsenter.go @@ -103,25 +103,6 @@ func createNtpPodSet(ctx context.Context, conf *v1.Pod) (*v1.Pod, error) { return nil, nil } -func deleteNtpPodSet(ctx context.Context, conf *v1.Pod) (*v1.Pod, error) { - kubeConf, configError := config.GetConfig() - - if configError != nil { - logrus.Errorf("Error fetching KubeConfig: %v", configError) - return nil, configError - } - - api, err1 := kubernetes.NewForConfig(kubeConf) - if err1 != nil { - logrus.Errorf("Error fetching api: %v", err1) - return nil, err1 - } - - deleteOpts := metav1.DeleteOptions{} - api.CoreV1().Pods(conf.ObjectMeta.Namespace).Delete(ctx, conf.ObjectMeta.Name, deleteOpts) - fmt.Println("Delete Ntp") - return nil, nil -} func podParse(rawBytes []byte) *v1.Pod { reader := bytes.NewReader(rawBytes) var conf *v1.Pod From f8a31285a072522ad6da8f87297b24da0a489249 Mon Sep 17 00:00:00 2001 From: Forest-L Date: Mon, 8 Mar 2021 16:10:58 +0800 Subject: [PATCH 3/3] add ntp check Signed-off-by: Forest-L --- examples/ntp.yaml | 39 +++++++++++++++++++++++++++------------ go.mod | 16 +++++++++------- go.sum | 27 +++++++++++++++++++++++++++ pkg/validator/nsenter.go | 40 ++++++++++++++++++++++++++++------------ 4 files changed, 91 insertions(+), 31 deletions(-) diff --git a/examples/ntp.yaml b/examples/ntp.yaml index 4848e98..8064a54 100644 --- a/examples/ntp.yaml +++ b/examples/ntp.yaml @@ -1,16 +1,31 @@ -apiVersion: v1 -kind: Pod +apiVersion: apps/v1 +kind: DaemonSet metadata: name: ntp namespace: default spec: - containers: - - command: ["sh"] - args: ["-c", "echo 'kubectl cp default/ntp:/root/check_ntp.sh /tmp/check_ntp.sh && chmod +x /tmp/check_ntp.sh && sh /tmp/check_ntp.sh' | nsenter -t 1 -m -u -i -n;sleep 600"] - image: {{.NtpImage}} - name: ntp - securityContext: - privileged: true - hostIPC: true - hostNetwork: true - hostPID: true + selector: + matchLabels: + name: ntp-check + template: + metadata: + labels: + name: ntp-check + spec: + containers: + - command: ["sh"] + args: ["-c", "cp /tmp/check_ntp.sh /tmp/ntp; echo 'chmod +x /tmp/ntp/check_ntp.sh && sh /tmp/ntp/check_ntp.sh' | nsenter -t 1 -m -u -i -n;sleep 600"] + image: {{.NtpImage}} + name: ntp + securityContext: + privileged: true + volumeMounts: + - name: ntpdir + mountPath: /tmp/ntp + hostIPC: true + hostNetwork: true + hostPID: true + volumes: + - name: ntpdir + hostPath: + path: /tmp/ntp diff --git a/go.mod b/go.mod index a75bac5..69c53fb 100644 --- a/go.mod +++ b/go.mod @@ -5,18 +5,20 @@ go 1.15 require ( github.com/gobuffalo/packr/v2 v2.8.1 github.com/karrick/godirwalk v1.16.1 // indirect + github.com/magefile/mage v1.11.0 // indirect github.com/pkg/errors v0.8.1 github.com/qri-io/jsonschema v0.1.1 - github.com/rogpeppe/go-internal v1.6.2 // indirect - github.com/sirupsen/logrus v1.7.0 - github.com/spf13/cobra v1.1.1 + github.com/rogpeppe/go-internal v1.7.0 // indirect + github.com/sirupsen/logrus v1.8.0 + github.com/spf13/cobra v1.1.3 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.5.1 - golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect + golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 // indirect golang.org/x/net v0.0.0-20201021035429-f5854403a974 // indirect - golang.org/x/sync v0.0.0-20201207232520-09787c993a3a // indirect - golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78 // indirect - golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect + golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b // indirect + golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect + golang.org/x/tools v0.1.0 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect k8s.io/api v0.18.8 k8s.io/apimachinery v0.18.8 diff --git a/go.sum b/go.sum index b711a05..5eab779 100644 --- a/go.sum +++ b/go.sum @@ -148,6 +148,7 @@ github.com/gobuffalo/logger v1.0.3 h1:YaXOTHNPCvkqqA7w05A4v0k2tCdpr+sgFlgINbQ6gq github.com/gobuffalo/logger v1.0.3/go.mod h1:SoeejUwldiS7ZsyCBphOGURmWdwUFXs0J7TCjEhjKxM= github.com/gobuffalo/packd v1.0.0 h1:6ERZvJHfe24rfFmA9OaoKBdC7+c9sydrytMg8SdFGBM= github.com/gobuffalo/packd v1.0.0/go.mod h1:6VTc4htmJRFB7u1m/4LeMTWjFoYrUiBkU9Fdec9hrhI= +github.com/gobuffalo/packr v1.30.1 h1:hu1fuVR3fXEZR7rXNW3h8rqSML8EVAf6KNm0NKO/wKg= github.com/gobuffalo/packr/v2 v2.8.1 h1:tkQpju6i3EtMXJ9uoF5GT6kB+LMTimDWD8Xvbz6zDVA= github.com/gobuffalo/packr/v2 v2.8.1/go.mod h1:c/PLlOuTU+p3SybaJATW3H6lX/iK7xEz5OeMf+NnJpg= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -260,6 +261,10 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/magefile/mage v1.10.0 h1:3HiXzCUY12kh9bIuyXShaVe529fJfyqoVM42o/uom2g= +github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/magefile/mage v1.11.0 h1:C/55Ywp9BpgVVclD3lRnSYCwXTYxmSppIgLeDYlNuls= +github.com/magefile/mage v1.11.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -348,6 +353,8 @@ github.com/rogpeppe/go-internal v1.5.2 h1:qLvObTrvO/XRCqmkKxUlOBc48bI3efyDuAZe25 github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.6.2 h1:aIihoIOHCiLZHxyoNQ+ABL4NKhFTgKLBdMLyEAh98m0= github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.7.0 h1:3qqXGV8nn7GJT65debw77Dzrx9sfWYgP0DDo7xcMFRk= +github.com/rogpeppe/go-internal v1.7.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -360,6 +367,8 @@ github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.0 h1:nfhvjKcUMhBMVqbKHJlk5RPrrfYr/NMo3692g0dwfWU= +github.com/sirupsen/logrus v1.8.0/go.mod h1:4GuYW9TZmE769R5STWrRakJc4UqQ3+QQ95fyz7ENv1A= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -372,6 +381,8 @@ github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tL github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -400,6 +411,7 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= @@ -432,6 +444,8 @@ golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -451,6 +465,7 @@ golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCc golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -490,8 +505,11 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -525,10 +543,15 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78 h1:nVuTkr9L6Bq62qpUqKo/RnZCFfzDBL0bYo6w9OJUqZY= golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b h1:ggRgirZABFolTmi3sn6Ivd9SipZwLedQ5wR0aAKnFxU= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221 h1:/ZHdbVpdR/jk3g30/d4yUL0JU9kksj8+F/bnQUVLGDM= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -567,6 +590,8 @@ golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200308013534-11ec41452d41 h1:9Di9iYgOt9ThCipBxChBVhgNipDoE5mxO84rQV7D0FE= golang.org/x/tools v0.0.0-20200308013534-11ec41452d41/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= @@ -631,6 +656,8 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/pkg/validator/nsenter.go b/pkg/validator/nsenter.go index a62d224..465b025 100644 --- a/pkg/validator/nsenter.go +++ b/pkg/validator/nsenter.go @@ -8,12 +8,13 @@ import ( "github.com/pkg/errors" "github.com/sirupsen/logrus" "io" - v1 "k8s.io/api/core/v1" + ds "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/yaml" "k8s.io/client-go/kubernetes" "os/exec" "sigs.k8s.io/controller-runtime/pkg/client/config" + "strings" "text/template" "time" ) @@ -47,7 +48,7 @@ func CheckNtp(ctx context.Context, ntpImage string) error { pod := podParse(tplWriter.Bytes()) //Create ntp - _, err5 := createNtpPodSet(ctx, pod) + _, err5 := createNtpDsSet(ctx, pod) if err5 != nil { return errors.Wrap(err5, "Failed to create ntp") } @@ -61,7 +62,7 @@ func getNtpBox() *packr.Box { return ntpBox } -func createNtpPodSet(ctx context.Context, conf *v1.Pod) (*v1.Pod, error) { +func createNtpDsSet(ctx context.Context, conf *ds.DaemonSet) (*ds.DaemonSet, error) { kubeConf, configError := config.GetConfig() if configError != nil { @@ -77,35 +78,50 @@ func createNtpPodSet(ctx context.Context, conf *v1.Pod) (*v1.Pod, error) { listOpts := metav1.CreateOptions{} getOpts := metav1.GetOptions{} deleteOpts := metav1.DeleteOptions{} - _, err2 := api.CoreV1().Pods(conf.ObjectMeta.Namespace).Get(ctx, conf.ObjectMeta.Name, getOpts) + _, err2 := api.AppsV1().DaemonSets(conf.ObjectMeta.Namespace).Get(ctx, conf.ObjectMeta.Name, getOpts) if err2 != nil { fmt.Println("Installing Ntp ...") - _, err3 := api.CoreV1().Pods(conf.ObjectMeta.Namespace).Create(ctx, conf, listOpts) + _, err3 := api.AppsV1().DaemonSets(conf.ObjectMeta.Namespace).Create(ctx, conf, listOpts) if err3 != nil { return nil, err3 } fmt.Println("Ntp Installation is successful. ") for i := 10; i > 0; i-- { - status, err4 := api.CoreV1().Pods(conf.ObjectMeta.Namespace).Get(ctx, conf.ObjectMeta.Name, getOpts) + status, err4 := api.AppsV1().DaemonSets(conf.ObjectMeta.Namespace).Get(ctx, conf.ObjectMeta.Name, getOpts) if err4 != nil { return nil, err4 } time.Sleep(time.Second * 5) - if status.Status.Phase == "Running" { - output, _ := exec.Command("/bin/sh", "-c", "/usr/local/bin/kubectl logs ntp").CombinedOutput() - fmt.Println(string(output)) - api.CoreV1().Pods(conf.ObjectMeta.Namespace).Delete(ctx, conf.ObjectMeta.Name, deleteOpts) + + if status.Status.DesiredNumberScheduled == status.Status.NumberReady { + var podNames []string + var nodeNames []string + output, _ := exec.Command("/bin/sh", "-c", fmt.Sprintf("/usr/local/bin/kubectl --no-headers=true get pod -o wide | grep ntp | awk '{print $7}'")).CombinedOutput() + nodeNames = strings.Split(string(output), "\n") + //nodeNames = append(nodeNames,string(output)) + output1, _ := exec.Command("/bin/sh", "-c", fmt.Sprintf("/usr/local/bin/kubectl get pod | grep ntp | awk '{print $1}'")).CombinedOutput() + podNames = strings.Split(string(output1), "\n") + for i := 0; i < len(podNames)-1; i++ { + output2, _ := exec.Command("/bin/sh", "-c", fmt.Sprintf("/usr/local/bin/kubectl logs %s", podNames[i])).CombinedOutput() + fmt.Println(fmt.Sprintf("%s:", strings.TrimRight(string(nodeNames[i]), "\n"))) + fmt.Println(string(output2)) + time.Sleep(time.Millisecond * 500) + } + + api.AppsV1().DaemonSets(conf.ObjectMeta.Namespace).Delete(ctx, conf.ObjectMeta.Name, deleteOpts) break } } return nil, err3 + } else { + fmt.Println("Please delete NTP service and try again.") } return nil, nil } -func podParse(rawBytes []byte) *v1.Pod { +func podParse(rawBytes []byte) *ds.DaemonSet { reader := bytes.NewReader(rawBytes) - var conf *v1.Pod + var conf *ds.DaemonSet d := yaml.NewYAMLOrJSONDecoder(reader, 4096) for { if err := d.Decode(&conf); err != nil {