一、安装ElasticSearch
安装前提:
- 已经部署好 K8s 集群
- 安装好网络组件(flannel 或 calico)
- 关闭防火墙
1.下载并部署Elastic-Operator
下载 Elastic-Operator 的 yaml 文件,并存放在 elastic-operator.yaml 中:
[root@k8s-master-108 ~]# curl -o elastic-operator.yaml https://download.elastic.co/downloads/eck/1.0.1/all-in-one.yaml
在 master 节点中,输入以下命令:
[root@k8s-master-108 ~]# kubectl apply -f elastic-operator.yaml
customresourcedefinition.apiextensions.k8s.io/apmservers.apm.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/elasticsearches.elasticsearch.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/kibanas.kibana.k8s.elastic.co created
clusterrole.rbac.authorization.k8s.io/elastic-operator created
clusterrolebinding.rbac.authorization.k8s.io/elastic-operator created
namespace/elastic-system created
statefulset.apps/elastic-operator created
serviceaccount/elastic-operator created
validatingwebhookconfiguration.admissionregistration.k8s.io/elastic-webhook.k8s.elastic.co created
service/elastic-webhook-server created
secret/elastic-webhook-server-cert created
检查安装部署情况
[root@k8s-master-108 ~]# kubectl get pods -o wide --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
elastic-system elastic-operator-0 1/1 Running 1 22h 10.244.155.65 k8s-node-110 <none> <none>
要等到 STATUS 变为 Running 状态,且 READY 变为 1/1 时,才算部署完毕。
部分情况下,可能出现长时间后 STATUS 依然未改变为 Running 状态,可通过以下代码查看 pod 部署情况。
[root@k8s-master-108 ~]# kubectl describe pod elastic-operator-0 -n elastic-system
Name: elastic-operator-0
Namespace: elastic-system
Priority: 0
Node: k8s-node-110/10.10.103.110
Start Time: Wed, 18 Aug 2021 20:21:30 +0800
Labels: control-plane=elastic-operator
controller-revision-hash=elastic-operator-598df7bc9d
statefulset.kubernetes.io/pod-name=elastic-operator-0
Annotations: cni.projectcalico.org/podIP: 10.244.155.65/32
cni.projectcalico.org/podIPs: 10.244.155.65/32
Status: Running
IP: 10.244.155.65
IPs:
IP: 10.244.155.65
Controlled By: StatefulSet/elastic-operator
Containers:
manager:
Container ID: docker://4f8768db81cad154d00a0cdf68b28d4e2d448a36ddc63a98f0673b4af88d8377
Image: docker.elastic.co/eck/eck-operator:1.0.1
Image ID: docker-pullable://docker.elastic.co/eck/eck-operator@sha256:fa4fbf738f8f81c39d1a4a0172209f1641ed0115488f16c91dcc4a9a16f42531
Port: 9443/TCP
Host Port: 0/TCP
Args:
manager
--operator-roles
all
--log-verbosity=0
State: Running
Started: Wed, 18 Aug 2021 20:23:05 +0800
Last State: Terminated
Reason: Error
Exit Code: 1
Started: Wed, 18 Aug 2021 20:22:31 +0800
Finished: Wed, 18 Aug 2021 20:23:04 +0800
Ready: True
Restart Count: 1
Limits:
cpu: 1
memory: 150Mi
Requests:
cpu: 100m
memory: 50Mi
Environment:
OPERATOR_NAMESPACE: elastic-system (v1:metadata.namespace)
WEBHOOK_SECRET: elastic-webhook-server-cert
WEBHOOK_PODS_LABEL: elastic-operator
OPERATOR_IMAGE: docker.elastic.co/eck/eck-operator:1.0.1
Mounts:
/tmp/k8s-webhook-server/serving-certs from cert (ro)
/var/run/secrets/kubernetes.io/serviceaccount from elastic-operator-token-zqxxw (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
cert:
Type: Secret (a volume populated by a Secret)
SecretName: elastic-webhook-server-cert
Optional: false
elastic-operator-token-zqxxw:
Type: Secret (a volume populated by a Secret)
SecretName: elastic-operator-token-zqxxw
Optional: false
QoS Class: Burstable
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events: <none>
2.创建ElasticSearch集群
在命令行中,输入以下命令(要注意,不可以使用 tab 缩进,要使用空格,且空格数不能有偏差):
cat <<EOF | kubectl apply -f -
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
spec:
version: 7.6.2
nodeSets:
- name: default
count: 1
config:
node.master: true
node.data: true
node.ingest: true
node.store.allow_mmap: false
EOF
输入完毕,输入如下代码,检查我们部署情况。
[root@k8s-master-108 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
quickstart-es-default-0 0/1 Pending 0 131m
这里由于缺失 pv 和 pvc ,因此会一直处于 Pending 状态,可以通过 describe 代码查看具体状态。
[root@k8s-master-108 ~]# kubectl describe pod quickstart-es-default-0
因此,我们需要在 master 节点下,创建 pvc 和 pv 。在 master 的任意目录下,创建文件 pvc.yml 。
[root@k8s-master-108 ~]# vi pvc.yml
pvc.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: data-pv0
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
claimRef:
namespace: default
name: elasticsearch-data-quickstart-es-default-0
hostPath:
path: "/mnt/data"
部署 pvc.yml
[root@k8s-master-108 ~]# kubectl apply -f pvc.yml
检查 PV 和 PVC 安装情况。
[root@k8s-master-108 ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
data-pv0 2Gi RWO Recycle Bound default/elasticsearch-data-quickstart-es-default-0 manual 22h
[root@k8s-master-108 ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
elasticsearch-data-quickstart-es-default-0 Bound data-pv0 2Gi RWO 23h
重新检查 pod 状态
[root@k8s-master-108 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
quickstart-es-default-0 1/1 Running 0 23h
STATUS 已经改变为 Running 状态,READY 也已经为 1/1 了。ElasticSearch 到这里就安装完毕了。
3.请求ElasticSearch访问
在上面安装 ElasticSearch 的时候,已经部署了一个 ClusterIP 的服务:
[root@k8s-master-108 ~]# kubectl get service quickstart-es-http
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
quickstart-es-http NodePort 10.108.248.211 <none> 9200:31308/TCP 23h
我们需要获取默认用户 elastic 的密码:
[root@k8s-master-108 ~]# PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode)
[root@k8s-master-108 ~]# echo $PASSWORD
w9rxvkpdnh6grg96nwgn9b9b
通过向 ElasticSearch 发送请求,我们可以验证是否可以使用(这里的 10.108.248.211,要和上面 ClusterIP 中 CLUSTER-IP 要一致,9200 为 PORT(S) 前面的端口号。)
[root@k8s-master-108 ~]# curl -u "elastic:$PASSWORD" -k "https://10.108.248.211:9200"
{
"name" : "quickstart-es-default-0",
"cluster_name" : "quickstart",
"cluster_uuid" : "6XAP-egkR_SdBU2Di49KSQ",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
如结果与上文一致,则代表部署成功。
我们检查一下在 namespace 为 default 的情况下,运行的所有服务。
[root@k8s-master-108 ~]# kubectl -n default get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 14d
quickstart-es-default ClusterIP None <none> <none> 23h
quickstart-es-http ClusterIP 10.108.248.211 <none> 9200:31308/TCP 23h
可以看见,quickstart-es-http 是一个 ClusterIP 的服务,要对外暴露自己的端口,我们需要将其改为 NodePort 的服务。
[root@k8s-master-108 ~]# kubectl edit svc quickstart-es-http
找到 ports 部分,修改为下图状态。(nodePort 为外部访问端口地址,将 type 修改为 NodePort )。
修改完后,输入 :wq! 保存退出。
我们再检查一遍服务的状态:
[root@k8s-master-108 ~]# kubectl -n default get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 14d
quickstart-es-default ClusterIP None <none> <none> 23h
quickstart-es-http NodePort 10.108.248.211 <none> 9200:31308/TCP 23h
quickstart-es-http 已经改变为 NodePort 模式。打开同一个网络中的浏览器,输入地址 [https://10.10.103.108:31308](https://10.10.103.108:31308) ,即可访问。<br />地址中,10.10.103.108 为 master 的 IP ,31308 为 quickstart-es-http 的 PORT(S) 后面的端口号。一定要 https 进入,否则无法使用证书。<br />进入地址后,会弹出警告,可点击高级,强行进入网站。进入后,会弹出窗口要求输入账号密码。<br />默认账号为 elastic ,密码可通过在 master 中输入如下代码获取。
[root@k8s-master-108 ~]# kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode
w9rxvkpdnh6grg96nwgn9b9b

进入后如上图显示,即表示成功部署。
二、安装Kibana
1.下载并部署Kibana
在 master 节点上,输入如下代码,可安装并部署 Kibana 。
cat <<EOF | kubectl apply -f -
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: quickstart
spec:
version: 7.6.2
count: 1
elasticsearchRef:
name: quickstart
EOF
由于网络原因,需要较长时间下载,公司网络下约需要半小时到四十分钟。
[root@k8s-master-108 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
quickstart-es-default-0 1/1 Running 0 23h
quickstart-kb-6db7bc7464-qwcrs 1/1 Running 0 4h10m
同理,如果 STATUS 转为 Running 状态,READY 为 1/1 ,则代表部署完成。(注意,这里的 quickstart-kb-6db7bc7464-qwcrs 不会安装在 master 节点上,需要保证以安装网络插件 flannel 或 calico ,否则会出现 STATUS 已经是 Running 状态了,而 READY 还是 0/1 的情况。关于网络插件,这里推荐使用 calico )
部署完毕后,可以通过如下代码检查,如果全部 HEALTH 都为 green 或 yellow ,则代表部署成功,如果部署失败,需要通过 describe 来检查失败原因。
[root@k8s-master-108 ~]# kubectl get elasticsearch
NAME HEALTH NODES VERSION PHASE AGE
quickstart yellow 1 7.6.2 Ready 23h
[root@k8s-master-108 ~]# kubectl get kibana
NAME HEALTH NODES VERSION AGE
quickstart green 1 7.6.2 4h41m
同时要检查服务是否成功运行。
[root@k8s-master-108 ~]# kubectl get service quickstart-kb-http
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
quickstart-kb-http NodePort 10.96.145.248 <none> 5601:31884/TCP 4h41m
[root@k8s-master-108 ~]# kubectl get pod --selector='kibana.k8s.elastic.co/name=quickstart'
NAME READY STATUS RESTARTS AGE
quickstart-kb-6db7bc7464-qwcrs 1/1 Running 0 4h19m
我们还需要修改 quickstart-kb-http 的服务 TYPE,需要通过如下代码进入修改界面:
[root@k8s-master-108 ~]# kubectl edit service quickstart-kb-http
将 type 修改为 NodePort 模式。
修改完毕后,输入 :wq! 保存设置。检查是否设置成功:
[root@k8s-master-108 ~]# kubectl get service quickstart-kb-http
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
quickstart-kb-http NodePort 10.96.145.248 <none> 5601:31884/TCP 4h46m
如果 TYPE 改为 NodePort ,则代表修改成功。
2.请求Kibana访问
在与集群同一个网络下的主机中,在浏览器输入地址 https://10.10.103.108:31884/login 。其中, 10.10.103.108 为 master 的 IP ,31884 为 quickstart-kb-http 服务中,PORT(S) 后面的端口号。同样,需要注意开头必须是 https ,且结尾有个 login 的路由路径。
进入后,与 ElasticSearch 一样,初始账号为 elastic ,密码通过如下代码获取:
[root@k8s-master-108 ~]# kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode; echo
w9rxvkpdnh6grg96nwgn9b9b

至此,Kibana 安装部署完毕。
三、安装Filebeat
1.下载Filebeat配置文件
通过下列代码获取 Filebeat 的配置文件:
[root@k8s-master-108 ~]# curl -L -O https://raw.githubusercontent.com/elastic/beats/master/deploy/kubernetes/filebeat-kubernetes.yaml
2.修改命名空间
下载完后,必须通过修改配置文件,才能部署。通常情况下,Filebeat 中所有的应用都是安装在 kube-system 的 namespace 下,但由于我们的 ElasticSearch 和 Kibana 安装在 default 下,因此需要将配置文件中的所有 namespace 的值改为 default 。
[root@k8s-master-108 ~]# vi filebeat-kubernetes.yaml

由于篇幅原因,这里只截了一张图,实际上远不止这一个地方有 namespace ,需要将所有的 namespace 的值修改为 default 。
3.修改版本
由于我们的 ElasticSearch 和 Kibana 为 7.6.2 版本的,因此我们的 Filebeat 也需要选择 7.6.2 版本适配。因此修改 yaml 文件中对应位置。
由于网络原因,7.6.2 可能无法下载,可以改为 7.5.2 版本,也是适配的。
4.配置证书
另外,我们还需要为访问 ElasticSearch 配置必要的证书来访问它,因此需要修改配置文件中 ConfigMap metadata 为 filebeat-config 的部分。
添加红色框框圈出来的部分。
5.挂载证书
这个证书在当前容器中还不存在,我们还需要如下部分来配置这个证书。
首先我们找到 DaemonSet 这个部分:
apiVersion: apps/v1
kind: DaemonSet
并做如下的修改:<br /><br />红色部分为我们需要添加的部分。
6.配置ElasticSearch服务
根据上面的 DaemonSet 的配置,我们要找到 ELASTICSEARCH_HOST 部分。它需要配置为 ElasticSearch 的服务。先使用下面的命令找到所有的服务:
[root@k8s-master-108 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 14d
quickstart-es-default ClusterIP None <none> <none> 36h
quickstart-es-http NodePort 10.108.248.211 <none> 9200:31308/TCP 36h
quickstart-kb-http NodePort 10.96.145.248 <none> 5601:31884/TCP 17h
其中,quickstart-es-http 就是 Kubernetes 内部可以访问 ElasticSearch 的一个服务,如果要写入到 ElasticSearch ,必须启用这个服务。因此要修改如下红色部分(依然是 filebeat-kubernetes.yaml 文件)<br /><br />这里的 ELASTICSEARCH_HOST 是 quickstart-es-http 的地址,可以用 https://quickstart-es-http 来代替,而 ELASTICSEARCH_PASSWORD 为 ElasticSearch 默认账号 elastic 的密码。<br />到这里我们就配置完成了,可以通过 :wq! 保存并退出。
7.安装Filebeat
上文我们配置完了 Filebeat 的配置文件,然后需要通过 apply 来部署它:
[root@k8s-master-108 ~]# kubectl create -f filebeat-kubernetes.yaml
configmap/filebeat-config created
daemonset.apps/filebeat created
clusterrolebinding.rbac.authorization.k8s.io/filebeat created
rolebinding.rbac.authorization.k8s.io/filebeat created
rolebinding.rbac.authorization.k8s.io/filebeat-kubeadm-config created
clusterrole.rbac.authorization.k8s.io/filebeat created
role.rbac.authorization.k8s.io/filebeat created
role.rbac.authorization.k8s.io/filebeat-kubeadm-config created
serviceaccount/filebeat created
然后,我们可以通过下列命令来查看 pods:
[root@k8s-master-108 ~]# k get pods
NAME READY STATUS RESTARTS AGE
filebeat-lmmk5 0/1 ContainerCreating 0 36s
filebeat-v94bh 0/1 ContainerCreating 0 36s
quickstart-es-default-0 1/1 Running 0 37h
quickstart-kb-6db7bc7464-qwcrs 1/1 Running 0 18h
等到 STATUS 转为 Running ,READY 转为 1/1 ,即表明部署完成。
8.在Kibana中监测数据
打开 Kibana ,转到 Dev Tools 页面,通过如下代码可以查询是否连接成功。
GET _cat/indices

执行后,可以在右边看到 filebeat 已经被监测了。
为 filebeat 创建一个 index pattern ,并在 Discover 里进行查看。



然后稍等一会儿,就创建完成了。
回到 Discovery 界面,即可查看各项数据

四、安装Fluent-bit
1.下载Fluent-bit配置文件
通过下列代码获取 Fluent-bit 配置文件:
kubectl apply -f https://gist.githubusercontent.com/egernst/d8f20021db724ba831a2552ba02027fe/raw/e843dc1049adfc71cec49e7ca60ee73385b3b2fb/fluent-bit-role-sa.yaml
kubectl apply -f https://gist.githubusercontent.com/egernst/d8f20021db724ba831a2552ba02027fe/raw/79ef513c6c8eae656a039fe0ae9a466426e597f1/fluent-bit-configmap.yaml
kubectl apply -f https://gist.githubusercontent.com/egernst/d8f20021db724ba831a2552ba02027fe/raw/3c112c444bb41ab63fb8815337891baf5cfdc4cd/fluent-bit-ds.yaml
2.配置ConfigMap
通过下列代码进入修改 ConfigMap :
[root@k8s-master-108 elk]# vi fluent-bit-configmap.yaml
将下列圈红位置,修改成正确的值
说明:1.Host 为 ElasticSearch 的主机 IP ;2.Port 为 ElasticSearch 的主机中,ElasticSearch 开放端口;3.HTTP_User 为 ElasticSearch 的默认账号;4. HTTP_Passwd 为 ElasticSearch 的默认账号对应密码。
另外,还需要更改 parsers.conf 配置,通过 cri 向每条日志添加时间戳。
前文中,tail 的解析器同样也需要将 Parser 修改为 cri 。
到这里我们就将 ConfigMap 配置完成了,可以通过 :wq! 保存并退出。
3.配置DaemonSet
通过下列代码进入修改 DaemonSet:
[root@k8s-master-108 elk]# vi fluent-bit-ds.yaml
修改红色方框内的内容<br /><br />这里的 ELASTICSEARCH_HOST 是 quickstart-es-http 的地址,可以用 https://quickstart-es-http 来代替,而 ELASTICSEARCH_PASSWORD 为 ElasticSearch 默认账号 elastic 的密码。
4.安装Fluent-bit
通过下面代码安装 Fluent-bit :
[root@k8s-master-108 elk]# kubectl apply -f fluent-bit-configmap.yaml
[root@k8s-master-108 elk]# kubectl apply -f fluent-bit-ds.yaml
[root@k8s-master-108 elk]# kubectl apply -f fluent-bit-role-sa.yaml
等到 fluent-bit 的 STATUS 和 READY 转变为 Running 和 1/1 即可。
[root@k8s-master-108 elk]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
filebeat-drk5h 1/1 Running 0 4d4h 10.10.103.109 k8s-node-109 <none> <none>
filebeat-pttnf 0/1 Pending 0 23h <none> ke-node-113 <none> <none>
filebeat-tl5pf 1/1 Running 0 4d4h 10.10.103.110 k8s-node-110 <none> <none>
fluent-bit-fhrzk 0/1 Terminating 0 21h <none> k8s-node-111 <none> <none>
fluent-bit-gqbtc 1/1 Running 0 34m 172.17.0.2 ke-node-113 <none> <none>
fluent-bit-gxdsw 1/1 Running 0 21h 10.244.219.73 master <none> <none>
fluent-bit-h4c72 1/1 Running 0 21h 10.244.243.164 k8s-node-109 <none> <none>
fluent-bit-rzhbw 1/1 Running 1 3h18m 10.244.155.77 k8s-node-110 <none> <none>
quickstart-es-default-0 1/1 Running 0 3h57m 10.244.155.76 k8s-node-110 <none> <none>
quickstart-kb-6db7bc7464-qwcrs 1/1 Running 0 4d22h 10.244.243.139 k8s-node-109 <none> <none>
5.在Kibana中监测数据
打开 Kibana ,转到 Dev Tools 页面,通过如下代码可以查询是否连接成功。
GET _cat/indices

执行后,可以在右边看到 Fluent-bit 已经被监测了。
为 Fluent-bit 创建一个 index pattern ,并在 Discover 里进行查看。




上图即为创建完成。然后在 Discover 中监测数据即可。

