mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 19:56:01 +00:00
Remove fluentd-elasticsearch addon
This commit is contained in:
parent
8c6b910e68
commit
5d9b7ae9e5
@ -90,8 +90,6 @@ dependencies:
|
|||||||
version: 1.17.5
|
version: 1.17.5
|
||||||
refPaths:
|
refPaths:
|
||||||
- path: build/build-image/cross/VERSION
|
- path: build/build-image/cross/VERSION
|
||||||
- path: cluster/addons/fluentd-elasticsearch/es-image/Dockerfile
|
|
||||||
match: 'FROM golang\:\d+.\d+(alpha|beta|rc)?\.?(\d+)?'
|
|
||||||
- path: staging/publishing/rules.yaml
|
- path: staging/publishing/rules.yaml
|
||||||
match: 'default-go-version\: \d+.\d+(alpha|beta|rc)?\.?(\d+)?'
|
match: 'default-go-version\: \d+.\d+(alpha|beta|rc)?\.?(\d+)?'
|
||||||
- path: test/images/Makefile
|
- path: test/images/Makefile
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
# See the OWNERS docs at https://go.k8s.io/owners
|
|
||||||
|
|
||||||
approvers:
|
|
||||||
- coffeepac
|
|
||||||
- monotek
|
|
||||||
- sig-instrumentation-approvers
|
|
||||||
reviewers:
|
|
||||||
- sig-instrumentation-reviewers
|
|
||||||
labels:
|
|
||||||
- sig/instrumentation
|
|
@ -1,90 +0,0 @@
|
|||||||
# Elasticsearch Add-On
|
|
||||||
|
|
||||||
This add-on consists of a combination of [Elasticsearch][elasticsearch],
|
|
||||||
[Fluentd][fluentd] and [Kibana][kibana]. Elasticsearch is a search engine
|
|
||||||
that is responsible for storing our logs and allowing for them to be queried.
|
|
||||||
Fluentd sends log messages from Kubernetes to Elasticsearch, whereas Kibana
|
|
||||||
is a graphical interface for viewing and querying the logs stored in
|
|
||||||
Elasticsearch.
|
|
||||||
|
|
||||||
**Note:** this addon should **not** be used as-is in production. This is
|
|
||||||
an example and you should treat it as such. Please see at least the
|
|
||||||
[Security](#security) and the [Storage](#storage) sections for more
|
|
||||||
information.
|
|
||||||
|
|
||||||
## Elasticsearch
|
|
||||||
|
|
||||||
Elasticsearch is deployed as a [StatefulSet][statefulSet], which is like
|
|
||||||
a Deployment, but allows for maintaining state on storage volumes.
|
|
||||||
|
|
||||||
### Security
|
|
||||||
|
|
||||||
Elasticsearch has capabilities to enable authorization using the [X-Pack
|
|
||||||
plugin][xPack]. For the sake of simplicity this example uses the fully open
|
|
||||||
source prebuild images from elastic that do not contain the X-Pack plugin. If
|
|
||||||
you need these features, please consider building the images from either the
|
|
||||||
"basic" or "platinum" version. After enabling these features, follow [official
|
|
||||||
documentation][setupCreds] to set up credentials in Elasticsearch and Kibana.
|
|
||||||
Don't forget to propagate those credentials also to Fluentd in its
|
|
||||||
[configuration][fluentdCreds]. You can utilize [ConfigMaps][configMap] and
|
|
||||||
[Secrets][secret] to store credentials in the Kubernetes apiserver.
|
|
||||||
|
|
||||||
### Initialization
|
|
||||||
|
|
||||||
The Elasticsearch StatefulSet manifest specifies that there shall be an
|
|
||||||
[init container][initContainer] executing before Elasticsearch containers
|
|
||||||
themselves, in order to ensure that the kernel state variable
|
|
||||||
`vm.max_map_count` is at least 262144, since this is a requirement of
|
|
||||||
Elasticsearch. You may remove the init container if you know that your host
|
|
||||||
OS meets this requirement.
|
|
||||||
|
|
||||||
### Storage
|
|
||||||
|
|
||||||
The Elasticsearch StatefulSet will use the [EmptyDir][emptyDir] volume to
|
|
||||||
store data. EmptyDir is erased when the pod terminates, here it is used only
|
|
||||||
for testing purposes. **Important:** please change the storage to persistent
|
|
||||||
volume claim before actually using this StatefulSet in your setup!
|
|
||||||
|
|
||||||
## Fluentd
|
|
||||||
|
|
||||||
Fluentd is deployed as a [DaemonSet][daemonSet] which spawns a pod on each
|
|
||||||
node that reads logs, generated by kubelet, container runtime and containers
|
|
||||||
and sends them to Elasticsearch.
|
|
||||||
|
|
||||||
Learn more in the [official Kubernetes documentation][k8sElasticsearchDocs].
|
|
||||||
|
|
||||||
## Building
|
|
||||||
|
|
||||||
Both images are now being hosted in quay.io and are built locally via `make` and `docker`.
|
|
||||||
To build locally run `make build` and then `make push` to publish.
|
|
||||||
|
|
||||||
### Known problems
|
|
||||||
|
|
||||||
Since Fluentd talks to the Elasticsearch service inside the cluster, instances
|
|
||||||
on masters won't work, because masters have no kube-proxy. Don't mark masters
|
|
||||||
with the label mentioned in the previous paragraph or add a taint on them to
|
|
||||||
avoid Fluentd pods scheduling there.
|
|
||||||
|
|
||||||
[fluentd]: http://www.fluentd.org/
|
|
||||||
[elasticsearch]: https://www.elastic.co/products/elasticsearch
|
|
||||||
[kibana]: https://www.elastic.co/products/kibana
|
|
||||||
[xPack]: https://www.elastic.co/products/x-pack
|
|
||||||
[setupCreds]: https://www.elastic.co/guide/en/x-pack/current/setting-up-authentication.html#reset-built-in-user-passwords
|
|
||||||
[fluentdCreds]: https://github.com/uken/fluent-plugin-elasticsearch#user-password-path-scheme-ssl_verify
|
|
||||||
[configMap]: https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/
|
|
||||||
[secret]: https://kubernetes.io/docs/concepts/configuration/secret/
|
|
||||||
[statefulSet]: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset
|
|
||||||
[initContainer]: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
|
|
||||||
[emptyDir]: https://kubernetes.io/docs/concepts/storage/volumes#emptydir
|
|
||||||
[daemonSet]: https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/
|
|
||||||
[k8sElasticsearchDocs]: https://kubernetes.io/docs/tasks/debug-application-cluster/logging-elasticsearch-kibana
|
|
||||||
|
|
||||||
## Running EFK stack in production
|
|
||||||
|
|
||||||
The configurations provided here for Elasticsearch, Fluentd & Kibana (EFK),
|
|
||||||
are a starting point and should not be considered to be production ready.
|
|
||||||
|
|
||||||
If you like to run these tools in a production environment you could use the
|
|
||||||
[Helm](https://helm.sh) charts, provided by the Helm community, which are used
|
|
||||||
by a lot of people and therefore are widely tested. You can find them all via the
|
|
||||||
[Helm Hub](https://hub.helm.sh/) or the [Artifact hub](https://artifacthub.io/).
|
|
@ -1,8 +0,0 @@
|
|||||||
kind: Namespace
|
|
||||||
apiVersion: v1
|
|
||||||
metadata:
|
|
||||||
name: logging
|
|
||||||
labels:
|
|
||||||
k8s-app: logging
|
|
||||||
kubernetes.io/cluster-service: "true"
|
|
||||||
addonmanager.kubernetes.io/mode: Reconcile
|
|
@ -1 +0,0 @@
|
|||||||
elasticsearch_logging_discovery
|
|
@ -1,31 +0,0 @@
|
|||||||
# Copyright 2017 The Kubernetes Authors.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
FROM golang:1.17.5 AS builder
|
|
||||||
COPY elasticsearch_logging_discovery.go go.mod go.sum /
|
|
||||||
RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -a -ldflags "-w" -o /elasticsearch_logging_discovery /elasticsearch_logging_discovery.go
|
|
||||||
|
|
||||||
|
|
||||||
FROM docker.elastic.co/elasticsearch/elasticsearch:7.16.2
|
|
||||||
|
|
||||||
VOLUME ["/data"]
|
|
||||||
EXPOSE 9200 9300
|
|
||||||
|
|
||||||
COPY --from=builder /elasticsearch_logging_discovery bin/
|
|
||||||
COPY run.sh bin/
|
|
||||||
COPY config/elasticsearch.yml config/log4j2.properties config/
|
|
||||||
|
|
||||||
USER root
|
|
||||||
RUN chown -R elasticsearch:elasticsearch ./
|
|
||||||
CMD ["bin/run.sh"]
|
|
@ -1,27 +0,0 @@
|
|||||||
# Copyright 2017 The Kubernetes Authors.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
.PHONY: build push
|
|
||||||
|
|
||||||
PREFIX = quay.io/fluentd_elasticsearch
|
|
||||||
IMAGE = elasticsearch
|
|
||||||
TAG = v7.16.2
|
|
||||||
|
|
||||||
build:
|
|
||||||
docker build --tag ${PREFIX}/${IMAGE}:${TAG} .
|
|
||||||
docker build --tag ${PREFIX}/${IMAGE}:latest .
|
|
||||||
|
|
||||||
push:
|
|
||||||
docker push ${PREFIX}/${IMAGE}:${TAG}
|
|
||||||
docker push ${PREFIX}/${IMAGE}:latest
|
|
@ -1,11 +0,0 @@
|
|||||||
cluster.name: kubernetes-logging
|
|
||||||
|
|
||||||
node.name: ${NODE_NAME}
|
|
||||||
node.master: ${NODE_MASTER}
|
|
||||||
node.data: ${NODE_DATA}
|
|
||||||
|
|
||||||
transport.profiles.default.port: ${TRANSPORT_PORT}
|
|
||||||
http.port: ${HTTP_PORT}
|
|
||||||
|
|
||||||
path.data: /data
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
|||||||
status = error
|
|
||||||
|
|
||||||
appender.console.type = Console
|
|
||||||
appender.console.name = console
|
|
||||||
appender.console.layout.type = PatternLayout
|
|
||||||
appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%m%n
|
|
||||||
|
|
||||||
rootLogger.level = info
|
|
||||||
rootLogger.appenderRef.console.ref = console
|
|
||||||
rootLogger.action = debug
|
|
||||||
rootLogger.com.amazonaws = warn
|
|
@ -1,157 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2017 The Kubernetes Authors.
|
|
||||||
|
|
||||||
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 (
|
|
||||||
"context"
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"net"
|
|
||||||
"os"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
corev1 "k8s.io/api/core/v1"
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
||||||
clientset "k8s.io/client-go/kubernetes"
|
|
||||||
restclient "k8s.io/client-go/rest"
|
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
|
||||||
clientapi "k8s.io/client-go/tools/clientcmd/api"
|
|
||||||
"k8s.io/klog/v2"
|
|
||||||
utilnet "k8s.io/utils/net"
|
|
||||||
)
|
|
||||||
|
|
||||||
func buildConfigFromEnvs(masterURL, kubeconfigPath string) (*restclient.Config, error) {
|
|
||||||
if kubeconfigPath == "" && masterURL == "" {
|
|
||||||
kubeconfig, err := restclient.InClusterConfig()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return kubeconfig, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
|
|
||||||
&clientcmd.ClientConfigLoadingRules{ExplicitPath: kubeconfigPath},
|
|
||||||
&clientcmd.ConfigOverrides{ClusterInfo: clientapi.Cluster{Server: masterURL}}).ClientConfig()
|
|
||||||
}
|
|
||||||
|
|
||||||
func flattenSubsets(subsets []corev1.EndpointSubset) []string {
|
|
||||||
ips := []string{}
|
|
||||||
for _, ss := range subsets {
|
|
||||||
for _, addr := range ss.Addresses {
|
|
||||||
if utilnet.IsIPv6String(addr.IP) {
|
|
||||||
ips = append(ips, fmt.Sprintf(`"[%s]"`, addr.IP))
|
|
||||||
} else {
|
|
||||||
ips = append(ips, fmt.Sprintf(`"%s"`, addr.IP))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ips
|
|
||||||
}
|
|
||||||
|
|
||||||
func getAdvertiseAddress() (string, error) {
|
|
||||||
addrs, err := net.InterfaceAddrs()
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, addr := range addrs {
|
|
||||||
if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
|
|
||||||
return ipnet.IP.String(), nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return "", fmt.Errorf("no non-loopback address is available")
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
flag.Parse()
|
|
||||||
|
|
||||||
klog.Info("Kubernetes Elasticsearch logging discovery")
|
|
||||||
|
|
||||||
advertiseAddress, err := getAdvertiseAddress()
|
|
||||||
if err != nil {
|
|
||||||
klog.Fatalf("Failed to get valid advertise address: %v", err)
|
|
||||||
}
|
|
||||||
fmt.Printf("network.host: \"%s\"\n\n", advertiseAddress)
|
|
||||||
|
|
||||||
cc, err := buildConfigFromEnvs(os.Getenv("APISERVER_HOST"), os.Getenv("KUBE_CONFIG_FILE"))
|
|
||||||
if err != nil {
|
|
||||||
klog.Fatalf("Failed to make client: %v", err)
|
|
||||||
}
|
|
||||||
client, err := clientset.NewForConfig(cc)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
klog.Fatalf("Failed to make client: %v", err)
|
|
||||||
}
|
|
||||||
namespace := metav1.NamespaceSystem
|
|
||||||
envNamespace := os.Getenv("NAMESPACE")
|
|
||||||
if envNamespace != "" {
|
|
||||||
if _, err := client.CoreV1().Namespaces().Get(context.TODO(), envNamespace, metav1.GetOptions{}); err != nil {
|
|
||||||
klog.Fatalf("%s namespace doesn't exist: %v", envNamespace, err)
|
|
||||||
}
|
|
||||||
namespace = envNamespace
|
|
||||||
}
|
|
||||||
|
|
||||||
var elasticsearch *corev1.Service
|
|
||||||
serviceName := os.Getenv("ELASTICSEARCH_SERVICE_NAME")
|
|
||||||
if serviceName == "" {
|
|
||||||
serviceName = "elasticsearch-logging"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Look for endpoints associated with the Elasticsearch logging service.
|
|
||||||
// First wait for the service to become available.
|
|
||||||
for t := time.Now(); time.Since(t) < 5*time.Minute; time.Sleep(10 * time.Second) {
|
|
||||||
elasticsearch, err = client.CoreV1().Services(namespace).Get(context.TODO(), serviceName, metav1.GetOptions{})
|
|
||||||
if err == nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// If we did not find an elasticsearch logging service then log a warning
|
|
||||||
// and return without adding any unicast hosts.
|
|
||||||
if elasticsearch == nil {
|
|
||||||
klog.Warningf("Failed to find the elasticsearch-logging service: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var endpoints *corev1.Endpoints
|
|
||||||
addrs := []string{}
|
|
||||||
// Wait for some endpoints.
|
|
||||||
count, _ := strconv.Atoi(os.Getenv("MINIMUM_MASTER_NODES"))
|
|
||||||
for t := time.Now(); time.Since(t) < 5*time.Minute; time.Sleep(10 * time.Second) {
|
|
||||||
endpoints, err = client.CoreV1().Endpoints(namespace).Get(context.TODO(), serviceName, metav1.GetOptions{})
|
|
||||||
if err != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
addrs = flattenSubsets(endpoints.Subsets)
|
|
||||||
klog.Infof("Found %s", addrs)
|
|
||||||
if len(addrs) > 0 && len(addrs) >= count {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// If there was an error finding endpoints then log a warning and quit.
|
|
||||||
if err != nil {
|
|
||||||
klog.Warningf("Error finding endpoints: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
klog.Infof("Endpoints = %s", addrs)
|
|
||||||
fmt.Printf("discovery.seed_hosts: [%s]\n", strings.Join(addrs, ", "))
|
|
||||||
fmt.Printf("cluster.initial_master_nodes: [%s]\n", strings.Join(addrs, ", "))
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
module fake/import/path
|
|
||||||
|
|
||||||
go 1.16
|
|
||||||
|
|
||||||
require (
|
|
||||||
github.com/imdario/mergo v0.3.6 // indirect
|
|
||||||
k8s.io/api v0.19.2
|
|
||||||
k8s.io/apimachinery v0.19.2
|
|
||||||
k8s.io/client-go v0.19.2
|
|
||||||
k8s.io/klog/v2 v2.3.0
|
|
||||||
k8s.io/utils v0.0.0-20200729134348-d5654de09c73
|
|
||||||
)
|
|
||||||
|
|
||||||
replace (
|
|
||||||
k8s.io/api => k8s.io/api v0.19.2
|
|
||||||
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.19.2
|
|
||||||
k8s.io/apimachinery => k8s.io/apimachinery v0.19.2
|
|
||||||
k8s.io/apiserver => k8s.io/apiserver v0.19.2
|
|
||||||
k8s.io/cli-runtime => k8s.io/cli-runtime v0.19.2
|
|
||||||
k8s.io/client-go => k8s.io/client-go v0.19.2
|
|
||||||
k8s.io/cloud-provider => k8s.io/cloud-provider v0.19.2
|
|
||||||
k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.19.2
|
|
||||||
k8s.io/code-generator => k8s.io/code-generator v0.19.2
|
|
||||||
k8s.io/component-base => k8s.io/component-base v0.19.2
|
|
||||||
k8s.io/cri-api => k8s.io/cri-api v0.19.2
|
|
||||||
k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.19.2
|
|
||||||
k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.19.2
|
|
||||||
k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.19.2
|
|
||||||
k8s.io/kube-proxy => k8s.io/kube-proxy v0.19.2
|
|
||||||
k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.19.2
|
|
||||||
k8s.io/kubectl => k8s.io/kubectl v0.19.2
|
|
||||||
k8s.io/kubelet => k8s.io/kubelet v0.19.2
|
|
||||||
k8s.io/kubernetes => k8s.io/kubernetes v1.18.0
|
|
||||||
k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.19.2
|
|
||||||
k8s.io/metrics => k8s.io/metrics v0.19.2
|
|
||||||
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.19.2
|
|
||||||
)
|
|
@ -1,324 +0,0 @@
|
|||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
|
||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
|
||||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
|
||||||
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
|
|
||||||
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
|
||||||
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
|
|
||||||
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
|
|
||||||
cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw=
|
|
||||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
|
||||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
|
||||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
|
||||||
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
|
|
||||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
|
||||||
github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
|
|
||||||
github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630=
|
|
||||||
github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
|
|
||||||
github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q=
|
|
||||||
github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
|
|
||||||
github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g=
|
|
||||||
github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
|
|
||||||
github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
|
|
||||||
github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
|
|
||||||
github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
|
|
||||||
github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
|
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
|
||||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
|
||||||
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
|
|
||||||
github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
|
||||||
github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
|
||||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
|
||||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
|
||||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
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 v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
|
||||||
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
|
|
||||||
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
|
|
||||||
github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
|
|
||||||
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
|
|
||||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
|
||||||
github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
|
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
|
||||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
|
||||||
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
|
||||||
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
|
|
||||||
github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY=
|
|
||||||
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
|
||||||
github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
|
|
||||||
github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg=
|
|
||||||
github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
|
|
||||||
github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
|
|
||||||
github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
|
|
||||||
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
|
||||||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
|
||||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
|
||||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
|
||||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
|
||||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
|
||||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
|
||||||
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
|
|
||||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
|
||||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
|
||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
|
||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
|
||||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
|
||||||
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
|
|
||||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
|
||||||
github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
|
|
||||||
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
|
||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
|
||||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
|
||||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
|
||||||
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
|
||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
|
||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
|
||||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
|
||||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
|
||||||
github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I=
|
|
||||||
github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
|
|
||||||
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
|
|
||||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
|
||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
|
||||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
|
||||||
github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
|
||||||
github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28=
|
|
||||||
github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
|
||||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
|
||||||
github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
|
|
||||||
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
|
||||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
|
||||||
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
|
||||||
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
|
||||||
github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
|
|
||||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
|
||||||
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/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
|
||||||
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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
|
||||||
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/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
|
||||||
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
|
|
||||||
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
|
||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
|
||||||
github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
|
||||||
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
|
||||||
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
|
||||||
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
|
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
|
||||||
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
|
||||||
github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
|
||||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
|
||||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
|
||||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
|
||||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
|
||||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
|
||||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
|
||||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
|
||||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
|
||||||
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
|
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
|
||||||
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=
|
|
||||||
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
|
|
||||||
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
|
||||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
|
||||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
|
||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
|
||||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
|
||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
|
||||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
|
||||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
|
||||||
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.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
|
||||||
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=
|
|
||||||
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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
|
||||||
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
|
||||||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
|
||||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU=
|
|
||||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/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-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8=
|
|
||||||
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/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.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
|
||||||
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
|
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg=
|
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
|
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
|
||||||
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
|
||||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
|
||||||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
|
||||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
|
||||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
|
||||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
|
||||||
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=
|
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
|
||||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
|
||||||
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
|
||||||
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
|
||||||
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
|
||||||
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=
|
|
||||||
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
|
||||||
google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM=
|
|
||||||
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
|
||||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
|
||||||
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
|
||||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
|
||||||
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
|
||||||
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
|
||||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
|
||||||
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
|
|
||||||
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
|
||||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
|
||||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
|
||||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
|
||||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
|
||||||
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
|
||||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
|
||||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
|
||||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
|
||||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
|
||||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
|
||||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
|
||||||
google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA=
|
|
||||||
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
|
|
||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
|
||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
|
||||||
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
|
|
||||||
gopkg.in/inf.v0 v0.9.1/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/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
|
|
||||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
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=
|
|
||||||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
|
||||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
|
||||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
|
||||||
k8s.io/api v0.19.2 h1:q+/krnHWKsL7OBZg/rxnycsl9569Pud76UJ77MvKXms=
|
|
||||||
k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI=
|
|
||||||
k8s.io/apimachinery v0.19.2 h1:5Gy9vQpAGTKHPVOh5c4plE274X8D/6cuEiTO2zve7tc=
|
|
||||||
k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
|
|
||||||
k8s.io/client-go v0.19.2 h1:gMJuU3xJZs86L1oQ99R4EViAADUPMHHtS9jFshasHSc=
|
|
||||||
k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA=
|
|
||||||
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
|
|
||||||
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
|
|
||||||
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
|
|
||||||
k8s.io/klog/v2 v2.3.0 h1:WmkrnW7fdrm0/DMClc+HIxtftvxVIPAhlVwMQo5yLco=
|
|
||||||
k8s.io/klog/v2 v2.3.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
|
|
||||||
k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
|
|
||||||
k8s.io/utils v0.0.0-20200729134348-d5654de09c73 h1:uJmqzgNWG7XyClnU/mLPBWwfKKF1K8Hf8whTseBgJcg=
|
|
||||||
k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
|
|
||||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.0.1 h1:YXTMot5Qz/X1iBRJhAt+vI+HVttY0WkSqqhKxQ0xVbA=
|
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
|
|
||||||
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
|
|
||||||
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
|
|
||||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
|
@ -1,29 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Copyright 2017 The Kubernetes Authors.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
set -ex
|
|
||||||
|
|
||||||
export NODE_NAME=${NODE_NAME:-${HOSTNAME}}
|
|
||||||
export NODE_MASTER=${NODE_MASTER:-true}
|
|
||||||
export NODE_DATA=${NODE_DATA:-true}
|
|
||||||
export HTTP_PORT=${HTTP_PORT:-9200}
|
|
||||||
export TRANSPORT_PORT=${TRANSPORT_PORT:-9300}
|
|
||||||
export MINIMUM_MASTER_NODES=${MINIMUM_MASTER_NODES:-2}
|
|
||||||
|
|
||||||
chown -R elasticsearch:elasticsearch /data
|
|
||||||
|
|
||||||
./bin/elasticsearch_logging_discovery >> ./config/elasticsearch.yml
|
|
||||||
exec su elasticsearch -c /usr/local/bin/docker-entrypoint.sh
|
|
@ -1,26 +0,0 @@
|
|||||||
apiVersion: v1
|
|
||||||
kind: Service
|
|
||||||
metadata:
|
|
||||||
name: elasticsearch-logging
|
|
||||||
namespace: logging
|
|
||||||
labels:
|
|
||||||
k8s-app: elasticsearch-logging
|
|
||||||
kubernetes.io/cluster-service: "true"
|
|
||||||
addonmanager.kubernetes.io/mode: Reconcile
|
|
||||||
kubernetes.io/name: "Elasticsearch"
|
|
||||||
spec:
|
|
||||||
clusterIP: None
|
|
||||||
ports:
|
|
||||||
- name: db
|
|
||||||
port: 9200
|
|
||||||
protocol: TCP
|
|
||||||
targetPort: 9200
|
|
||||||
- name: transport
|
|
||||||
port: 9300
|
|
||||||
protocol: TCP
|
|
||||||
targetPort: 9300
|
|
||||||
publishNotReadyAddresses: true
|
|
||||||
selector:
|
|
||||||
k8s-app: elasticsearch-logging
|
|
||||||
sessionAffinity: None
|
|
||||||
type: ClusterIP
|
|
@ -1,119 +0,0 @@
|
|||||||
# RBAC authn and authz
|
|
||||||
apiVersion: v1
|
|
||||||
kind: ServiceAccount
|
|
||||||
metadata:
|
|
||||||
name: elasticsearch-logging
|
|
||||||
namespace: logging
|
|
||||||
labels:
|
|
||||||
k8s-app: elasticsearch-logging
|
|
||||||
addonmanager.kubernetes.io/mode: Reconcile
|
|
||||||
---
|
|
||||||
kind: ClusterRole
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: elasticsearch-logging
|
|
||||||
labels:
|
|
||||||
k8s-app: elasticsearch-logging
|
|
||||||
addonmanager.kubernetes.io/mode: Reconcile
|
|
||||||
rules:
|
|
||||||
- apiGroups:
|
|
||||||
- ""
|
|
||||||
resources:
|
|
||||||
- "services"
|
|
||||||
- "namespaces"
|
|
||||||
- "endpoints"
|
|
||||||
verbs:
|
|
||||||
- "get"
|
|
||||||
---
|
|
||||||
kind: ClusterRoleBinding
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: elasticsearch-logging
|
|
||||||
labels:
|
|
||||||
k8s-app: elasticsearch-logging
|
|
||||||
addonmanager.kubernetes.io/mode: Reconcile
|
|
||||||
subjects:
|
|
||||||
- kind: ServiceAccount
|
|
||||||
name: elasticsearch-logging
|
|
||||||
namespace: logging
|
|
||||||
apiGroup: ""
|
|
||||||
roleRef:
|
|
||||||
kind: ClusterRole
|
|
||||||
name: elasticsearch-logging
|
|
||||||
apiGroup: ""
|
|
||||||
---
|
|
||||||
# Elasticsearch deployment itself
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: StatefulSet
|
|
||||||
metadata:
|
|
||||||
name: elasticsearch-logging
|
|
||||||
namespace: logging
|
|
||||||
labels:
|
|
||||||
k8s-app: elasticsearch-logging
|
|
||||||
version: v7.16.2
|
|
||||||
addonmanager.kubernetes.io/mode: Reconcile
|
|
||||||
spec:
|
|
||||||
serviceName: elasticsearch-logging
|
|
||||||
replicas: 2
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
k8s-app: elasticsearch-logging
|
|
||||||
version: v7.16.2
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
k8s-app: elasticsearch-logging
|
|
||||||
version: v7.16.2
|
|
||||||
spec:
|
|
||||||
serviceAccountName: elasticsearch-logging
|
|
||||||
containers:
|
|
||||||
- image: quay.io/fluentd_elasticsearch/elasticsearch:v7.16.2
|
|
||||||
name: elasticsearch-logging
|
|
||||||
imagePullPolicy: Always
|
|
||||||
resources:
|
|
||||||
# need more cpu upon initialization, therefore burstable class
|
|
||||||
limits:
|
|
||||||
cpu: 1000m
|
|
||||||
memory: 3Gi
|
|
||||||
requests:
|
|
||||||
cpu: 100m
|
|
||||||
memory: 3Gi
|
|
||||||
ports:
|
|
||||||
- containerPort: 9200
|
|
||||||
name: db
|
|
||||||
protocol: TCP
|
|
||||||
- containerPort: 9300
|
|
||||||
name: transport
|
|
||||||
protocol: TCP
|
|
||||||
livenessProbe:
|
|
||||||
tcpSocket:
|
|
||||||
port: transport
|
|
||||||
initialDelaySeconds: 5
|
|
||||||
timeoutSeconds: 10
|
|
||||||
readinessProbe:
|
|
||||||
tcpSocket:
|
|
||||||
port: transport
|
|
||||||
initialDelaySeconds: 5
|
|
||||||
timeoutSeconds: 10
|
|
||||||
volumeMounts:
|
|
||||||
- name: elasticsearch-logging
|
|
||||||
mountPath: /data
|
|
||||||
env:
|
|
||||||
- name: "NAMESPACE"
|
|
||||||
valueFrom:
|
|
||||||
fieldRef:
|
|
||||||
fieldPath: metadata.namespace
|
|
||||||
- name: "MINIMUM_MASTER_NODES"
|
|
||||||
value: "1"
|
|
||||||
volumes:
|
|
||||||
- name: elasticsearch-logging
|
|
||||||
emptyDir: {}
|
|
||||||
# Elasticsearch requires vm.max_map_count to be at least 262144.
|
|
||||||
# If your OS already sets up this number to a higher value, feel free
|
|
||||||
# to remove this init container.
|
|
||||||
initContainers:
|
|
||||||
- image: alpine:3.6
|
|
||||||
command: ["/sbin/sysctl", "-w", "vm.max_map_count=262144"]
|
|
||||||
name: elasticsearch-logging-init
|
|
||||||
securityContext:
|
|
||||||
privileged: true
|
|
@ -1,479 +0,0 @@
|
|||||||
kind: ConfigMap
|
|
||||||
apiVersion: v1
|
|
||||||
metadata:
|
|
||||||
name: fluentd-es-config-v0.2.1
|
|
||||||
namespace: logging
|
|
||||||
labels:
|
|
||||||
addonmanager.kubernetes.io/mode: Reconcile
|
|
||||||
data:
|
|
||||||
system.conf: |-
|
|
||||||
<system>
|
|
||||||
root_dir /tmp/fluentd-buffers/
|
|
||||||
</system>
|
|
||||||
|
|
||||||
containers.input.conf: |-
|
|
||||||
# This configuration file for Fluentd / td-agent is used
|
|
||||||
# to watch changes to Docker log files. The kubelet creates symlinks that
|
|
||||||
# capture the pod name, namespace, container name & Docker container ID
|
|
||||||
# to the docker logs for pods in the /var/log/containers directory on the host.
|
|
||||||
# If running this fluentd configuration in a Docker container, the /var/log
|
|
||||||
# directory should be mounted in the container.
|
|
||||||
#
|
|
||||||
# These logs are then submitted to Elasticsearch which assumes the
|
|
||||||
# installation of the fluent-plugin-elasticsearch & the
|
|
||||||
# fluent-plugin-kubernetes_metadata_filter plugins.
|
|
||||||
# See https://github.com/uken/fluent-plugin-elasticsearch &
|
|
||||||
# https://github.com/fabric8io/fluent-plugin-kubernetes_metadata_filter for
|
|
||||||
# more information about the plugins.
|
|
||||||
#
|
|
||||||
# Example
|
|
||||||
# =======
|
|
||||||
# A line in the Docker log file might look like this JSON:
|
|
||||||
#
|
|
||||||
# {"log":"2014/09/25 21:15:03 Got request with path wombat\n",
|
|
||||||
# "stream":"stderr",
|
|
||||||
# "time":"2014-09-25T21:15:03.499185026Z"}
|
|
||||||
#
|
|
||||||
# The time_format specification below makes sure we properly
|
|
||||||
# parse the time format produced by Docker. This will be
|
|
||||||
# submitted to Elasticsearch and should appear like:
|
|
||||||
# $ curl 'http://elasticsearch-logging:9200/_search?pretty'
|
|
||||||
# ...
|
|
||||||
# {
|
|
||||||
# "_index" : "logstash-2014.09.25",
|
|
||||||
# "_type" : "fluentd",
|
|
||||||
# "_id" : "VBrbor2QTuGpsQyTCdfzqA",
|
|
||||||
# "_score" : 1.0,
|
|
||||||
# "_source":{"log":"2014/09/25 22:45:50 Got request with path wombat\n",
|
|
||||||
# "stream":"stderr","tag":"docker.container.all",
|
|
||||||
# "@timestamp":"2014-09-25T22:45:50+00:00"}
|
|
||||||
# },
|
|
||||||
# ...
|
|
||||||
#
|
|
||||||
# The Kubernetes fluentd plugin is used to write the Kubernetes metadata to the log
|
|
||||||
# record & add labels to the log record if properly configured. This enables users
|
|
||||||
# to filter & search logs on any metadata.
|
|
||||||
# For example a Docker container's logs might be in the directory:
|
|
||||||
#
|
|
||||||
# /var/lib/docker/containers/997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b
|
|
||||||
#
|
|
||||||
# and in the file:
|
|
||||||
#
|
|
||||||
# 997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b-json.log
|
|
||||||
#
|
|
||||||
# where 997599971ee6... is the Docker ID of the running container.
|
|
||||||
# The Kubernetes kubelet makes a symbolic link to this file on the host machine
|
|
||||||
# in the /var/log/containers directory which includes the pod name and the Kubernetes
|
|
||||||
# container name:
|
|
||||||
#
|
|
||||||
# synthetic-logger-0.25lps-pod_default_synth-lgr-997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b.log
|
|
||||||
# ->
|
|
||||||
# /var/lib/docker/containers/997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b/997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b-json.log
|
|
||||||
#
|
|
||||||
# The /var/log directory on the host is mapped to the /var/log directory in the container
|
|
||||||
# running this instance of Fluentd and we end up collecting the file:
|
|
||||||
#
|
|
||||||
# /var/log/containers/synthetic-logger-0.25lps-pod_default_synth-lgr-997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b.log
|
|
||||||
#
|
|
||||||
# This results in the tag:
|
|
||||||
#
|
|
||||||
# var.log.containers.synthetic-logger-0.25lps-pod_default_synth-lgr-997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b.log
|
|
||||||
#
|
|
||||||
# The Kubernetes fluentd plugin is used to extract the namespace, pod name & container name
|
|
||||||
# which are added to the log message as a kubernetes field object & the Docker container ID
|
|
||||||
# is also added under the docker field object.
|
|
||||||
# The final tag is:
|
|
||||||
#
|
|
||||||
# kubernetes.var.log.containers.synthetic-logger-0.25lps-pod_default_synth-lgr-997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b.log
|
|
||||||
#
|
|
||||||
# And the final log record look like:
|
|
||||||
#
|
|
||||||
# {
|
|
||||||
# "log":"2014/09/25 21:15:03 Got request with path wombat\n",
|
|
||||||
# "stream":"stderr",
|
|
||||||
# "time":"2014-09-25T21:15:03.499185026Z",
|
|
||||||
# "kubernetes": {
|
|
||||||
# "namespace": "default",
|
|
||||||
# "pod_name": "synthetic-logger-0.25lps-pod",
|
|
||||||
# "container_name": "synth-lgr"
|
|
||||||
# },
|
|
||||||
# "docker": {
|
|
||||||
# "container_id": "997599971ee6366d4a5920d25b79286ad45ff37a74494f262e3bc98d909d0a7b"
|
|
||||||
# }
|
|
||||||
# }
|
|
||||||
#
|
|
||||||
# This makes it easier for users to search for logs by pod name or by
|
|
||||||
# the name of the Kubernetes container regardless of how many times the
|
|
||||||
# Kubernetes pod has been restarted (resulting in a several Docker container IDs).
|
|
||||||
|
|
||||||
# Json Log Example:
|
|
||||||
# {"log":"[info:2016-02-16T16:04:05.930-08:00] Some log text here\n","stream":"stdout","time":"2016-02-17T00:04:05.931087621Z"}
|
|
||||||
# CRI Log Example:
|
|
||||||
# 2016-02-17T00:04:05.931087621Z stdout F [info:2016-02-16T16:04:05.930-08:00] Some log text here
|
|
||||||
<source>
|
|
||||||
@id fluentd-containers.log
|
|
||||||
@type tail
|
|
||||||
path /var/log/containers/*.log
|
|
||||||
pos_file /var/log/es-containers.log.pos
|
|
||||||
tag raw.kubernetes.*
|
|
||||||
read_from_head true
|
|
||||||
<parse>
|
|
||||||
@type multi_format
|
|
||||||
<pattern>
|
|
||||||
format json
|
|
||||||
time_key time
|
|
||||||
time_format %Y-%m-%dT%H:%M:%S.%NZ
|
|
||||||
</pattern>
|
|
||||||
<pattern>
|
|
||||||
format /^(?<time>.+) (?<stream>stdout|stderr) [^ ]* (?<log>.*)$/
|
|
||||||
time_format %Y-%m-%dT%H:%M:%S.%N%:z
|
|
||||||
</pattern>
|
|
||||||
</parse>
|
|
||||||
</source>
|
|
||||||
|
|
||||||
# Detect exceptions in the log output and forward them as one log entry.
|
|
||||||
<match raw.kubernetes.**>
|
|
||||||
@id raw.kubernetes
|
|
||||||
@type detect_exceptions
|
|
||||||
remove_tag_prefix raw
|
|
||||||
message log
|
|
||||||
stream stream
|
|
||||||
multiline_flush_interval 5
|
|
||||||
max_bytes 500000
|
|
||||||
max_lines 1000
|
|
||||||
</match>
|
|
||||||
|
|
||||||
# Concatenate multi-line logs
|
|
||||||
<filter **>
|
|
||||||
@id filter_concat
|
|
||||||
@type concat
|
|
||||||
key message
|
|
||||||
multiline_end_regexp /\n$/
|
|
||||||
separator ""
|
|
||||||
</filter>
|
|
||||||
|
|
||||||
# Enriches records with Kubernetes metadata
|
|
||||||
<filter kubernetes.**>
|
|
||||||
@id filter_kubernetes_metadata
|
|
||||||
@type kubernetes_metadata
|
|
||||||
</filter>
|
|
||||||
|
|
||||||
# Fixes json fields in Elasticsearch
|
|
||||||
<filter kubernetes.**>
|
|
||||||
@id filter_parser
|
|
||||||
@type parser
|
|
||||||
key_name log
|
|
||||||
reserve_data true
|
|
||||||
remove_key_name_field true
|
|
||||||
<parse>
|
|
||||||
@type multi_format
|
|
||||||
<pattern>
|
|
||||||
format json
|
|
||||||
</pattern>
|
|
||||||
<pattern>
|
|
||||||
format none
|
|
||||||
</pattern>
|
|
||||||
</parse>
|
|
||||||
</filter>
|
|
||||||
|
|
||||||
system.input.conf: |-
|
|
||||||
# Example:
|
|
||||||
# 2015-12-21 23:17:22,066 [salt.state ][INFO ] Completed state [net.ipv4.ip_forward] at time 23:17:22.066081
|
|
||||||
<source>
|
|
||||||
@id minion
|
|
||||||
@type tail
|
|
||||||
format /^(?<time>[^ ]* [^ ,]*)[^\[]*\[[^\]]*\]\[(?<severity>[^ \]]*) *\] (?<message>.*)$/
|
|
||||||
time_format %Y-%m-%d %H:%M:%S
|
|
||||||
path /var/log/salt/minion
|
|
||||||
pos_file /var/log/salt.pos
|
|
||||||
tag salt
|
|
||||||
</source>
|
|
||||||
|
|
||||||
# Example:
|
|
||||||
# Dec 21 23:17:22 gke-foo-1-1-4b5cbd14-node-4eoj startupscript: Finished running startup script /var/run/google.startup.script
|
|
||||||
<source>
|
|
||||||
@id startupscript.log
|
|
||||||
@type tail
|
|
||||||
format syslog
|
|
||||||
path /var/log/startupscript.log
|
|
||||||
pos_file /var/log/es-startupscript.log.pos
|
|
||||||
tag startupscript
|
|
||||||
</source>
|
|
||||||
|
|
||||||
# Examples:
|
|
||||||
# time="2016-02-04T06:51:03.053580605Z" level=info msg="GET /containers/json"
|
|
||||||
# time="2016-02-04T07:53:57.505612354Z" level=error msg="HTTP Error" err="No such image: -f" statusCode=404
|
|
||||||
# TODO(random-liu): Remove this after cri container runtime rolls out.
|
|
||||||
<source>
|
|
||||||
@id docker.log
|
|
||||||
@type tail
|
|
||||||
format /^time="(?<time>[^"]*)" level=(?<severity>[^ ]*) msg="(?<message>[^"]*)"( err="(?<error>[^"]*)")?( statusCode=($<status_code>\d+))?/
|
|
||||||
path /var/log/docker.log
|
|
||||||
pos_file /var/log/es-docker.log.pos
|
|
||||||
tag docker
|
|
||||||
</source>
|
|
||||||
|
|
||||||
# Example:
|
|
||||||
# 2016/02/04 06:52:38 filePurge: successfully removed file /var/etcd/data/member/wal/00000000000006d0-00000000010a23d1.wal
|
|
||||||
<source>
|
|
||||||
@id etcd.log
|
|
||||||
@type tail
|
|
||||||
# Not parsing this, because it doesn't have anything particularly useful to
|
|
||||||
# parse out of it (like severities).
|
|
||||||
format none
|
|
||||||
path /var/log/etcd.log
|
|
||||||
pos_file /var/log/es-etcd.log.pos
|
|
||||||
tag etcd
|
|
||||||
</source>
|
|
||||||
|
|
||||||
# Multi-line parsing is required for all the kube logs because very large log
|
|
||||||
# statements, such as those that include entire object bodies, get split into
|
|
||||||
# multiple lines by glog.
|
|
||||||
|
|
||||||
# Example:
|
|
||||||
# I0204 07:32:30.020537 3368 server.go:1048] POST /stats/container/: (13.972191ms) 200 [[Go-http-client/1.1] 10.244.1.3:40537]
|
|
||||||
<source>
|
|
||||||
@id kubelet.log
|
|
||||||
@type tail
|
|
||||||
format multiline
|
|
||||||
multiline_flush_interval 5s
|
|
||||||
format_firstline /^\w\d{4}/
|
|
||||||
format1 /^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source>[^ \]]+)\] (?<message>.*)/
|
|
||||||
time_format %m%d %H:%M:%S.%N
|
|
||||||
path /var/log/kubelet.log
|
|
||||||
pos_file /var/log/es-kubelet.log.pos
|
|
||||||
tag kubelet
|
|
||||||
</source>
|
|
||||||
|
|
||||||
# Example:
|
|
||||||
# I1118 21:26:53.975789 6 proxier.go:1096] Port "nodePort for kube-system/default-http-backend:http" (:31429/tcp) was open before and is still needed
|
|
||||||
<source>
|
|
||||||
@id kube-proxy.log
|
|
||||||
@type tail
|
|
||||||
format multiline
|
|
||||||
multiline_flush_interval 5s
|
|
||||||
format_firstline /^\w\d{4}/
|
|
||||||
format1 /^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source>[^ \]]+)\] (?<message>.*)/
|
|
||||||
time_format %m%d %H:%M:%S.%N
|
|
||||||
path /var/log/kube-proxy.log
|
|
||||||
pos_file /var/log/es-kube-proxy.log.pos
|
|
||||||
tag kube-proxy
|
|
||||||
</source>
|
|
||||||
|
|
||||||
# Example:
|
|
||||||
# I0204 07:00:19.604280 5 handlers.go:131] GET /api/v1/nodes: (1.624207ms) 200 [[kube-controller-manager/v1.1.3 (linux/amd64) kubernetes/6a81b50] 127.0.0.1:38266]
|
|
||||||
<source>
|
|
||||||
@id kube-apiserver.log
|
|
||||||
@type tail
|
|
||||||
format multiline
|
|
||||||
multiline_flush_interval 5s
|
|
||||||
format_firstline /^\w\d{4}/
|
|
||||||
format1 /^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source>[^ \]]+)\] (?<message>.*)/
|
|
||||||
time_format %m%d %H:%M:%S.%N
|
|
||||||
path /var/log/kube-apiserver.log
|
|
||||||
pos_file /var/log/es-kube-apiserver.log.pos
|
|
||||||
tag kube-apiserver
|
|
||||||
</source>
|
|
||||||
|
|
||||||
# Example:
|
|
||||||
# I0204 06:55:31.872680 5 servicecontroller.go:277] LB already exists and doesn't need update for service kube-system/kube-ui
|
|
||||||
<source>
|
|
||||||
@id kube-controller-manager.log
|
|
||||||
@type tail
|
|
||||||
format multiline
|
|
||||||
multiline_flush_interval 5s
|
|
||||||
format_firstline /^\w\d{4}/
|
|
||||||
format1 /^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source>[^ \]]+)\] (?<message>.*)/
|
|
||||||
time_format %m%d %H:%M:%S.%N
|
|
||||||
path /var/log/kube-controller-manager.log
|
|
||||||
pos_file /var/log/es-kube-controller-manager.log.pos
|
|
||||||
tag kube-controller-manager
|
|
||||||
</source>
|
|
||||||
|
|
||||||
# Example:
|
|
||||||
# W0204 06:49:18.239674 7 reflector.go:245] pkg/scheduler/factory/factory.go:193: watch of *api.Service ended with: 401: The event in requested index is outdated and cleared (the requested history has been cleared [2578313/2577886]) [2579312]
|
|
||||||
<source>
|
|
||||||
@id kube-scheduler.log
|
|
||||||
@type tail
|
|
||||||
format multiline
|
|
||||||
multiline_flush_interval 5s
|
|
||||||
format_firstline /^\w\d{4}/
|
|
||||||
format1 /^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source>[^ \]]+)\] (?<message>.*)/
|
|
||||||
time_format %m%d %H:%M:%S.%N
|
|
||||||
path /var/log/kube-scheduler.log
|
|
||||||
pos_file /var/log/es-kube-scheduler.log.pos
|
|
||||||
tag kube-scheduler
|
|
||||||
</source>
|
|
||||||
|
|
||||||
# Example:
|
|
||||||
# I0603 15:31:05.793605 6 cluster_manager.go:230] Reading config from path /etc/gce.conf
|
|
||||||
<source>
|
|
||||||
@id glbc.log
|
|
||||||
@type tail
|
|
||||||
format multiline
|
|
||||||
multiline_flush_interval 5s
|
|
||||||
format_firstline /^\w\d{4}/
|
|
||||||
format1 /^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source>[^ \]]+)\] (?<message>.*)/
|
|
||||||
time_format %m%d %H:%M:%S.%N
|
|
||||||
path /var/log/glbc.log
|
|
||||||
pos_file /var/log/es-glbc.log.pos
|
|
||||||
tag glbc
|
|
||||||
</source>
|
|
||||||
|
|
||||||
# Example:
|
|
||||||
# I0603 15:31:05.793605 6 cluster_manager.go:230] Reading config from path /etc/gce.conf
|
|
||||||
<source>
|
|
||||||
@id cluster-autoscaler.log
|
|
||||||
@type tail
|
|
||||||
format multiline
|
|
||||||
multiline_flush_interval 5s
|
|
||||||
format_firstline /^\w\d{4}/
|
|
||||||
format1 /^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source>[^ \]]+)\] (?<message>.*)/
|
|
||||||
time_format %m%d %H:%M:%S.%N
|
|
||||||
path /var/log/cluster-autoscaler.log
|
|
||||||
pos_file /var/log/es-cluster-autoscaler.log.pos
|
|
||||||
tag cluster-autoscaler
|
|
||||||
</source>
|
|
||||||
|
|
||||||
# Logs from systemd-journal for interesting services.
|
|
||||||
# TODO(random-liu): Remove this after cri container runtime rolls out.
|
|
||||||
<source>
|
|
||||||
@id journald-docker
|
|
||||||
@type systemd
|
|
||||||
matches [{ "_SYSTEMD_UNIT": "docker.service" }]
|
|
||||||
<storage>
|
|
||||||
@type local
|
|
||||||
persistent true
|
|
||||||
path /var/log/journald-docker.pos
|
|
||||||
</storage>
|
|
||||||
read_from_head true
|
|
||||||
tag docker
|
|
||||||
</source>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
@id journald-container-runtime
|
|
||||||
@type systemd
|
|
||||||
matches [{ "_SYSTEMD_UNIT": "{{ fluentd_container_runtime_service }}.service" }]
|
|
||||||
<storage>
|
|
||||||
@type local
|
|
||||||
persistent true
|
|
||||||
path /var/log/journald-container-runtime.pos
|
|
||||||
</storage>
|
|
||||||
read_from_head true
|
|
||||||
tag container-runtime
|
|
||||||
</source>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
@id journald-kubelet
|
|
||||||
@type systemd
|
|
||||||
matches [{ "_SYSTEMD_UNIT": "kubelet.service" }]
|
|
||||||
<storage>
|
|
||||||
@type local
|
|
||||||
persistent true
|
|
||||||
path /var/log/journald-kubelet.pos
|
|
||||||
</storage>
|
|
||||||
read_from_head true
|
|
||||||
tag kubelet
|
|
||||||
</source>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
@id journald-node-problem-detector
|
|
||||||
@type systemd
|
|
||||||
matches [{ "_SYSTEMD_UNIT": "node-problem-detector.service" }]
|
|
||||||
<storage>
|
|
||||||
@type local
|
|
||||||
persistent true
|
|
||||||
path /var/log/journald-node-problem-detector.pos
|
|
||||||
</storage>
|
|
||||||
read_from_head true
|
|
||||||
tag node-problem-detector
|
|
||||||
</source>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
@id kernel
|
|
||||||
@type systemd
|
|
||||||
matches [{ "_TRANSPORT": "kernel" }]
|
|
||||||
<storage>
|
|
||||||
@type local
|
|
||||||
persistent true
|
|
||||||
path /var/log/kernel.pos
|
|
||||||
</storage>
|
|
||||||
<entry>
|
|
||||||
fields_strip_underscores true
|
|
||||||
fields_lowercase true
|
|
||||||
</entry>
|
|
||||||
read_from_head true
|
|
||||||
tag kernel
|
|
||||||
</source>
|
|
||||||
|
|
||||||
forward.input.conf: |-
|
|
||||||
# Takes the messages sent over TCP
|
|
||||||
<source>
|
|
||||||
@id forward
|
|
||||||
@type forward
|
|
||||||
</source>
|
|
||||||
|
|
||||||
monitoring.conf: |-
|
|
||||||
# Prometheus Exporter Plugin
|
|
||||||
# input plugin that exports metrics
|
|
||||||
<source>
|
|
||||||
@id prometheus
|
|
||||||
@type prometheus
|
|
||||||
</source>
|
|
||||||
|
|
||||||
<source>
|
|
||||||
@id monitor_agent
|
|
||||||
@type monitor_agent
|
|
||||||
</source>
|
|
||||||
|
|
||||||
# input plugin that collects metrics from MonitorAgent
|
|
||||||
<source>
|
|
||||||
@id prometheus_monitor
|
|
||||||
@type prometheus_monitor
|
|
||||||
<labels>
|
|
||||||
host ${hostname}
|
|
||||||
</labels>
|
|
||||||
</source>
|
|
||||||
|
|
||||||
# input plugin that collects metrics for output plugin
|
|
||||||
<source>
|
|
||||||
@id prometheus_output_monitor
|
|
||||||
@type prometheus_output_monitor
|
|
||||||
<labels>
|
|
||||||
host ${hostname}
|
|
||||||
</labels>
|
|
||||||
</source>
|
|
||||||
|
|
||||||
# input plugin that collects metrics for in_tail plugin
|
|
||||||
<source>
|
|
||||||
@id prometheus_tail_monitor
|
|
||||||
@type prometheus_tail_monitor
|
|
||||||
<labels>
|
|
||||||
host ${hostname}
|
|
||||||
</labels>
|
|
||||||
</source>
|
|
||||||
|
|
||||||
output.conf: |-
|
|
||||||
<match **>
|
|
||||||
@id elasticsearch
|
|
||||||
@type elasticsearch
|
|
||||||
@log_level info
|
|
||||||
type_name _doc
|
|
||||||
include_tag_key true
|
|
||||||
host elasticsearch-logging
|
|
||||||
port 9200
|
|
||||||
logstash_format true
|
|
||||||
<buffer>
|
|
||||||
@type file
|
|
||||||
path /var/log/fluentd-buffers/kubernetes.system.buffer
|
|
||||||
flush_mode interval
|
|
||||||
retry_type exponential_backoff
|
|
||||||
flush_thread_count 2
|
|
||||||
flush_interval 5s
|
|
||||||
retry_forever
|
|
||||||
retry_max_interval 30
|
|
||||||
chunk_limit_size 2M
|
|
||||||
total_limit_size 500M
|
|
||||||
overflow_action block
|
|
||||||
</buffer>
|
|
||||||
</match>
|
|
@ -1,114 +0,0 @@
|
|||||||
apiVersion: v1
|
|
||||||
kind: ServiceAccount
|
|
||||||
metadata:
|
|
||||||
name: fluentd-es
|
|
||||||
namespace: logging
|
|
||||||
labels:
|
|
||||||
k8s-app: fluentd-es
|
|
||||||
addonmanager.kubernetes.io/mode: Reconcile
|
|
||||||
---
|
|
||||||
kind: ClusterRole
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: fluentd-es
|
|
||||||
labels:
|
|
||||||
k8s-app: fluentd-es
|
|
||||||
addonmanager.kubernetes.io/mode: Reconcile
|
|
||||||
rules:
|
|
||||||
- apiGroups:
|
|
||||||
- ""
|
|
||||||
resources:
|
|
||||||
- "namespaces"
|
|
||||||
- "pods"
|
|
||||||
verbs:
|
|
||||||
- "get"
|
|
||||||
- "watch"
|
|
||||||
- "list"
|
|
||||||
---
|
|
||||||
kind: ClusterRoleBinding
|
|
||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
metadata:
|
|
||||||
name: fluentd-es
|
|
||||||
labels:
|
|
||||||
k8s-app: fluentd-es
|
|
||||||
addonmanager.kubernetes.io/mode: Reconcile
|
|
||||||
subjects:
|
|
||||||
- kind: ServiceAccount
|
|
||||||
name: fluentd-es
|
|
||||||
namespace: logging
|
|
||||||
apiGroup: ""
|
|
||||||
roleRef:
|
|
||||||
kind: ClusterRole
|
|
||||||
name: fluentd-es
|
|
||||||
apiGroup: ""
|
|
||||||
---
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: DaemonSet
|
|
||||||
metadata:
|
|
||||||
name: fluentd-es-v3.1.1
|
|
||||||
namespace: logging
|
|
||||||
labels:
|
|
||||||
k8s-app: fluentd-es
|
|
||||||
version: v3.1.1
|
|
||||||
addonmanager.kubernetes.io/mode: Reconcile
|
|
||||||
spec:
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
k8s-app: fluentd-es
|
|
||||||
version: v3.1.1
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
k8s-app: fluentd-es
|
|
||||||
version: v3.1.1
|
|
||||||
spec:
|
|
||||||
securityContext:
|
|
||||||
seccompProfile:
|
|
||||||
type: RuntimeDefault
|
|
||||||
priorityClassName: system-node-critical
|
|
||||||
serviceAccountName: fluentd-es
|
|
||||||
containers:
|
|
||||||
- name: fluentd-es
|
|
||||||
image: quay.io/fluentd_elasticsearch/fluentd:v3.1.0
|
|
||||||
env:
|
|
||||||
- name: FLUENTD_ARGS
|
|
||||||
value: --no-supervisor -q
|
|
||||||
resources:
|
|
||||||
limits:
|
|
||||||
memory: 500Mi
|
|
||||||
requests:
|
|
||||||
cpu: 100m
|
|
||||||
memory: 200Mi
|
|
||||||
volumeMounts:
|
|
||||||
- name: varlog
|
|
||||||
mountPath: /var/log
|
|
||||||
- name: varlibdockercontainers
|
|
||||||
mountPath: /var/lib/docker/containers
|
|
||||||
readOnly: true
|
|
||||||
- name: config-volume
|
|
||||||
mountPath: /etc/fluent/config.d
|
|
||||||
ports:
|
|
||||||
- containerPort: 24231
|
|
||||||
name: prometheus
|
|
||||||
protocol: TCP
|
|
||||||
livenessProbe:
|
|
||||||
tcpSocket:
|
|
||||||
port: prometheus
|
|
||||||
initialDelaySeconds: 5
|
|
||||||
timeoutSeconds: 10
|
|
||||||
readinessProbe:
|
|
||||||
tcpSocket:
|
|
||||||
port: prometheus
|
|
||||||
initialDelaySeconds: 5
|
|
||||||
timeoutSeconds: 10
|
|
||||||
terminationGracePeriodSeconds: 30
|
|
||||||
volumes:
|
|
||||||
- name: varlog
|
|
||||||
hostPath:
|
|
||||||
path: /var/log
|
|
||||||
- name: varlibdockercontainers
|
|
||||||
hostPath:
|
|
||||||
path: /var/lib/docker/containers
|
|
||||||
- name: config-volume
|
|
||||||
configMap:
|
|
||||||
name: fluentd-es-config-v0.2.1
|
|
@ -1,69 +0,0 @@
|
|||||||
# Copyright 2017 The Kubernetes Authors.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
# This Dockerfile will build an image that is configured
|
|
||||||
# to run Fluentd with an Elasticsearch plug-in and the
|
|
||||||
# provided configuration file.
|
|
||||||
# The image acts as an executable for the binary /usr/sbin/td-agent.
|
|
||||||
# Note that fluentd is run with root permission to allow access to
|
|
||||||
# log files with root only access under /var/log/containers/*
|
|
||||||
|
|
||||||
# 1. Install & configure dependencies.
|
|
||||||
# 2. Install fluentd via ruby.
|
|
||||||
# 3. Remove build dependencies.
|
|
||||||
# 4. Cleanup leftover caches & files.
|
|
||||||
|
|
||||||
FROM ruby:2.7-slim-buster as builder
|
|
||||||
|
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
|
||||||
|
|
||||||
COPY Gemfile /Gemfile
|
|
||||||
|
|
||||||
SHELL ["/bin/bash", "-e", "-o", "pipefail", "-c"]
|
|
||||||
|
|
||||||
# hadolint ignore=DL3008,DL3028
|
|
||||||
RUN apt-get update && \
|
|
||||||
apt-get install -y --no-install-recommends g++ gcc make && \
|
|
||||||
rm -rf /var/lib/apt/lists/* && \
|
|
||||||
echo 'gem: --no-document' >> /etc/gemrc && \
|
|
||||||
gem install --file Gemfile
|
|
||||||
|
|
||||||
FROM ruby:2.7-slim-buster
|
|
||||||
|
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
|
||||||
|
|
||||||
# Copy the Fluentd configuration file for logging Docker container logs.
|
|
||||||
COPY fluent.conf /etc/fluent/fluent.conf
|
|
||||||
COPY entrypoint.sh /entrypoint.sh
|
|
||||||
COPY --from=builder /usr/local/bundle/ /usr/local/bundle
|
|
||||||
|
|
||||||
SHELL ["/bin/bash", "-e", "-o", "pipefail", "-c"]
|
|
||||||
|
|
||||||
# hadolint ignore=DL3008
|
|
||||||
RUN apt-get update && \
|
|
||||||
apt-get install -y --no-install-recommends libjemalloc2 && \
|
|
||||||
apt-get clean -y && \
|
|
||||||
ulimit -n 65536 && \
|
|
||||||
rm -rf \
|
|
||||||
/var/cache/debconf/* \
|
|
||||||
/var/lib/apt/lists/* \
|
|
||||||
/var/log/* \
|
|
||||||
/var/tmp/* \
|
|
||||||
rm -rf /tmp/*
|
|
||||||
|
|
||||||
# Expose prometheus metrics.
|
|
||||||
EXPOSE 80
|
|
||||||
|
|
||||||
# Start Fluentd to pick up our config that watches Docker container logs.
|
|
||||||
CMD ["/entrypoint.sh"]
|
|
@ -1,13 +0,0 @@
|
|||||||
source 'https://rubygems.org'
|
|
||||||
|
|
||||||
gem 'activesupport', '6.1.1'
|
|
||||||
gem 'elasticsearch-xpack', '7.10.1'
|
|
||||||
gem 'fluentd', '1.12.0'
|
|
||||||
gem 'fluent-plugin-concat', '2.4.0'
|
|
||||||
gem 'fluent-plugin-detect-exceptions', '0.0.13'
|
|
||||||
gem 'fluent-plugin-elasticsearch', '4.3.3'
|
|
||||||
gem 'fluent-plugin-kubernetes_metadata_filter', '2.6.0'
|
|
||||||
gem 'fluent-plugin-multi-format-parser', '1.0.0'
|
|
||||||
gem 'fluent-plugin-prometheus', '1.8.5'
|
|
||||||
gem 'fluent-plugin-systemd', '1.0.2'
|
|
||||||
gem 'oj', '3.11.0'
|
|
@ -1,27 +0,0 @@
|
|||||||
# Copyright 2017 The Kubernetes Authors.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
.PHONY: build push
|
|
||||||
|
|
||||||
PREFIX = quay.io/fluentd_elasticsearch
|
|
||||||
IMAGE = fluentd
|
|
||||||
TAG = v3.2.0
|
|
||||||
|
|
||||||
build:
|
|
||||||
docker build --tag ${PREFIX}/${IMAGE}:${TAG} .
|
|
||||||
docker build --tag ${PREFIX}/${IMAGE}:latest .
|
|
||||||
|
|
||||||
push:
|
|
||||||
docker push ${PREFIX}/${IMAGE}:${TAG}
|
|
||||||
docker push ${PREFIX}/${IMAGE}:latest
|
|
@ -1,12 +0,0 @@
|
|||||||
# Collecting Docker Log Files with Fluentd and Elasticsearch
|
|
||||||
This directory contains the source files needed to make a Docker image
|
|
||||||
that collects Docker container log files using [Fluentd][fluentd]
|
|
||||||
and sends them to an instance of [Elasticsearch][elasticsearch].
|
|
||||||
This image is designed to be used as part of the [Kubernetes][kubernetes]
|
|
||||||
cluster bring up process. The image resides at Quay under the name
|
|
||||||
[quay.io/fluentd_elasticsearch/fluentd][image].
|
|
||||||
|
|
||||||
[fluentd]: http://www.fluentd.org/
|
|
||||||
[elasticsearch]: https://www.elastic.co/products/elasticsearch
|
|
||||||
[kubernetes]: https://kubernetes.io
|
|
||||||
[image]: https://quay.io/repository/fluentd_elasticsearch/fluentd?tab=tags
|
|
@ -1,44 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Copyright 2017 The Kubernetes Authors.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
# These steps must be executed once the host /var and /lib volumes have
|
|
||||||
# been mounted, and therefore cannot be done in the docker build stage.
|
|
||||||
|
|
||||||
# For systems without journald
|
|
||||||
mkdir -p /var/log/journal
|
|
||||||
|
|
||||||
# set ld preload
|
|
||||||
if dpkg --print-architecture | grep -q amd64;then
|
|
||||||
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2
|
|
||||||
else
|
|
||||||
export LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libjemalloc.so.2
|
|
||||||
fi
|
|
||||||
|
|
||||||
# For disabling elasticsearch ruby client sniffering feature.
|
|
||||||
# Because, on k8s, sniffering feature sometimes causes failed to flush buffers error
|
|
||||||
# due to between service name and ip address glitch.
|
|
||||||
# And this should be needed for downstream helm chart configurations
|
|
||||||
# for sniffer_class_name parameter.
|
|
||||||
SIMPLE_SNIFFER=$( gem contents fluent-plugin-elasticsearch | grep elasticsearch_simple_sniffer.rb )
|
|
||||||
if [ -n "$SIMPLE_SNIFFER" ] && [ -f "$SIMPLE_SNIFFER" ] ; then
|
|
||||||
FLUENTD_ARGS="$FLUENTD_ARGS -r $SIMPLE_SNIFFER"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Use exec to get the signal
|
|
||||||
# A non-quoted string and add the comment to prevent shellcheck failures on this line.
|
|
||||||
# See https://github.com/koalaman/shellcheck/wiki/SC2086
|
|
||||||
# shellcheck disable=SC2086
|
|
||||||
exec /usr/local/bundle/bin/fluentd $FLUENTD_ARGS
|
|
@ -1,10 +0,0 @@
|
|||||||
# This is the root config file, which only includes components of the actual configuration
|
|
||||||
|
|
||||||
# Do not collect fluentd's own logs to avoid infinite loops.
|
|
||||||
<label @FLUENT_LOG>
|
|
||||||
<match fluent.*>
|
|
||||||
@type stdout
|
|
||||||
</match>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
@include /etc/fluent/config.d/*.conf
|
|
@ -1,55 +0,0 @@
|
|||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
name: kibana-logging
|
|
||||||
namespace: logging
|
|
||||||
labels:
|
|
||||||
k8s-app: kibana-logging
|
|
||||||
addonmanager.kubernetes.io/mode: Reconcile
|
|
||||||
spec:
|
|
||||||
replicas: 1
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
k8s-app: kibana-logging
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
k8s-app: kibana-logging
|
|
||||||
spec:
|
|
||||||
securityContext:
|
|
||||||
seccompProfile:
|
|
||||||
type: RuntimeDefault
|
|
||||||
containers:
|
|
||||||
- name: kibana-logging
|
|
||||||
image: docker.elastic.co/kibana/kibana-oss:7.10.2
|
|
||||||
resources:
|
|
||||||
# need more cpu upon initialization, therefore burstable class
|
|
||||||
limits:
|
|
||||||
cpu: 1000m
|
|
||||||
requests:
|
|
||||||
cpu: 100m
|
|
||||||
env:
|
|
||||||
- name: ELASTICSEARCH_HOSTS
|
|
||||||
value: http://elasticsearch-logging:9200
|
|
||||||
- name: SERVER_NAME
|
|
||||||
value: kibana-logging
|
|
||||||
- name: SERVER_BASEPATH
|
|
||||||
value: /api/v1/namespaces/logging/services/kibana-logging/proxy
|
|
||||||
- name: SERVER_REWRITEBASEPATH
|
|
||||||
value: "false"
|
|
||||||
ports:
|
|
||||||
- containerPort: 5601
|
|
||||||
name: ui
|
|
||||||
protocol: TCP
|
|
||||||
livenessProbe:
|
|
||||||
httpGet:
|
|
||||||
path: /api/status
|
|
||||||
port: ui
|
|
||||||
initialDelaySeconds: 5
|
|
||||||
timeoutSeconds: 10
|
|
||||||
readinessProbe:
|
|
||||||
httpGet:
|
|
||||||
path: /api/status
|
|
||||||
port: ui
|
|
||||||
initialDelaySeconds: 5
|
|
||||||
timeoutSeconds: 10
|
|
@ -1,17 +0,0 @@
|
|||||||
apiVersion: v1
|
|
||||||
kind: Service
|
|
||||||
metadata:
|
|
||||||
name: kibana-logging
|
|
||||||
namespace: logging
|
|
||||||
labels:
|
|
||||||
k8s-app: kibana-logging
|
|
||||||
kubernetes.io/cluster-service: "true"
|
|
||||||
addonmanager.kubernetes.io/mode: Reconcile
|
|
||||||
kubernetes.io/name: "Kibana"
|
|
||||||
spec:
|
|
||||||
ports:
|
|
||||||
- port: 5601
|
|
||||||
protocol: TCP
|
|
||||||
targetPort: ui
|
|
||||||
selector:
|
|
||||||
k8s-app: kibana-logging
|
|
@ -1,15 +0,0 @@
|
|||||||
apiVersion: rbac.authorization.k8s.io/v1
|
|
||||||
kind: RoleBinding
|
|
||||||
metadata:
|
|
||||||
name: gce:podsecuritypolicy:elasticsearch-logging
|
|
||||||
namespace: kube-system
|
|
||||||
labels:
|
|
||||||
addonmanager.kubernetes.io/mode: Reconcile
|
|
||||||
roleRef:
|
|
||||||
apiGroup: rbac.authorization.k8s.io
|
|
||||||
kind: ClusterRole
|
|
||||||
name: gce:podsecuritypolicy:privileged
|
|
||||||
subjects:
|
|
||||||
- kind: ServiceAccount
|
|
||||||
name: elasticsearch-logging
|
|
||||||
namespace: kube-system
|
|
@ -244,7 +244,7 @@ fi
|
|||||||
|
|
||||||
# Optional: Enable node logging.
|
# Optional: Enable node logging.
|
||||||
export ENABLE_NODE_LOGGING="${KUBE_ENABLE_NODE_LOGGING:-true}"
|
export ENABLE_NODE_LOGGING="${KUBE_ENABLE_NODE_LOGGING:-true}"
|
||||||
export LOGGING_DESTINATION="${KUBE_LOGGING_DESTINATION:-gcp}" # options: elasticsearch, gcp
|
export LOGGING_DESTINATION="${KUBE_LOGGING_DESTINATION:-gcp}" # options: gcp
|
||||||
|
|
||||||
# Optional: When set to true, Elasticsearch and Kibana will be setup as part of the cluster bring up.
|
# Optional: When set to true, Elasticsearch and Kibana will be setup as part of the cluster bring up.
|
||||||
export ENABLE_CLUSTER_LOGGING="${KUBE_ENABLE_CLUSTER_LOGGING:-true}"
|
export ENABLE_CLUSTER_LOGGING="${KUBE_ENABLE_CLUSTER_LOGGING:-true}"
|
||||||
|
@ -300,7 +300,7 @@ fi
|
|||||||
|
|
||||||
# Optional: Enable node logging.
|
# Optional: Enable node logging.
|
||||||
export ENABLE_NODE_LOGGING=${KUBE_ENABLE_NODE_LOGGING:-true}
|
export ENABLE_NODE_LOGGING=${KUBE_ENABLE_NODE_LOGGING:-true}
|
||||||
export LOGGING_DESTINATION=${KUBE_LOGGING_DESTINATION:-gcp} # options: elasticsearch, gcp
|
export LOGGING_DESTINATION=${KUBE_LOGGING_DESTINATION:-gcp} # options: gcp
|
||||||
|
|
||||||
# Optional: When set to true, Elasticsearch and Kibana will be setup as part of the cluster bring up.
|
# Optional: When set to true, Elasticsearch and Kibana will be setup as part of the cluster bring up.
|
||||||
export ENABLE_CLUSTER_LOGGING=${KUBE_ENABLE_CLUSTER_LOGGING:-true}
|
export ENABLE_CLUSTER_LOGGING=${KUBE_ENABLE_CLUSTER_LOGGING:-true}
|
||||||
|
@ -2816,9 +2816,9 @@ EOF
|
|||||||
if [[ "${ENABLE_NODE_LOGGING:-}" == "true" ]] && \
|
if [[ "${ENABLE_NODE_LOGGING:-}" == "true" ]] && \
|
||||||
[[ "${LOGGING_DESTINATION:-}" == "elasticsearch" ]] && \
|
[[ "${LOGGING_DESTINATION:-}" == "elasticsearch" ]] && \
|
||||||
[[ "${ENABLE_CLUSTER_LOGGING:-}" == "true" ]]; then
|
[[ "${ENABLE_CLUSTER_LOGGING:-}" == "true" ]]; then
|
||||||
setup-addon-manifests "addons" "fluentd-elasticsearch"
|
echo "fluentd-elasticsearch addon is no longer included here. Terminate cluster initialization."
|
||||||
local -r fluentd_es_configmap_yaml="${dst_dir}/fluentd-elasticsearch/fluentd-es-configmap.yaml"
|
echo "The addon can be installed from https://github.com/kubernetes-sigs/instrumentation-addons"
|
||||||
update-container-runtime ${fluentd_es_configmap_yaml}
|
exit 1
|
||||||
fi
|
fi
|
||||||
if [[ "${ENABLE_NODE_LOGGING:-}" == "true" ]] && \
|
if [[ "${ENABLE_NODE_LOGGING:-}" == "true" ]] && \
|
||||||
[[ "${LOGGING_DESTINATION:-}" == "gcp" ]]; then
|
[[ "${LOGGING_DESTINATION:-}" == "gcp" ]]; then
|
||||||
|
Loading…
Reference in New Issue
Block a user