K8S : Helm 部署 ELK 7.6

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架構

rook-architecture-0.png

rook-architecture-2.png

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。

image.png

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了。

image.png

添加filebeat索引

image.png

image.png

image.png

image.png

查看discover

image.png

後續

​ 只是粗略的將elk的集羣搭建起來,後期慢慢整合。

​ 未完待續。

參考:

K8S : Helm 部署 ELK 7.3

StatefulSets

rook官方教程

基於Rook的Kubernetes存儲方案

kubernetes 關於statefulset的理解

centos7升級內核

MetalLB安裝

nginx ingress 控制器原理探究

kibana-task-manager error

helm教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章