Elastic Stack 安装 ElasticSearch和Kibana 存储和可视化监控数据

(2/5) Install ElasticSearch and Kibana to store and visualize monitoring data

Posted by Sunday on 2019-10-31

elasticsearch master

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cat << "EOF" > elasticsearch-master-configmap.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
namespace: monitoring
name: elasticsearch-master-config
labels:
app: elasticsearch
role: master
data:
elasticsearch.yml: |-
cluster.name: ${CLUSTER_NAME}
node.name: ${NODE_NAME}
discovery.seed_hosts: ${NODE_LIST}
cluster.initial_master_nodes: ${MASTER_NODES}

network.host: 0.0.0.0

node:
master: true
data: false
ingest: false

xpack.security.enabled: false
xpack.monitoring.collection.enabled: false
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cat << EOF > elasticsearch-master-service.yaml
---
apiVersion: v1
kind: Service
metadata:
namespace: monitoring
name: elasticsearch-master
labels:
app: elasticsearch
role: master
spec:
ports:
- port: 9300
name: transport
selector:
app: elasticsearch
role: master
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
cat << EOF > elasticsearch-master-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: monitoring
name: elasticsearch-master
labels:
app: elasticsearch
role: master
spec:
replicas: 2
selector:
matchLabels:
app: elasticsearch
role: master
template:
metadata:
labels:
app: elasticsearch
role: master
spec:
containers:
- name: elasticsearch-master
image: docker.elastic.co/elasticsearch/elasticsearch:7.3.0
env:
- name: CLUSTER_NAME
value: elasticsearch
- name: NODE_NAME
value: elasticsearch-master
- name: NODE_LIST
value: elasticsearch-master,elasticsearch-data,elasticsearch-client
- name: MASTER_NODES
value: elasticsearch-master
- name: "ES_JAVA_OPTS"
value: "-Xms256m -Xmx256m"
ports:
- containerPort: 9300
name: transport
volumeMounts:
- name: config
mountPath: /usr/share/elasticsearch/config/elasticsearch.yml
readOnly: true
subPath: elasticsearch.yml
- name: storage
mountPath: /data
volumes:
- name: config
configMap:
name: elasticsearch-master-config
- name: "storage"
emptyDir:
medium: ""
EOF
1
2
3
4
kubectl apply -f .
configmap/elasticsearch-master-config created
deployment.apps/elasticsearch-master created
service/elasticsearch-master created
1
2
3
4
5
6
kubectl get pods -n monitoring 

kubectl get pod -nmonitoring
NAME READY STATUS RESTARTS AGE
elasticsearch-master-57ccbb6df4-f5l2c 1/1 Running 0 12s
elasticsearch-master-57ccbb6df4-lfbwm 1/1 Running 0 12s

local persistent storage

1
2
mkdir root@demo20 "mkdir -p /data/local-volume"
mkdir root@demo21 "mkdir -p /data/local-volume"
1
2
3
4
5
6
7
8
cat << EOF > elasticsearch-data-persistent-storage-class.yaml 
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-volume
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cat << EOF > elasticsearch-data-persistent-storage-demo20.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-volume-demo20
spec:
capacity:
storage: 300Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-volume
local:
path: /data/local-volume
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- demo20
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cat << EOF > elasticsearch-data-persistent-storage-demo21.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-volume-demo21
spec:
capacity:
storage: 300Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-volume
local:
path: /data/local-volume
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- demo21
EOF
1
2
3
4
5
6
7
8
9
kubectl apply -f .

kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
local-volume-demo20 300Gi RWO Retain Available local-volume 4s
local-volume-demo21 300Gi RWO Retain Available local-volume 6s

kubectl get pvc -nmonitoring
No resources found.

elasticsearch data

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cat <<"EOF" > elasticsearch-data-configmap.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
namespace: monitoring
name: elasticsearch-data-config
labels:
app: elasticsearch
role: data
data:
elasticsearch.yml: |-
cluster.name: ${CLUSTER_NAME}
node.name: ${NODE_NAME}
discovery.seed_hosts: ${NODE_LIST}
cluster.initial_master_nodes: ${MASTER_NODES}

network.host: 0.0.0.0

node:
master: false
data: true
ingest: false

xpack.security.enabled: false
xpack.monitoring.collection.enabled: false
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cat << EOF > elasticsearch-data-service.yaml
---
apiVersion: v1
kind: Service
metadata:
namespace: monitoring
name: elasticsearch-data
labels:
app: elasticsearch
role: data
spec:
ports:
- port: 9300
name: transport
selector:
app: elasticsearch
role: data
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
cat << EOF > elasticsearch-data-statefulset.yaml
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
namespace: monitoring
name: elasticsearch-data
labels:
app: elasticsearch
role: data
spec:
serviceName: "elasticsearch-data"
replicas: 2
template:
metadata:
labels:
app: elasticsearch
role: data
spec:
containers:
- name: elasticsearch-data
image: docker.elastic.co/elasticsearch/elasticsearch:7.3.0
env:
- name: CLUSTER_NAME
value: elasticsearch
- name: NODE_NAME
value: elasticsearch-data
- name: NODE_LIST
value: elasticsearch-master,elasticsearch-data,elasticsearch-client
- name: MASTER_NODES
value: elasticsearch-master
- name: "ES_JAVA_OPTS"
value: "-Xms1024m -Xmx1024m"
ports:
- containerPort: 9300
name: transport
volumeMounts:
- name: config
mountPath: /usr/share/elasticsearch/config/elasticsearch.yml
readOnly: true
subPath: elasticsearch.yml
- name: elasticsearch-data-persistent-storage
mountPath: /data/db
volumes:
- name: config
configMap:
name: elasticsearch-data-config
volumeClaimTemplates:
- metadata:
name: elasticsearch-data-persistent-storage
annotations:
volume.beta.kubernetes.io/storage-class: "local-volume"
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: local-volume
resources:
requests:
storage: 50Gi
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
kubectl apply -f .

kubectl get pod -n monitoring | grep data
elasticsearch-data-0 1/1 Running 0 15s
elasticsearch-data-1 1/1 Running 0 10s

kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
local-volume-demo20 300Gi RWO Retain Bound monitoring/elasticsearch-data-persistent-storage-elasticsearch-data-0 local-volume 119s
local-volume-demo21 300Gi RWO Retain Bound monitoring/elasticsearch-data-persistent-storage-elasticsearch-data-1 local-volume 2m1s

kubectl get pvc -n monitoring
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
elasticsearch-data-persistent-storage-elasticsearch-data-0 Bound local-volume-demo20 300Gi RWO local-volume 61s
elasticsearch-data-persistent-storage-elasticsearch-data-1 Bound local-volume-demo21 300Gi RWO local-volume 56s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cat << "EOF" > elasticsearch-client-configmap.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
namespace: monitoring
name: elasticsearch-client-config
labels:
app: elasticsearch
role: client
data:
elasticsearch.yml: |-
cluster.name: ${CLUSTER_NAME}
node.name: ${NODE_NAME}
discovery.seed_hosts: ${NODE_LIST}
cluster.initial_master_nodes: ${MASTER_NODES}

network.host: 0.0.0.0

node:
master: false
data: false
ingest: true

xpack.security.enabled: false
xpack.monitoring.collection.enabled: false
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cat << EOF > elasticsearch-client-service.yaml
---
apiVersion: v1
kind: Service
metadata:
namespace: monitoring
name: elasticsearch-client
labels:
app: elasticsearch
role: client
spec:
ports:
- port: 9200
name: client
- port: 9300
name: transport
selector:
app: elasticsearch
role: client
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
cat << EOF > elasticsearch-client-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: monitoring
name: elasticsearch-client
labels:
app: elasticsearch
role: client
spec:
replicas: 2
selector:
matchLabels:
app: elasticsearch
role: client
template:
metadata:
labels:
app: elasticsearch
role: client
spec:
containers:
- name: elasticsearch-client
image: docker.elastic.co/elasticsearch/elasticsearch:7.3.0
env:
- name: CLUSTER_NAME
value: elasticsearch
- name: NODE_NAME
value: elasticsearch-client
- name: NODE_LIST
value: elasticsearch-master,elasticsearch-data,elasticsearch-client
- name: MASTER_NODES
value: elasticsearch-master
- name: "ES_JAVA_OPTS"
value: "-Xms256m -Xmx256m"
ports:
- containerPort: 9200
name: client
- containerPort: 9300
name: transport
volumeMounts:
- name: config
mountPath: /usr/share/elasticsearch/config/elasticsearch.yml
readOnly: true
subPath: elasticsearch.yml
- name: storage
mountPath: /data
volumes:
- name: config
configMap:
name: elasticsearch-client-config
- name: "storage"
emptyDir:
medium: ""
EOF
1
2
3
4
5
kubectl apply -f .

kubectl get pods -n monitoring | grep client
elasticsearch-client-59b9f79d-csmh6 1/1 Running 0 119s
elasticsearch-client-59b9f79d-q4r22 1/1 Running 0 74s

Kibana

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cat << "EOF" > kibana-configmap.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
namespace: monitoring
name: kibana-config
labels:
app: kibana
data:
kibana.yml: |-
server.host: 0.0.0.0

elasticsearch:
hosts: ${ELASTICSEARCH_HOSTS}
#username: ${ELASTICSEARCH_USER}
#password: ${ELASTICSEARCH_PASSWORD}
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cat << EOF > kibana-service.yaml
---
apiVersion: v1
kind: Service
metadata:
namespace: monitoring
name: kibana
labels:
app: kibana
spec:
type: NodePort
ports:
- port: 5601
name: webinterface
selector:
app: kibana
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
cat <<EOF > kibana-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: monitoring
name: kibana
labels:
app: kibana
spec:
replicas: 1
selector:
matchLabels:
app: kibana
template:
metadata:
labels:
app: kibana
spec:
containers:
- name: kibana
image: registry.xwx.cn/sunday/kibana:7.3.0
ports:
- containerPort: 5601
name: webinterface
env:
- name: ELASTICSEARCH_HOSTS
value: "http://elasticsearch-client.monitoring.svc.cluster.local:9200"
#- name: ELASTICSEARCH_USER
# value: "elastic"
#- name: ELASTICSEARCH_PASSWORD
# valueFrom:
# secretKeyRef:
# name: elasticsearch-pw-elastic
# key: password
volumeMounts:
- name: config
mountPath: /usr/share/kibana/config/kibana.yml
readOnly: true
subPath: kibana.yml
volumes:
- name: config
configMap:
name: kibana-config
EOF
1
2
3
4
5
6
7
8
9
10
11
12
kubectl get pod -nmonitoring | grep kibana
kibana-84bd448bf4-lvdtp 1/1 Running 0 3m38s

kubectl logs -f -n monitoring $(kubectl get pods -n monitoring | grep kibana | sed -n 1p | awk '{print $1}') \
| grep "Status changed from yellow to green" | head -n 3
{"type":"log","@timestamp":"2019-11-05T10:19:22Z","tags":["status","plugin:elasticsearch@7.3.0","info"],"pid":1,"state":"green","message":"Status changed from yellow to green - Ready","prevState":"yellow","prevMsg":"Waiting for Elasticsearch"}
{"type":"log","@timestamp":"2019-11-05T10:19:23Z","tags":["status","plugin:xpack_main@7.3.0","info"],"pid":1,"state":"green","message":"Status changed from yellow to green - Ready","prevState":"yellow","prevMsg":"Waiting for Elasticsearch"}
{"type":"log","@timestamp":"2019-11-05T10:19:23Z","tags":["status","plugin:graph@7.3.0","info"],"pid":1,"state":"green","message":"Status changed from yellow to green - Ready","prevState":"yellow","prevMsg":"Waiting for Elasticsearch"}


kubectl get service -nmonitoring | grep kibana
kibana NodePort 10.103.80.231 <none> 5601:23840/TCP 4m9s

访问宿主机IP:23840

https://kauri.io/article/e5b86351f38940b8a071267062f052cb