如何将Kubernetes日志运送到外部Elasticsearch

时间:2020-02-23 14:31:50  来源:igfitidea点击:

在云中或者本地环境中设置Kubernetes集群后,将需要以一种轻松灵活的方式检查仓库中正在发生的事情。最好的方法之一是在需要修复或者了解特定时间发生的情况时调查日志。虽然可以登录到集群并检查Pod或者主机的日志,但是突然检查一下每个Pod的日志变得很麻烦,尤其是在k8中有许多Pod的情况下。为了使我们更轻松地在一个平台上检查集群的状态,我们将在外部服务器上部署Elasticsearch和Kibana,然后使用Elastics beats(Filebeat,Metricbeat等)将日志从集群发送到Elasticsearch。如果我们已经在运行ELK堆栈,那就更好了。

下图显示了我们将在本教程中完成的体系结构。它实质上是一个3节点的Kubernetes集群和一个Elasticsearch和Kibana服务器,它们将通过Filebeat和Metricbeat日志收集器从集群接收日志。

首先,我们将需要同时安装Kibana的Elasticsearch服务器。我们可以省去Logstash,但如果需要进一步过滤日志,则可以安装它。

在Elasticsearch主机上,确保可以从外部访问它。我们可以在配置中编辑以下部分

$sudo vim /etc/elasticsearch/elasticsearch.yml

# Set the bind address to a specific IP (IPv4 or IPv6):
#network.host: 0.0.0.0
## Set a custom port for HTTP:
#http.port: 9200
#```

然后在防火墙上允许该端口

``` sh
sudo firewall-cmd --permanent --add-port=9200/tcp
sudo firewall-cmd --reload

其次,我们必须拥有一个Kubernetes集群,因为它是我们关注从中获取日志的地方。我们有一些教程,可以进行设置,以防我们需要快速引导。它们在下面共享:

使用kubeadm在Ubuntu上安装Kubernetes集群

使用kubeadm在CentOS 7上安装Kubernetes集群

使用EKS轻松在AWS上设置Kubernetes集群

使用Ansible和Kubespray部署Kubernetes集群

使用Rancher RKE安装生产Kubernetes集群

准备就绪后,我们可以继续在集群中安装Filebeat和MetricbeatPod,以开始收集日志并将其发送到ELK。确保我们能够在Kubernetes集群中运行kubectl命令。

下载示例Filebeat和Metricbeat文件

登录到Kubernetes主节点并运行以下命令以获取Elastic提供的Filebeat和Metricbeat yaml文件。

cd ~
curl -L -O https://raw.githubusercontent.com/elastic/beats/7.9/deploy/kubernetes/filebeat-kubernetes.yaml
curl -L -O https://raw.githubusercontent.com/elastic/beats/7.9/deploy/kubernetes/metricbeat-kubernetes.yaml

编辑文件以适合环境

在这两个文件中,我们只需要更改一些内容。在ConfigMap下,我们将找到如下所示的elasticseach输出。将IP(192.168.10.123)和端口(9200)更改为Elasticsearch服务器的IP。

output.elasticsearch:
      hosts: ['${ELASTICSEARCH_HOST:192.168.10.123}:${ELASTICSEARCH_PORT:9200}']
      #username: ${ELASTICSEARCH_USERNAME}
      #password: ${ELASTICSEARCH_PASSWORD}

在同一文件中的DaemonSet下,我们将找到以下配置。请注意,我们正在显示要更改的区域。编辑IP(192.168.10.123)和端口(9200),使其也与Elastcsearch服务器的IP地址匹配。如果我们已经为Elasticsearch配置了用户名和密码,则可以在显示的注释部分中随意添加它们。

env:
        - name: ELASTICSEARCH_HOST
          value: "192.168.10.123"
        - name: ELASTICSEARCH_PORT
          value: "9200"
        #- name: ELASTICSEARCH_USERNAME
        #  value: elastic
        #- name: ELASTICSEARCH_PASSWORD
        #  value: changeme
        - name: ELASTIC_CLOUD_ID

应该注意的是,如果我们希望将Filebeat和Metricbeat资源部署在另一个名称空间上,只需将kube-system的所有实例编辑为我们选择的一个即可。

在"部署"下,我们可以通过编辑以下代码段上显示的镜像(docker.elastic.co/beats/metricbeat:7.9.0)来更改要部署的Filebeat和Metricbeat的版本。我将使用7.9.0版。

###For Metricbeat####
    spec:
      serviceAccountName: metricbeat
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      containers:
      - name: metricbeat
        image: docker.elastic.co/beats/metricbeat:7.9.0

如果我们也想更改其版本,请对filebeat yml文件执行相同的操作。

###For Filebeat####
    spec:
      serviceAccountName: metricbeat
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      containers:
      - name: metricbeat
        image: docker.elastic.co/beats/filebeat:7.9.0

重要注意事项

如果我们希望将节拍部署在主节点上,则我们将不得不添加公差。 metricbeat的示例如下所示。那不是整个DaemonSet配置。只是我们感兴趣的部分。我们可以完整保留其他部分。如以下规格下的配置所示,添加公差。根据需要,在文件拍配置中也可以使用相同的方法。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: metricbeat
  namespace: kube-system
  labels:
    k8s-app: metricbeat
spec:
  selector:
    matchLabels:
      k8s-app: metricbeat
  template:
    metadata:
      labels:
        k8s-app: metricbeat
    spec:
###PART TO EDIT###
      # This toleration is to have the daemonset runnable on master nodes
      # Remove it if your masters can't run pods
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
####END OF EDIT###
      serviceAccountName: metricbeat
      terminationGracePeriodSeconds: 30
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      containers:
      - name: metricbeat
        image: docker.elastic.co/beats/metricbeat:7.9.0
        args: [
          "-c", "/etc/metricbeat.yml",
          "-e",

部署到Kubernetes

完成所有编辑后,从Kubernetes集群可以很好地访问我们的Elasticsearch,现在该部署我们的节奏了。登录到主节点并运行以下命令:

kubectl apply -f metricbeat-kubernetes.yaml
kubectl apply -f filebeat-kubernetes.yaml

一段时间后,确认Pod已部署并成功运行。

$kubectl get pods -n kube-system

NAME                                             READY   STATUS    RESTARTS   AGE
calico-kube-controllers-c9784d67d-k85hf          1/1     Running   5          11d
calico-node-brjnk                                1/1     Running   7          10d
calico-node-nx869                                1/1     Running   1          10d
calico-node-whlzf                                1/1     Running   6          11d
coredns-f9fd979d6-6vztd                          1/1     Running   5          11d
coredns-f9fd979d6-8gz4l                          1/1     Running   5          11d
etcd-kmaster.diab.mfs.co.ke                      1/1     Running   5          11d
filebeat-hlzhc                                   1/1     Running   7          7d23h <==
filebeat-mcs67                                   1/1     Running   1          7d23h <==
kube-apiserver-kmaster.diab.mfs.co.ke            1/1     Running   5          11d
kube-controller-manager-kmaster.diab.mfs.co.ke   1/1     Running   5          11d
kube-proxy-nlrbv                                 1/1     Running   5          11d
kube-proxy-zdcbg                                 1/1     Running   1          10d
kube-proxy-zvf6c                                 1/1     Running   7          10d
kube-scheduler-kmaster.diab.mfs.co.ke            1/1     Running   5          11d
metricbeat-5fw98                                 1/1     Running   7          8d  <==
metricbeat-5zw9b                                 1/1     Running   0          8d  <==
metricbeat-jbppx                                 1/1     Running   1          8d  <==

在Kibana上创建索引

一旦我们的Pod开始运行,它们就会立即将索引模式与日志一起发送到Elasticsearch。登录到Kibana,然后单击堆栈管理>索引管理,我们应该能够看到索引。

点击索引管理

还有我们的索引。

要创建索引模式,请单击"索引模式",然后单击"创建索引模式"。

在下一页上,执行与filebeat或者metricbeat匹配的索引模式的名称,它们应该显示为已匹配。

创建模式,然后单击下一步

在下拉列表中选择@timestamp,然后创建索引模式

发现资料

创建索引模式后,点击发现,

然后选择我们创建的索引模式。