项目目标
在k8s上部署efk日志采集系统
项目拆解
1.镜像构建
a.elasticsearch
先使用命令获取es的arm版镜像,这里使用的es是7.3.2版本的
docker pull gagara/elasticsearch-oss-arm64:7.3.2
通过:
git clone https://github.com/kubernetes/kubernetes.git
下载代码,然后切换tag,切换到和k8s版本一致的tag v1.16.0
git checkout v1.16.0
然后进入上述目录的es-image目录下(目录为kubernetes/cluster/addons/fluentd-elasticsearch/),
修改Dockerfile文件中使用的es镜像为 gagara/elasticsearch-oss-arm64:7.3.2
然后修改Dockerfile中第一行golang的镜像(dockerfile中的版本没有arm的镜像)为1.15.0-alpine
FROM golang:1.12.0 AS builder---->FROM golang:1.15.0-alpine AS builder
由于go语言的mod被墙了,需要在dockerfiled的第二行新增两个环境变量:
ENV GOPROXY https://goproxy.io
ENV GO111MODULE on
然后修改当前目录下脚本elasticsearch_logging_discovery.go为下面这样:
/*
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 (
"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)
}