elk是elasticsearch,logstash,kibana的缩写,组成了日志收集的服务端。在看这篇文章,要先了解以下二篇文章:
ubuntu elasticsearch,logstash,kibana,filebeat安装配置
一,elk的选择
方案一,用k8s分别安装elasticsearch,logstash,kibana,配置要复杂一点,但是灵活度要高一点
方案二,用已集成好的elk来安装,这也本文采取的方式
[root@bigserver3 elk]# docker search elk NAME DESCRIPTION STARS OFFICIAL AUTOMATED sebp/elk Collect, search and visualise log data with … 1004 [OK] qnib/elk Dockerfile providing ELK services (Elasticse… 108 [OK] willdurand/elk Creating an ELK stack could not be easier. 103 [OK] sebp/elkx Collect, search and visualise log data with … 40 [OK] elkarbackup/elkarbackup ElkarBackup is a free open-source backup sol… 14 [OK] elkozmon/zoonavigator-web This repository is DEPRECATED, use elkozmon/… 13 grubykarol/elk-docker elk docker image (derived from spujadas/elk-… 7 [OK] ...............................................省略................................................
选第一个,星最多
二,制作安装elk配置文件
1,生成namespace配置文件elk-namespace.yaml
[root@bigserver3 elk]# cat elk-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: elk
labels:
name: elk
[root@bigserver3 elk]# kubectl apply -f elk-namespace.yaml //执行
[root@bigserver3 elk]# kubectl get ns //查看namespace
NAME STATUS AGE
default Active 11d
elk Active 7h5m //执行成功
kube-node-lease Active 11d
kube-public Active 11d
kube-system Active 11d
kubernetes-dashboard Active 10d
2,配置elk logstash容器里面配置
[root@bigserver3 elk]# cat elk-logstash-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: logstash-config
namespace: elk
data:
02-beats-input.conf: |
input {
beats {
port => 5044
}
}
30-output.conf: |
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
manage_template => false
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
}
}
10-syslog.conf: |
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
syslog_pri { }
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
11-nginx.conf: |
filter {
if [type] == "nginx-access" {
grok {
match => { "message" => "%{NGINXACCESS}" }
}
}
}
[root@bigserver3 elk]# kubectl create -f elk-logstash-configmap.yaml //创建
configmap/logstash-config created
[root@bigserver3 elk]# kubectl get configmap -n elk //查看
NAME DATA AGE
logstash-config 4 32m
其实有input,output就够了。
3,配置elk-deployment.yaml
[root@bigserver3 elk]# cat elk-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: elk
namespace: elk
labels:
app: elk
spec:
replicas: 1
selector:
matchLabels:
app: elk
template:
metadata:
labels:
app: elk
spec:
nodeSelector:
nodetype: elk
containers:
- name: elk
image: sebp/elk
tty: true
ports:
- containerPort: 5601
- containerPort: 5044
- containerPort: 9200
volumeMounts:
- name: data
mountPath: /var/lib/elasticsearch
- name: logstash-volume
mountPath: /etc/logstash/conf.d
initContainers:
- name: fix-permissions
image: busybox
command: ["sh", "-c", "chmod 777 -R /var/lib/elasticsearch"]
securityContext:
privileged: true
volumeMounts:
- name: data
mountPath: /var/lib/elasticsearch
- name: increase-vm-max-map
image: busybox
command: ["sysctl", "-w", "vm.max_map_count=262144"]
securityContext:
privileged: true
- name: increase-fd-ulimit
image: busybox
command: ["sh", "-c", "ulimit -n 65536"]
securityContext:
privileged: true
volumes:
- name: data
hostPath:
path: /var/lib/elasticsearch
- name: logstash-volume
configMap:
name: logstash-config
items:
- key: 02-beats-input.conf
path: 02-beats-input.conf
- key: 30-output.conf
path: 30-output.conf
- key: 10-syslog.conf
path: 10-syslog.conf
- key: 11-nginx.conf
path: 11-nginx.conf
[root@bigserver3 elk]# kubectl create --validate -f elk-deployment.yaml
deployment.apps/elk created //创建deployment
解释:
a),namespace: elk,是elk是空间名,上一步创建的
b),nodeSelector:
nodetype: elk,这里的nodetype: elk是设置的label名,创建方法如下:
[root@bigserver3 elk]# kubectl label nodes bigserver2 nodetype=elk node/bigserver2 labeled [root@bigserver3 elk]# kubectl get nodes --show-labels |grep elk //查看
整体的意思是,选择label为elk的节点,启动pod。如果取消该配置,在什么节点启动pod,由k8s自己决定。
如果nodeSelector配置错误,有以下二点表现:
[root@bigserver3 elk]# kubectl get pod -n elk
NAME READY STATUS RESTARTS AGE
elk-86788c944f-jpwr4 0/1 Pending 0 15m
[root@bigserver3 elk]# kubectl describe pods/elk-86788c944f-jpwr4 -n elk
Name: elk-86788c944f-jpwr4
Namespace: elk
Priority: 0
Node:
Labels: app=elk
pod-template-hash=86788c944f
Annotations:
Status: Pending
IP:
IPs:
Controlled By: ReplicaSet/elk-86788c944f
Containers:
elk:
Image: sebp/elk
Ports: 5601/TCP, 5044/TCP, 9200/TCP
Host Ports: 0/TCP, 0/TCP, 0/TCP
Environment:
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-v7xtf (ro)
Conditions:
Type Status
PodScheduled False
Volumes:
default-token-v7xtf:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-v7xtf
Optional: false
QoS Class: BestEffort
Node-Selectors: type=elk
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling default-scheduler 0/3 nodes are available: 3 node(s) didn't match node selector.
Warning FailedScheduling default-scheduler 0/3 nodes are available: 3 node(s) didn't match node selector.
pod的状态是pending状态。didn't match node selector,没有匹配到任何节点来启动pod。
c),command: ["sysctl", "-w", "vm.max_map_count=262144"],如果这步不设置,也是启动不了的。报以下错误
ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
ERROR: Elasticsearch did not exit normally - check the logs at /var/log/elasticsearch/elasticsearch.log
k8s的deployment的配置非常多,上面几个配置是要重点注意的。
d),将configmap转化成容器内部的配置文件,下面是转化前后对比
4,配置elk-elastic.yaml
[root@bigserver3 elk]# cat elk-elastic.yaml
apiVersion: v1
kind: Service
metadata:
name: elk-elastic
namespace: elk
spec:
type: ClusterIP
ports:
- port: 9200
targetPort: 9200
selector:
app: elk
[root@bigserver3 elk]# kubectl create -f elk-elastic.yaml
service/elk-elastic created
注释:type: ClusterIP
ClusterIP:通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的 ServiceType。
NodePort:通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。通过请求 <NodeIP>:<NodePort>,可以从集群的外部访问一个 NodePort 服务。
LoadBalancer:使用云提供商的负载局衡器,可以向外部暴露服务。外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务。
ExternalName:通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容(例如, foo.bar.example.com)。 没有任何类型代理被创建。
到底是使用ClusterIP,NodePort或者其他,根据实际情况来。如果需要node间能访问,就需要NodePort。
5,配置elk-kibana.yaml
[root@bigserver3 elk]# cat elk-kibana.yaml
apiVersion: v1
kind: Service
metadata:
name: elk-kibana
namespace: elk
spec:
type: NodePort
ports:
- port: 5601
nodePort: 30009
selector:
app: elk
[root@bigserver3 elk]# kubectl create -f elk-kibana.yaml
service/elk-kibana created
6,配置elk-logstash.yaml
[root@bigserver3 elk]# cat elk-logstash.yaml
apiVersion: v1
kind: Service
metadata:
name: elk-logstash
namespace: elk
spec:
type: ClusterIP
ports:
- port: 5044
targetPort: 5044
selector:
app: elk
[root@bigserver3 elk]# kubectl create -f elk-logstash.yaml
service/elk-logstash created
在安装过程中,会牵扯到svc,pod,delpoyment,label的删除与重建,就不在这篇文中说了,后面会单独写一篇,不然就太长了。
三,检查elk是否安装成功
1,pod是否running
[root@bigserver3 elk]# kubectl get pod,svc -n elk NAME READY STATUS RESTARTS AGE pod/elk-ddc4c865b-859ks 1/1 Running 0 3h23m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/elk-elastic ClusterIP 10.1.40.47 <none> 9200/TCP 3h10m service/elk-kibana NodePort 10.1.7.179 <none> 5601:30009/TCP 3h8m service/elk-logstash ClusterIP 10.1.166.240 <none> 5044/TCP 3h8m
2,k8s Dashboard,中是状态是否健康
3,ssh到pod中,es,logstash进程是否启动
[root@bigserver3 elk]# kubectl -n elk exec -it elk-ddc4c865b-859ks -- /bin/bash root@elk-ddc4c865b-859ks:/# ps PID TTY TIME CMD 325 pts/1 00:00:00 bash 339 pts/1 00:00:00 ps root@elk-ddc4c865b-859ks:/# ps aux |grep elasticsearch root@elk-ddc4c865b-859ks:/# ps aux |grep logstash
4,kibana是否可以访问
如果以上都没有什么问题,说明安装成功了。后面会讲一讲,客户端filebeat的安装和使用。
转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/cloud/2408.html




