K8S : Helm 部署 ELK 7.6
場景
在 K8S 上部署有狀態應用 ELK,收集日常測試數據的上報(應用撥測的 Heartbeat、調用鏈追蹤的 APM、性能指標 metabeat 等)。本文通過rook提供底層存儲,用於安裝elk的statefulset,然後部署MetalLB實現本地負載均衡,最後通過ingress-control實現訪問kibana。
操作步驟
- 1.安裝rook
- 2.安裝helm
- 3.安裝ES
- 4.安裝kibana
- 5.安裝filebeat
- 6.安裝metalLB
- 7.安裝Ingress-control
- 8.訪問測試
1.安裝rook
1.1 安裝說明
Rook是專用於Cloud-Native環境的文件、塊、對象存儲服務。它實現了一個自我管理的、自我擴容的、自我修復的分佈式存儲服務。Rook支持自動部署、啓動、配置、分配(provisioning)、擴容/縮容、升級、遷移、災難恢復、監控,以及資源管理。爲了實現所有這些功能,Rook依賴底層的容器編排平臺。
Ceph是一個分佈式存儲系統,支持文件、塊、對象存儲,在生產環境中被廣泛應用。
此次安裝就是通過rook進行ceph進行部署,簡化了ceph的安裝管理配置。同時也是爲了能夠利用本地資源。提供storageclass。
1.2 rook和ceph架構
1.2 安裝ceph
git配置文件
git clone --single-branch --branch release-1.2 https://github.com/rook/rook.git
cd cluster/examples/kubernetes/ceph
安裝CRD設置RBAC權限
kubectl apply -f common.yaml
安裝operator,設置ceph啓動的各種資源
kubectl apply -f operator.yaml
安裝ceph集羣
kubectl apply -f cluster-test.yaml
安裝ceph管理工具
kubectl apply -f toolbox.yaml
1.3 注意事項
-
rook的鏡像默認不是從dockerhub下載,大部分是從quay.io倉庫下載,鏡像拉取較慢,如果直接通過kubectl創建,那麼運行時會因爲下載超時而報錯,所以最好提前下載好。
-
據我目前瞭解,rook新版已經不支持掛載本地目錄提供ceph存儲了。所以只能在本地掛載新磁盤了。讓operator程序自動探測發現硬盤設備,併爲之所用。(如果想要掛載本地目錄提供ceph存儲,可以通過更改operator.yml中的ROOK_HOSTPATH_REQUIRES_PRIVILEGED=true,大家可以測試下,我沒試)
-
rook已經使用csi方式掛載ceph,flex方式已逐漸被淘汰。但是使用csi方式有一個大坑,就是kernel>4.10才能正常使用,否則會報很多奇怪的錯誤。例如“rook rpc error: code = Internal desc = an error occurred while running (790) mount -t ceph”,可參考On the failure of Mount PVC by pod
-
如果想使用flex方式掛載ceph,記得在operator.yml中更改“ROOK_ENABLE_FLEX_DRIVER=true”,同時記得創建storageclass.yml時,使用flex目錄下的配置。
-
升級內核可參考 centos7升級內核
-
本地添加磁盤掃描:
echo "- - -" > /sys/class/scsi_host/host*/scan fdisk -l
-
因爲ceph要求3+節點,所以我爲了使用master節點,把master的污點取消了。
kubectl taint node master node-role.kubernetes.io/master:NoSchedule-
1.4 查看運行狀態
查看rook狀態
[root@docker1 ~]# kubectl get pods -n rook-ceph
NAME READY STATUS RESTARTS AGE
csi-cephfsplugin-2gb6l 3/3 Running 0 3h18m
csi-cephfsplugin-hnwkn 3/3 Running 0 3h18m
csi-cephfsplugin-provisioner-7b8fbf88b4-2wchx 4/4 Running 0 3h18m
csi-cephfsplugin-provisioner-7b8fbf88b4-6bjb8 4/4 Running 0 3h18m
csi-cephfsplugin-s5mln 3/3 Running 0 3h18m
csi-rbdplugin-provisioner-6b8b4d558c-2nhrk 5/5 Running 0 3h18m
csi-rbdplugin-provisioner-6b8b4d558c-8n57n 5/5 Running 0 3h18m
csi-rbdplugin-qv5qt 3/3 Running 0 3h18m
csi-rbdplugin-rtsxc 3/3 Running 0 3h18m
csi-rbdplugin-v67hv 3/3 Running 0 3h18m
rook-ceph-crashcollector-docker3-6fbc6c7fc6-trmtz 1/1 Running 0 78m
rook-ceph-crashcollector-docker4-fcb9bf67c-kk7v4 1/1 Running 0 78m
rook-ceph-crashcollector-docker5-7775464c9b-dv4bh 1/1 Running 0 78m
rook-ceph-mds-myfs-a-7f4cdb685d-k9skd 1/1 Running 0 78m
rook-ceph-mds-myfs-b-5847d89857-254d9 1/1 Running 0 78m
rook-ceph-mgr-a-5b5f4588b7-bsf72 1/1 Running 0 3h17m
rook-ceph-mon-a-965f65f76-gv2fv 1/1 Running 0 3h17m
rook-ceph-operator-69f856fc5f-2dp9h 1/1 Running 0 3h19m
rook-ceph-osd-0-7879445dfc-5g48g 1/1 Running 0 3h17m
rook-ceph-osd-1-6bc695c476-v5xzt 1/1 Running 0 3h17m
rook-ceph-osd-2-c96b7b6b7-cnhb7 1/1 Running 0 3h16m
rook-ceph-osd-prepare-docker3-lgrwm 0/1 Completed 0 3h17m
rook-ceph-osd-prepare-docker4-qp56x 0/1 Completed 0 3h17m
rook-ceph-osd-prepare-docker5-q5czc 0/1 Completed 0 3h17m
rook-ceph-tools-7d764c8647-ftxsb 1/1 Running 0 3h15m
rook-discover-bgsf6 1/1 Running 0 3h18m
rook-discover-ldc7k 1/1 Running 0 3h18m
rook-discover-w2wb6 1/1 Running 0 3h18m
查看ceph狀態
kubectl -n rook-ceph get pod -l "app=rook-ceph-tools"
kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l "app=rook-ceph-tools" -o jsonpath='{.items[0].metadata.name}') bash
ceph status
ceph osd status
ceph df
rados df
2. 安裝helm
2.1 安裝說明
helm之於k8s,相當於yum之於centos。是k8s的包管理器。具體使用側參考 helm教程
2.2 安裝helm
安裝helmv3版本
wget https://get.helm.sh/helm-v3.1.2-linux-amd64.tar.gz
tar -xzvf helm-v3.1.2-linux-amd64.tar.gz
cd linux-amd64 && mv helm /usr/bin/
2.3 安裝helm倉庫
添加elk提供的repo倉庫
helm repo add elastichttps://helm.elastic.co
helm repo search elastic
2.4 注意事項
- helmv2已經被拋棄,所以還是安裝helmv3版本吧
3. 安裝 ES
3.1 安裝說明
Elasticsearch
是一個實時的、分佈式的可擴展的搜索引擎,允許進行全文、結構化搜索,它通常用於索引和搜索大量日誌數據,也可用於搜索許多不同類型的文檔。
3.2 安裝ES
helm默認安裝的elastic需要太多空間,所以我把elastic的helm包下載到本地,並修改了volume的值,同時爲了PVC模板能夠匹配,增加了storageClass名稱。
修改statefulsets中的volumeClaimTemplate. 此處的理解可參考kubernetes 關於statefulset的理解
helm pull elastic/elasticsearch
tar -zxvf elasticsearch-7.6.1.tgz
cd elasticsearch
vim values.yaml
volumeClaimTemplate:
storageClassName: "csi-cephfs"
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 3Gi
安裝es
helm install elastic ./
3.3 查看運行狀態
查看 StatefulSet
[root@docker1 elasticsearch]# kubectl get sts -owide
NAME READY AGE CONTAINERS IMAGES
elasticsearch-master 3/3 124m elasticsearch docker.elastic.co/elasticsearch/elasticsearch:7.6.1
查看 Pod,有 3 個節點,同時 Pod 命名帶有序號,和 Deployment 的隨機命名 Pod 不一樣;
[root@docker1 elasticsearch]# kubectl get pods
NAME READY STATUS RESTARTS AGE
elasticsearch-master-0 1/1 Running 0 125m
elasticsearch-master-1 1/1 Running 0 125m
elasticsearch-master-2 1/1 Running 0 125m
查看PVC和storageclass
[root@docker1 elasticsearch]# kubectl get storageclasses.storage.k8s.io
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
csi-cephfs rook-ceph.cephfs.csi.ceph.com Delete Immediate true 137m
[root@docker1 elasticsearch]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
cephfs-pvc Bound pvc-4ebff26d-d2d1-4f61-9d73-9141f631f780 1Gi RWX csi-cephfs 121m
elasticsearch-master-elasticsearch-master-0 Bound pvc-2cb96692-20f1-44ba-a307-3daeb4e7aded 3Gi RWO csi-cephfs 126m
elasticsearch-master-elasticsearch-master-1 Bound pvc-323697ae-065a-4d1b-a9ec-3fabc66a4419 3Gi RWO csi-cephfs 126m
elasticsearch-master-elasticsearch-master-2 Bound pvc-95f070f9-a4e0-4cd0-a8c9-969f69521063 3Gi RWO csi-cephfs 126m
3.4 注意事項
- storageclass和pvc已經創建,但是pod無法掛載。發現kernel>4.10才能正常使用,否則會報很多奇怪的錯誤。例如“rook rpc error: code = Internal desc = an error occurred while running (790) mount -t ceph”,可參考On the failure of Mount PVC by pod
- 注意根據自己的需求修改es配置文件,記得提前更改。
- 如果出現報錯,多用kubectl log,kubectl describe 查找文件所在。
4. 部署 Kibana
4.1 安裝說明
kibana是對elastic數據進行可視化、分析和探索。
4.2 安裝
把kibana的helm包下載到本地,並修改了volume的值。其中
helm pull elastic/kinaba
tar -zxvf kibana-7.6.1.tgz
cd kibana
vim values.yaml
#此處修改了kibana的配置文件,默認位置/usr/share/kibana/kibana.yaml
kibanaConfig:
kibana.yml: |
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: [ "http://elasticsearch-master:9200" ]
#開啓ingress,在後面可以看出效果
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
path: /
hosts:
- kibana-kibana
helm install kibana ./
4.3 查看運行狀態
[root@docker1 kibana]# kubectl get pods -l app=kibana
NAME READY STATUS RESTARTS AGE
kibana-kibana-6b65d94756-p4tr4 1/1 Running 0 74m
4.4 注意事項
-
安裝kibana出錯,狀態爲READY 0/1 ,報錯內容爲{"type":"log","@timestamp":"2020-03-31T10:22:21Z","tags":["warning","savedobjects-service"],"pid":6,"message":"Unable to connect to Elasticsearch. Error: [resource_already_exists_exception] index [.kibana_task_manager_1/mN6of5kpT86Eyyuj9BNDIg] already exists, with { index_uuid=\"mN6of5kpT86Eyyuj9BNDIg\" & index=\".kibana_task_manager_1\" }"},此處刪除es中的.index文件即可。參考鏈接kibana-task-manager error
#此處10.96.193.elasticsearch-master的svc地址. curl -X DELETE http://10.96.193.2:9200/.kibana*
5. 安裝Filebeat
5.1 安裝說明
filebeat是本地文件的日誌數據採集器,可監控日誌目錄或特定日誌文件(tail file),並將它們轉發給Elasticsearch或Logstatsh進行索引、kafka等.
5.2 安裝filebeat
helm install filebeat elastic/filebeat
5.3 查看運行狀態
[root@docker1 ingress]# kubectl get pods -l app=filebeat-filebeat
NAME READY STATUS RESTARTS AGE
filebeat-filebeat-6clnj 1/1 Running 0 18h
filebeat-filebeat-kpzcb 1/1 Running 0 18h
filebeat-filebeat-xpxnz 1/1 Running 0 18h
6. 部署metalLB
6.1 安裝說明
MetalLB可以爲Kubernetes集羣提供了網絡負載平衡器實現。簡而言之,它允許您在本地運行的集羣中創建類型爲“ LoadBalancer”的Kubernetes服務。
在第2層模式下,服務IP的所有流量都流向一個節點。 kube-proxy
將流量傳播到所有服務的Pod。
6.2 安裝metalLB
安裝metallb
kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.9.3/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.9.3/manifests/metallb.yaml
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
使用Layer2 類型配置config文件,增加本地可用地址範圍。
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.14.161-192.168.14.165
kubectl apply -f config.yaml
6.3 查看運行狀態
關於獲取地址的信息,可以在後面ingress-service中lb的地址中看到。
[root@docker1 ingress]# kubectl get pods -n metallb-system
NAME READY STATUS RESTARTS AGE
controller-5c9894b5cd-hrhdf 1/1 Running 0 17m
speaker-68hzp 1/1 Running 0 17m
speaker-892bv 1/1 Running 0 17m
speaker-l9mcg 1/1 Running 0 17m
speaker-m4pbl 1/1 Running 0 17m
speaker-q4jrq 1/1 Running 0 17m
speaker-qwhqm 1/1 Running 0 17m
6.4 注意事項
-
因爲使用Layer 2模式,所以分配的地址,必須是同網段的未用地址。
-
metallb需藉助kube-proxy實現功能,可以選擇kube-proxy實現方式,如果更改成ipvs,可參考配置 MetalLB安裝
-
externalTrafficPolicy可分爲cluster和local兩種方式進行選擇。cluster:kube-proxy在收到流量的節點上進行負載平衡,並將流量分配到服務中的所有Pod。local:
kube-proxy
在收到流量的節點上進行負載平衡,並將流量分配到服務中的所有Pod。 - BGP模式可自行探究。
7. 部署Ingress
7.1 安裝說明
管理對集羣中的服務(通常是HTTP)的外部訪問的API對象。Ingress可以提供負載平衡、SSL終端和基於名稱的虛擬主機。此處是搭配metallb提供地址訪問內部請求。如果不搭配metallb,只使用ingress會在端口選擇這個地方很麻煩。
7.2 安裝ingress
安裝deployment
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
下載修改service文件,將externalTrafficPolicy=Cluster(推薦)。
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/cloud-generic.yaml
kind: Service
apiVersion: v1
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
externalTrafficPolicy: Cluster
type: LoadBalancer
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
ports:
- name: http
port: 80
protocol: TCP
targetPort: http
- name: https
port: 443
protocol: TCP
targetPort: https
---
kubectl apply -f cloud-generic.yaml
7.3 查看運行狀態
查看ingress運行狀態
[root@docker1 ingress]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx LoadBalancer 10.96.25.12 192.168.14.161 80:31622/TCP,443:31187/TCP 20s
訪問80端口進行測試
[root@docker1 ingress]# curl 192.168.14.161
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.17.8</center>
</body>
</html>
8.配置ES訪問
8.1配置說明
安裝kibana的時,已開啓了ingress選項,所以我們可以直接看到ingress信息,如果當時不開啓,我們也可以自己寫一個kibana-ingress.yml 文件。
#配置host的名稱爲kibana-kibana
#配置url後綴匹配地址是/
#配置後端服務名稱爲kibana-kibana,端口是5601
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: kibana
annotations:
# use the shared ingress-nginx
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: kibana-kibana
http:
paths:
- path: /
backend:
serviceName: kibana-kibana
servicePort: 5601
kubectl apply -f kibana-ingress.yaml
8.2 查看運行狀態
[root@docker1 ingress]# kubectl get ingresses.
NAME HOSTS ADDRESS PORTS AGE
kibana-kibana kibana-kibana 192.168.14.161 80 15h
8.3 訪問kibana
我們在本地配置hosts添加192.168.14.161 kibana-kibana(此處的kibana-kibana是ingress中host配置的名稱)。然後網頁直接訪問http://kibana-kibana
kibana沒有開啓xpack功能,所以無法打開monitor了。
添加filebeat索引
查看discover
後續
只是粗略的將elk的集羣搭建起來,後期慢慢整合。
未完待續。