From 1752a92b154f94b47c753d28ae79342985384c16 Mon Sep 17 00:00:00 2001 From: Przemek Maciolek Date: Tue, 21 Apr 2020 19:28:43 +0200 Subject: [PATCH 1/9] K8S diagnostics image with debugging tools --- ci/build.sh | 19 ++++++ diagnostics/Dockerfile | 29 +++++++++ diagnostics/README.md | 30 ++++++++++ diagnostics/cmd/k8s-api-test/main.go | 40 +++++++++++++ diagnostics/go.mod | 5 ++ diagnostics/go.sum | 88 ++++++++++++++++++++++++++++ diagnostics/k8s-check.sh | 37 ++++++++++++ diagnostics/motd | 1 + diagnostics/profile | 1 + 9 files changed, 250 insertions(+) create mode 100644 diagnostics/Dockerfile create mode 100644 diagnostics/README.md create mode 100644 diagnostics/cmd/k8s-api-test/main.go create mode 100644 diagnostics/go.mod create mode 100644 diagnostics/go.sum create mode 100755 diagnostics/k8s-check.sh create mode 100644 diagnostics/motd create mode 100644 diagnostics/profile diff --git a/ci/build.sh b/ci/build.sh index 8f6e37e585..1766939351 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -3,6 +3,7 @@ VERSION="${TRAVIS_TAG:-0.0.0}" VERSION="${VERSION#v}" : "${DOCKER_TAG:=sumologic/kubernetes-fluentd}" +: "${DIAGNOSTICS_TAG:=sumologic/k8s-diagnostics}" : "${DOCKER_USERNAME:=sumodocker}" DOCKER_TAGS="https://registry.hub.docker.com/v1/repositories/sumologic/kubernetes-fluentd/tags" @@ -70,6 +71,9 @@ cd ../.. echo "Test docker image locally..." ruby deploy/test/test_docker.rb +echo "Building diagnostics image with $DIAGNOSTICS_TAG:local in $(pwd)..." +docker build -t $DIAGNOSTICS_TAG:local diagnostics --no-cache + # Check for changes that require re-generating overrides yaml files if [ -n "$GITHUB_TOKEN" ] && [ "$TRAVIS_EVENT_TYPE" == "pull_request" ]; then echo "Generating deployment yaml from helm chart..." @@ -178,15 +182,30 @@ function push_helm_chart() { set +x } + +function push_diagnostics_image() { + local version="$1" + + set -x + echo "Tagging diagnostics image with $DIAGNOSTICS_TAG:$version" + docker tag $DIAGNOSTICS_TAG:local "$DIAGNOSTICS_TAG:$version" + decho "Pushing docker image $DIAGNOSTICS_TAG:$version" + echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin + docker push $DIAGNOSTICS_TAG:$version + set +x +} + if [ -n "$DOCKER_PASSWORD" ] && [ -n "$TRAVIS_TAG" ]; then push_docker_image "$VERSION" push_helm_chart "$VERSION" + push_diagnostics_image "$VERSION" elif [ -n "$DOCKER_PASSWORD" ] && [[ "$TRAVIS_BRANCH" == "master" || "$TRAVIS_BRANCH" =~ ^release-v[0-9]+\.[0-9]+$ ]] && [ "$TRAVIS_EVENT_TYPE" == "push" ]; then dev_build_tag=$(git describe --tags --always) dev_build_tag=${dev_build_tag#v} push_docker_image "$dev_build_tag" push_helm_chart "$dev_build_tag" + push_diagnostics_image "$dev_build_tag" else echo "Skip Docker pushing" diff --git a/diagnostics/Dockerfile b/diagnostics/Dockerfile new file mode 100644 index 0000000000..9b4b2e8ee4 --- /dev/null +++ b/diagnostics/Dockerfile @@ -0,0 +1,29 @@ +FROM golang:1.14.1 as builder +RUN mkdir /build +ADD . /build/ +WORKDIR /build +RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-extldflags "-static"' -o k8s-api-test cmd/k8s-api-test/main.go + +FROM alpine:3.9 + +RUN set -ex \ + && echo "http://nl.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories \ + && echo "http://nl.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories \ + && apk update \ + && apk upgrade \ + && apk add --no-cache \ + bash \ + busybox-extras \ + curl \ + libc6-compat \ + openssl \ + net-tools \ + vim + +ADD motd /etc/motd +ADD profile /etc/profile + +ADD k8s-check.sh /usr/bin/k8s-check.sh +COPY --from=builder /build/k8s-api-test /usr/bin/ + +CMD ["/usr/bin/k8s-check.sh"] \ No newline at end of file diff --git a/diagnostics/README.md b/diagnostics/README.md new file mode 100644 index 0000000000..8e0140c7ea --- /dev/null +++ b/diagnostics/README.md @@ -0,0 +1,30 @@ +#Diagnostics + +This repository contains a simple tool that allows to check if environment is compatible with +Kubernetes collection. + + +Running: + +`$ kubectl run diag --generator=run-pod/v1 -it --rm --restart=Never --image localhost:5000/diagnostics --` + +Should provide an output such as: + +``` +/var/run/secrets/kubernetes.io/serviceaccount/token exists, size=842B +/var/run/secrets/kubernetes.io/serviceaccount/ca.crt exists, size=1025B +/var/run/secrets/kubernetes.io/serviceaccount/namespace exists, size=7B +KUBERNETES_SERVICE_HOST is set +KUBERNETES_SERVICE_PORT is set +POD_NAMESPACE is not set +Kubernetes cluster at 10.96.0.1:443 +Pod namespace env variable: +Running K8S API test +2020/04/21 17:08:19 Received data for 15 pods in the cluster +pod "diag" deleted +``` + +The pod can be also run in interactive mode, i.e.: + +`$ kubectl run diag --generator=run-pod/v1 -it --rm --restart=Never --image sumologic/k8s-diagnostics -- /bin/bash -l` + diff --git a/diagnostics/cmd/k8s-api-test/main.go b/diagnostics/cmd/k8s-api-test/main.go new file mode 100644 index 0000000000..aeb4fae5f1 --- /dev/null +++ b/diagnostics/cmd/k8s-api-test/main.go @@ -0,0 +1,40 @@ +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "log" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" +) + +func main() { + handleErr := func(message string, err error) { + if err != nil { + log.Fatalf("%s: %v\n", message, err) + } + } + + config, err := rest.InClusterConfig() + handleErr("Failed when creating in-cluster K8S config", err) + + clientset, err := kubernetes.NewForConfig(config) + handleErr("Failed when connecting to K8S cluster", err) + + pods, err := clientset.CoreV1().Pods("").List(metav1.ListOptions{Limit: 20}) + handleErr("Failed when fetching list of pods", err) + + log.Printf("Received data for %d pods in the cluster\n", len(pods.Items)) +} diff --git a/diagnostics/go.mod b/diagnostics/go.mod new file mode 100644 index 0000000000..9ccfb857da --- /dev/null +++ b/diagnostics/go.mod @@ -0,0 +1,5 @@ +module github.com/SumoLogic/sumologic-kubernetes-collection/diagnostics + +go 1.14 + +require k8s.io/client-go v12.0.0+incompatible diff --git a/diagnostics/go.sum b/diagnostics/go.sum new file mode 100644 index 0000000000..56e141dfc6 --- /dev/null +++ b/diagnostics/go.sum @@ -0,0 +1,88 @@ +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/Azure/go-autorest v11.1.2+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v0.0.0-20160705203006-01aeca54ebda/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/evanphx/json-patch v0.0.0-20190203023257-5858425f7550/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415 h1:WSBJMqJbLxsn+bTCPyPYZfqHdJmc8MK4wrBjMft6BAM= +github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/btree v0.0.0-20160524151835-7d79101e329e/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf h1:+RRA9JqSOZFfKrOeqr2z77+8R2RKyh8PG66dcu1V0ck= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/gophercloud/gophercloud v0.0.0-20190126172459-c818fa66e4c8/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4= +github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be h1:AHimNtVIpiBjPUhEF5KNCkrUyqTSA5zWUl8sQ2bfGBE= +github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v0.0.0-20190113212917-5533ce8a0da3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/spf13/pflag v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/crypto v0.0.0-20181025213731-e84da0312774 h1:a4tQYYYuK9QdeO/+kEvNYyuR21S+7ve5EANok6hABhI= +golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190206173232-65e2d4e15006 h1:bfLnR+k0tq5Lqt6dflRLcZiz6UaXCMt3vhYJ1l4FQ80= +golang.org/x/net v0.0.0-20190206173232-65e2d4e15006/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a h1:tImsplftrFpALCYumobsd0K86vlAs/eXGFms2txfJfA= +golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313 h1:pczuHS43Cp2ktBEEmLwScxgjWsBSzdaQiKzUyf3DTTc= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db h1:6/JqlYfC1CCaLnGceQTI+sDGhC9UBSPAsBqI0Gun6kU= +golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20161028155119-f51c12702a4d h1:TnM+PKb3ylGmZvyPXmo9m/wktg7Jn/a/fNmr33HSj8g= +golang.org/x/time v0.0.0-20161028155119-f51c12702a4d/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/inf.v0 v0.9.0 h1:3zYtXIO92bvsdS3ggAdA8Gb4Azj0YU+TVY1uGYNFA8o= +gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +k8s.io/api v0.0.0-20190620084959-7cf5895f2711 h1:BblVYz/wE5WtBsD/Gvu54KyBUTJMflolzc5I2DTvh50= +k8s.io/api v0.0.0-20190620084959-7cf5895f2711/go.mod h1:TBhBqb1AWbBQbW3XRusr7n7E4v2+5ZY8r8sAMnyFC5A= +k8s.io/apimachinery v0.0.0-20190612205821-1799e75a0719 h1:uV4S5IB5g4Nvi+TBVNf3e9L4wrirlwYJ6w88jUQxTUw= +k8s.io/apimachinery v0.0.0-20190612205821-1799e75a0719/go.mod h1:I4A+glKBHiTgiEjQiCCQfCAIcIMFGt291SmsvcrFzJA= +k8s.io/client-go v12.0.0+incompatible h1:YlJxncpeVUC98/WMZKC3JZGk/OXQWCZjAB4Xr3B17RY= +k8s.io/client-go v12.0.0+incompatible/go.mod h1:E95RaSlHr79aHaX0aGSwcPNfygDiPKOVXdmivCIZT0k= +k8s.io/klog v0.3.1 h1:RVgyDHY/kFKtLqh67NvEWIgkMneNoIrdkN0CxDSQc68= +k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/kube-openapi v0.0.0-20190228160746-b3a7cee44a30/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= +k8s.io/utils v0.0.0-20190221042446-c2654d5206da h1:ElyM7RPonbKnQqOcw7dG2IK5uvQQn3b/WPHqD5mBvP4= +k8s.io/utils v0.0.0-20190221042446-c2654d5206da/go.mod h1:8k8uAuAQ0rXslZKaEWd0c3oVhZz7sSzSiPnVZayjIX0= +sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/diagnostics/k8s-check.sh b/diagnostics/k8s-check.sh new file mode 100755 index 0000000000..b35f22af96 --- /dev/null +++ b/diagnostics/k8s-check.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash + +function check_file() { + if [[ -f $1 ]]; then + size=$(stat -L -c %s $1) + echo "$1 exists, size=${size}" + + if [ "$2" == "true" ]; then + contents="$(cat $1)" + echo "$1 contents: $contents" + fi + else + echo "$1 does not exist" + fi +} + +function check_env() { + if [[ -v $1 ]]; then + echo "$1 is set" + else + echo "$1 is not set" + fi +} + +check_file /var/run/secrets/kubernetes.io/serviceaccount/token +check_file /var/run/secrets/kubernetes.io/serviceaccount/ca.crt +check_file /var/run/secrets/kubernetes.io/serviceaccount/namespace true + +check_env KUBERNETES_SERVICE_HOST +check_env KUBERNETES_SERVICE_PORT +check_env POD_NAMESPACE +echo "POD_NAMESPACE env variable: ${POD_NAMESPACE}" +echo "Kubernetes cluster at $KUBERNETES_SERVICE_HOST:$KUBERNETES_SERVICE_PORT" + +echo "Running K8S API test" + +/usr/bin/k8s-api-test \ No newline at end of file diff --git a/diagnostics/motd b/diagnostics/motd new file mode 100644 index 0000000000..4b16d567a0 --- /dev/null +++ b/diagnostics/motd @@ -0,0 +1 @@ +Welcome to Collection Diagnostics image \ No newline at end of file diff --git a/diagnostics/profile b/diagnostics/profile new file mode 100644 index 0000000000..234de09fe1 --- /dev/null +++ b/diagnostics/profile @@ -0,0 +1 @@ +export PS1="\e[0;32m\]\u@\h \w >\e[0m\] " \ No newline at end of file From 6dc74a93a12cd6a1912941efdd0a6895bb0c94d2 Mon Sep 17 00:00:00 2001 From: Przemek Maciolek Date: Tue, 21 Apr 2020 19:33:56 +0200 Subject: [PATCH 2/9] Use kubernetes-diagnostics for consistency --- ci/build.sh | 2 +- diagnostics/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/build.sh b/ci/build.sh index 1766939351..7a1a8f56e6 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -3,7 +3,7 @@ VERSION="${TRAVIS_TAG:-0.0.0}" VERSION="${VERSION#v}" : "${DOCKER_TAG:=sumologic/kubernetes-fluentd}" -: "${DIAGNOSTICS_TAG:=sumologic/k8s-diagnostics}" +: "${DIAGNOSTICS_TAG:=sumologic/kubernetes-diagnostics}" : "${DOCKER_USERNAME:=sumodocker}" DOCKER_TAGS="https://registry.hub.docker.com/v1/repositories/sumologic/kubernetes-fluentd/tags" diff --git a/diagnostics/README.md b/diagnostics/README.md index 8e0140c7ea..b7f2fdd2ec 100644 --- a/diagnostics/README.md +++ b/diagnostics/README.md @@ -26,5 +26,5 @@ pod "diag" deleted The pod can be also run in interactive mode, i.e.: -`$ kubectl run diag --generator=run-pod/v1 -it --rm --restart=Never --image sumologic/k8s-diagnostics -- /bin/bash -l` +`$ kubectl run diag --generator=run-pod/v1 -it --rm --restart=Never --image sumologic/kubernetes-diagnostics -- /bin/bash -l` From e901bfc880f0cbda06ad77873dab6215a0a03b7d Mon Sep 17 00:00:00 2001 From: Przemek Maciolek Date: Tue, 21 Apr 2020 19:38:46 +0200 Subject: [PATCH 3/9] Update example --- diagnostics/README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/diagnostics/README.md b/diagnostics/README.md index b7f2fdd2ec..d389cb6d72 100644 --- a/diagnostics/README.md +++ b/diagnostics/README.md @@ -6,21 +6,22 @@ Kubernetes collection. Running: -`$ kubectl run diag --generator=run-pod/v1 -it --rm --restart=Never --image localhost:5000/diagnostics --` +`$ kubectl run diag --generator=run-pod/v1 -it --rm --restart=Never --image sumologic/kubernetes-diagnostics --` Should provide an output such as: ``` -/var/run/secrets/kubernetes.io/serviceaccount/token exists, size=842B -/var/run/secrets/kubernetes.io/serviceaccount/ca.crt exists, size=1025B -/var/run/secrets/kubernetes.io/serviceaccount/namespace exists, size=7B +/var/run/secrets/kubernetes.io/serviceaccount/token exists, size=842 +/var/run/secrets/kubernetes.io/serviceaccount/ca.crt exists, size=1025 +/var/run/secrets/kubernetes.io/serviceaccount/namespace exists, size=7 +/var/run/secrets/kubernetes.io/serviceaccount/namespace contents: default KUBERNETES_SERVICE_HOST is set KUBERNETES_SERVICE_PORT is set POD_NAMESPACE is not set +POD_NAMESPACE env variable: Kubernetes cluster at 10.96.0.1:443 -Pod namespace env variable: Running K8S API test -2020/04/21 17:08:19 Received data for 15 pods in the cluster +2020/04/21 17:38:20 Received data for 15 pods in the cluster pod "diag" deleted ``` From 3cff2b6b5cd53c3d459d86ccfe407c2ee431df60 Mon Sep 17 00:00:00 2001 From: Przemek Maciolek Date: Tue, 21 Apr 2020 20:52:23 +0200 Subject: [PATCH 4/9] Add K8S version info --- diagnostics/README.md | 3 ++- diagnostics/cmd/k8s-api-test/main.go | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/diagnostics/README.md b/diagnostics/README.md index d389cb6d72..c1fe77017f 100644 --- a/diagnostics/README.md +++ b/diagnostics/README.md @@ -21,7 +21,8 @@ POD_NAMESPACE is not set POD_NAMESPACE env variable: Kubernetes cluster at 10.96.0.1:443 Running K8S API test -2020/04/21 17:38:20 Received data for 15 pods in the cluster +2020/04/21 18:51:45 Kubernetes version: v1.15.5 +2020/04/21 18:51:45 Received data for 15 pods in the cluster pod "diag" deleted ``` diff --git a/diagnostics/cmd/k8s-api-test/main.go b/diagnostics/cmd/k8s-api-test/main.go index aeb4fae5f1..1a6b01d67b 100644 --- a/diagnostics/cmd/k8s-api-test/main.go +++ b/diagnostics/cmd/k8s-api-test/main.go @@ -33,6 +33,10 @@ func main() { clientset, err := kubernetes.NewForConfig(config) handleErr("Failed when connecting to K8S cluster", err) + version, err := clientset.Discovery().ServerVersion() + handleErr("Failed when pulling version info", err) + log.Printf("Kubernetes version: %s", version.GitVersion) + pods, err := clientset.CoreV1().Pods("").List(metav1.ListOptions{Limit: 20}) handleErr("Failed when fetching list of pods", err) From 8dd642c5fdc84d82c59ba888e469f2f501f489c7 Mon Sep 17 00:00:00 2001 From: Przemek Maciolek Date: Tue, 21 Apr 2020 21:00:29 +0200 Subject: [PATCH 5/9] Formatting --- diagnostics/cmd/k8s-api-test/main.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/diagnostics/cmd/k8s-api-test/main.go b/diagnostics/cmd/k8s-api-test/main.go index 1a6b01d67b..b02249dedd 100644 --- a/diagnostics/cmd/k8s-api-test/main.go +++ b/diagnostics/cmd/k8s-api-test/main.go @@ -21,24 +21,24 @@ import ( ) func main() { - handleErr := func(message string, err error) { + handleErr := func(message string, err error) { if err != nil { log.Fatalf("%s: %v\n", message, err) } - } + } - config, err := rest.InClusterConfig() - handleErr("Failed when creating in-cluster K8S config", err) + config, err := rest.InClusterConfig() + handleErr("Failed when creating in-cluster K8S config", err) clientset, err := kubernetes.NewForConfig(config) - handleErr("Failed when connecting to K8S cluster", err) + handleErr("Failed when connecting to K8S cluster", err) - version, err := clientset.Discovery().ServerVersion() - handleErr("Failed when pulling version info", err) - log.Printf("Kubernetes version: %s", version.GitVersion) + version, err := clientset.Discovery().ServerVersion() + handleErr("Failed when pulling version info", err) + log.Printf("Kubernetes version: %s", version.GitVersion) pods, err := clientset.CoreV1().Pods("").List(metav1.ListOptions{Limit: 20}) - handleErr("Failed when fetching list of pods", err) + handleErr("Failed when fetching list of pods", err) - log.Printf("Received data for %d pods in the cluster\n", len(pods.Items)) + log.Printf("Received data for %d pods in the cluster\n", len(pods.Items)) } From 1a71d52bbeec61258c17558c1ec1406d95dc6c75 Mon Sep 17 00:00:00 2001 From: Przemek Maciolek Date: Thu, 23 Apr 2020 10:42:09 +0200 Subject: [PATCH 6/9] Rename to tools --- ci/build.sh | 20 +++++++++---------- diagnostics/go.mod | 5 ----- diagnostics/motd | 1 - {diagnostics => tools}/Dockerfile | 7 ++++--- {diagnostics => tools}/README.md | 14 ++++++++----- .../cmd/k8s-api-test/main.go | 0 tools/go.mod | 8 ++++++++ {diagnostics => tools}/go.sum | 0 {diagnostics => tools}/k8s-check.sh | 0 tools/motd | 1 + {diagnostics => tools}/profile | 0 tools/usage.sh | 15 ++++++++++++++ 12 files changed, 47 insertions(+), 24 deletions(-) delete mode 100644 diagnostics/go.mod delete mode 100644 diagnostics/motd rename {diagnostics => tools}/Dockerfile (69%) rename {diagnostics => tools}/README.md (68%) rename {diagnostics => tools}/cmd/k8s-api-test/main.go (100%) create mode 100644 tools/go.mod rename {diagnostics => tools}/go.sum (100%) rename {diagnostics => tools}/k8s-check.sh (100%) create mode 100644 tools/motd rename {diagnostics => tools}/profile (100%) create mode 100755 tools/usage.sh diff --git a/ci/build.sh b/ci/build.sh index 7a1a8f56e6..c0983ad6af 100755 --- a/ci/build.sh +++ b/ci/build.sh @@ -3,7 +3,7 @@ VERSION="${TRAVIS_TAG:-0.0.0}" VERSION="${VERSION#v}" : "${DOCKER_TAG:=sumologic/kubernetes-fluentd}" -: "${DIAGNOSTICS_TAG:=sumologic/kubernetes-diagnostics}" +: "${TOOLS_TAG:=sumologic/kubernetes-tools}" : "${DOCKER_USERNAME:=sumodocker}" DOCKER_TAGS="https://registry.hub.docker.com/v1/repositories/sumologic/kubernetes-fluentd/tags" @@ -71,8 +71,8 @@ cd ../.. echo "Test docker image locally..." ruby deploy/test/test_docker.rb -echo "Building diagnostics image with $DIAGNOSTICS_TAG:local in $(pwd)..." -docker build -t $DIAGNOSTICS_TAG:local diagnostics --no-cache +echo "Building tools image with $TOOLS_TAG:local in $(pwd)..." +docker build -t $TOOLS_TAG:local tools --no-cache # Check for changes that require re-generating overrides yaml files if [ -n "$GITHUB_TOKEN" ] && [ "$TRAVIS_EVENT_TYPE" == "pull_request" ]; then @@ -183,29 +183,29 @@ function push_helm_chart() { } -function push_diagnostics_image() { +function push_tools_image() { local version="$1" set -x - echo "Tagging diagnostics image with $DIAGNOSTICS_TAG:$version" - docker tag $DIAGNOSTICS_TAG:local "$DIAGNOSTICS_TAG:$version" - decho "Pushing docker image $DIAGNOSTICS_TAG:$version" + echo "Tagging tools image with $TOOLS_TAG:$version" + docker tag $TOOLS_TAG:local "$TOOLS_TAG:$version" + decho "Pushing docker image $TOOLS_TAG:$version" echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin - docker push $DIAGNOSTICS_TAG:$version + docker push $TOOLS_TAG:$version set +x } if [ -n "$DOCKER_PASSWORD" ] && [ -n "$TRAVIS_TAG" ]; then push_docker_image "$VERSION" push_helm_chart "$VERSION" - push_diagnostics_image "$VERSION" + push_tools_image "$VERSION" elif [ -n "$DOCKER_PASSWORD" ] && [[ "$TRAVIS_BRANCH" == "master" || "$TRAVIS_BRANCH" =~ ^release-v[0-9]+\.[0-9]+$ ]] && [ "$TRAVIS_EVENT_TYPE" == "push" ]; then dev_build_tag=$(git describe --tags --always) dev_build_tag=${dev_build_tag#v} push_docker_image "$dev_build_tag" push_helm_chart "$dev_build_tag" - push_diagnostics_image "$dev_build_tag" + push_tools_image "$dev_build_tag" else echo "Skip Docker pushing" diff --git a/diagnostics/go.mod b/diagnostics/go.mod deleted file mode 100644 index 9ccfb857da..0000000000 --- a/diagnostics/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/SumoLogic/sumologic-kubernetes-collection/diagnostics - -go 1.14 - -require k8s.io/client-go v12.0.0+incompatible diff --git a/diagnostics/motd b/diagnostics/motd deleted file mode 100644 index 4b16d567a0..0000000000 --- a/diagnostics/motd +++ /dev/null @@ -1 +0,0 @@ -Welcome to Collection Diagnostics image \ No newline at end of file diff --git a/diagnostics/Dockerfile b/tools/Dockerfile similarity index 69% rename from diagnostics/Dockerfile rename to tools/Dockerfile index 9b4b2e8ee4..1bf959c3bb 100644 --- a/diagnostics/Dockerfile +++ b/tools/Dockerfile @@ -7,8 +7,8 @@ RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-extldflag FROM alpine:3.9 RUN set -ex \ - && echo "http://nl.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories \ - && echo "http://nl.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories \ + && echo "http://dl-cdn.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories \ + && echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories \ && apk update \ && apk upgrade \ && apk add --no-cache \ @@ -24,6 +24,7 @@ ADD motd /etc/motd ADD profile /etc/profile ADD k8s-check.sh /usr/bin/k8s-check.sh +ADD k8s-check.sh /usr/bin/usage.sh COPY --from=builder /build/k8s-api-test /usr/bin/ -CMD ["/usr/bin/k8s-check.sh"] \ No newline at end of file +CMD ["/usr/bin/usage.sh"] \ No newline at end of file diff --git a/diagnostics/README.md b/tools/README.md similarity index 68% rename from diagnostics/README.md rename to tools/README.md index c1fe77017f..42cd02244e 100644 --- a/diagnostics/README.md +++ b/tools/README.md @@ -1,12 +1,14 @@ -#Diagnostics +#Tools This repository contains a simple tool that allows to check if environment is compatible with Kubernetes collection. -Running: +# Running -`$ kubectl run diag --generator=run-pod/v1 -it --rm --restart=Never --image sumologic/kubernetes-diagnostics --` +## K8S Check + +`$ kubectl run tools --generator=run-pod/v1 -it --rm --restart=Never --image sumologic/kubernetes-tools -- /usr/bin/k8scheck.sh` Should provide an output such as: @@ -26,7 +28,9 @@ Running K8S API test pod "diag" deleted ``` -The pod can be also run in interactive mode, i.e.: +## Interactive mode + +The pod can be also run in interactive mode: -`$ kubectl run diag --generator=run-pod/v1 -it --rm --restart=Never --image sumologic/kubernetes-diagnostics -- /bin/bash -l` +`$ kubectl run tools --generator=run-pod/v1 -it --rm --restart=Never --image sumologic/kubernetes-tools -- /bin/bash -l` diff --git a/diagnostics/cmd/k8s-api-test/main.go b/tools/cmd/k8s-api-test/main.go similarity index 100% rename from diagnostics/cmd/k8s-api-test/main.go rename to tools/cmd/k8s-api-test/main.go diff --git a/tools/go.mod b/tools/go.mod new file mode 100644 index 0000000000..d7e9cd7d75 --- /dev/null +++ b/tools/go.mod @@ -0,0 +1,8 @@ +module github.com/SumoLogic/sumologic-kubernetes-collection/tools + +go 1.14 + +require ( + k8s.io/apimachinery v0.0.0-20190612205821-1799e75a0719 + k8s.io/client-go v12.0.0+incompatible +) diff --git a/diagnostics/go.sum b/tools/go.sum similarity index 100% rename from diagnostics/go.sum rename to tools/go.sum diff --git a/diagnostics/k8s-check.sh b/tools/k8s-check.sh similarity index 100% rename from diagnostics/k8s-check.sh rename to tools/k8s-check.sh diff --git a/tools/motd b/tools/motd new file mode 100644 index 0000000000..e4d805b757 --- /dev/null +++ b/tools/motd @@ -0,0 +1 @@ +Welcome to Collection Tools image \ No newline at end of file diff --git a/diagnostics/profile b/tools/profile similarity index 100% rename from diagnostics/profile rename to tools/profile diff --git a/tools/usage.sh b/tools/usage.sh new file mode 100755 index 0000000000..40b510affe --- /dev/null +++ b/tools/usage.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +read -d '' usage << EOF +This image provides a set of tools for Kubernetes Collection. You can use following commands: + + * K8S Check for verifying the environment: + + kubectl run tools --generator=run-pod/v1 -it --rm --restart=Never --image sumologic/kubernetes-tools -- /usr/bin/k8scheck.sh + + * Interactive mode: + + kubectl run tools --generator=run-pod/v1 -it --rm --restart=Never --image sumologic/kubernetes-tools -- /bin/bash -l +EOF + +echo "$usage" \ No newline at end of file From 90cb97dab32b7c56e9b2e7c79bc5eff480c33372 Mon Sep 17 00:00:00 2001 From: Przemek Maciolek Date: Thu, 23 Apr 2020 10:46:24 +0200 Subject: [PATCH 7/9] Fix command copied --- tools/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/Dockerfile b/tools/Dockerfile index 1bf959c3bb..b31980ba41 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -24,7 +24,7 @@ ADD motd /etc/motd ADD profile /etc/profile ADD k8s-check.sh /usr/bin/k8s-check.sh -ADD k8s-check.sh /usr/bin/usage.sh +ADD usage.sh /usr/bin/usage.sh COPY --from=builder /build/k8s-api-test /usr/bin/ CMD ["/usr/bin/usage.sh"] \ No newline at end of file From 59fc6d041d7e84fc0f31c1e1257a3daaa360502d Mon Sep 17 00:00:00 2001 From: Przemek Maciolek Date: Thu, 23 Apr 2020 10:48:31 +0200 Subject: [PATCH 8/9] Fix typo in command name --- tools/README.md | 2 +- tools/usage.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/README.md b/tools/README.md index 42cd02244e..a6845cfeb8 100644 --- a/tools/README.md +++ b/tools/README.md @@ -8,7 +8,7 @@ Kubernetes collection. ## K8S Check -`$ kubectl run tools --generator=run-pod/v1 -it --rm --restart=Never --image sumologic/kubernetes-tools -- /usr/bin/k8scheck.sh` +`$ kubectl run tools --generator=run-pod/v1 -it --rm --restart=Never --image sumologic/kubernetes-tools -- /usr/bin/k8s-check.sh` Should provide an output such as: diff --git a/tools/usage.sh b/tools/usage.sh index 40b510affe..7927e8a0d8 100755 --- a/tools/usage.sh +++ b/tools/usage.sh @@ -5,7 +5,7 @@ This image provides a set of tools for Kubernetes Collection. You can use follow * K8S Check for verifying the environment: - kubectl run tools --generator=run-pod/v1 -it --rm --restart=Never --image sumologic/kubernetes-tools -- /usr/bin/k8scheck.sh + kubectl run tools --generator=run-pod/v1 -it --rm --restart=Never --image sumologic/kubernetes-tools -- /usr/bin/k8s-check.sh * Interactive mode: From 499e083a8d8f11c5dde357356dd0082bd1029468 Mon Sep 17 00:00:00 2001 From: Przemek Maciolek Date: Thu, 23 Apr 2020 13:40:13 +0200 Subject: [PATCH 9/9] Rename k8s-check into check --- tools/Dockerfile | 6 +++--- tools/README.md | 2 +- tools/{k8s-check.sh => check} | 0 tools/{usage.sh => tools-usage} | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) rename tools/{k8s-check.sh => check} (100%) rename tools/{usage.sh => tools-usage} (83%) diff --git a/tools/Dockerfile b/tools/Dockerfile index b31980ba41..56171d215c 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -23,8 +23,8 @@ RUN set -ex \ ADD motd /etc/motd ADD profile /etc/profile -ADD k8s-check.sh /usr/bin/k8s-check.sh -ADD usage.sh /usr/bin/usage.sh +ADD check /usr/bin/check +ADD tools-usage /usr/bin/tools-usage COPY --from=builder /build/k8s-api-test /usr/bin/ -CMD ["/usr/bin/usage.sh"] \ No newline at end of file +CMD ["/usr/bin/tools-usage"] \ No newline at end of file diff --git a/tools/README.md b/tools/README.md index a6845cfeb8..dcbc9ec169 100644 --- a/tools/README.md +++ b/tools/README.md @@ -8,7 +8,7 @@ Kubernetes collection. ## K8S Check -`$ kubectl run tools --generator=run-pod/v1 -it --rm --restart=Never --image sumologic/kubernetes-tools -- /usr/bin/k8s-check.sh` +`$ kubectl run tools --generator=run-pod/v1 -it --rm --restart=Never --image sumologic/kubernetes-tools -- check` Should provide an output such as: diff --git a/tools/k8s-check.sh b/tools/check similarity index 100% rename from tools/k8s-check.sh rename to tools/check diff --git a/tools/usage.sh b/tools/tools-usage similarity index 83% rename from tools/usage.sh rename to tools/tools-usage index 7927e8a0d8..18486be0a8 100755 --- a/tools/usage.sh +++ b/tools/tools-usage @@ -5,7 +5,7 @@ This image provides a set of tools for Kubernetes Collection. You can use follow * K8S Check for verifying the environment: - kubectl run tools --generator=run-pod/v1 -it --rm --restart=Never --image sumologic/kubernetes-tools -- /usr/bin/k8s-check.sh + kubectl run tools --generator=run-pod/v1 -it --rm --restart=Never --image sumologic/kubernetes-tools -- check * Interactive mode: