kubernetes(k8s) 安装 elk

 

kubernetes(k8s) 安装 elk

 

elk是elasticsearch,logstash,kibana的缩写,组成了日志收集的服务端。在看这篇文章,要先了解以下二篇文章:

ubuntu elasticsearch,logstash,kibana,filebeat安装配置

kubernetes(k8s) 集群 安装配置

 

一,elk的选择

方案一,用k8s分别安装elasticsearch,logstash,kibana,配置要复杂一点,但是灵活度要高一点

方案二,用已集成好的elk来安装,这也本文采取的方式

查看复制打印?

  1. [root@bigserver3 elk]# docker search elk  
  2. NAME                                 DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED  
  3. sebp/elk                             Collect, search and visualise log data with …   1004                                    [OK]  
  4. qnib/elk                             Dockerfile providing ELK services (Elasticse…   108                                     [OK]  
  5. willdurand/elk                       Creating an ELK stack could not be easier.      103                                     [OK]  
  6. sebp/elkx                            Collect, search and visualise log data with …   40                                      [OK]  
  7. elkarbackup/elkarbackup              ElkarBackup is a free open-source backup sol…   14                                      [OK]  
  8. elkozmon/zoonavigator-web            This repository is DEPRECATED, use elkozmon/…   13  
  9. grubykarol/elk-docker                elk docker image (derived from spujadas/elk-…   7                                       [OK]  
  10. ...............................................省略................................................  

选第一个,星最多

二,制作安装elk配置文件

1,生成namespace配置文件elk-namespace.yaml

查看复制打印?

  1. [root@bigserver3 elk]# cat elk-namespace.yaml  
  2. apiVersion: v1  
  3. kind: Namespace  
  4. metadata:  
  5.    name: elk  
  6.    labels:  
  7.      name: elk  
  8.   
  9. [root@bigserver3 elk]# kubectl apply -f elk-namespace.yaml  //执行  
  10. [root@bigserver3 elk]# kubectl get ns  //查看namespace  
  11. NAME                   STATUS   AGE  
  12. default                Active   11d  
  13. elk                    Active   7h5m  //执行成功  
  14. kube-node-lease        Active   11d  
  15. kube-public            Active   11d  
  16. kube-system            Active   11d  
  17. kubernetes-dashboard   Active   10d  

2,配置elk logstash容器里面配置

查看复制打印?

  1. [root@bigserver3 elk]# cat elk-logstash-configmap.yaml  
  2. apiVersion: v1  
  3. kind: ConfigMap  
  4. metadata:  
  5.   name: logstash-config  
  6.   namespace: elk  
  7. data:  
  8.   02-beats-input.conf: |  
  9.     input {  
  10.       beats {  
  11.         port => 5044  
  12.       }  
  13.     }  
  14.   30-output.conf: |  
  15.     output {  
  16.       elasticsearch {  
  17.         hosts => ["127.0.0.1:9200"]  
  18.         manage_template => false  
  19.         index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"  
  20.       }  
  21.     }  
  22.   10-syslog.conf: |  
  23.     filter {  
  24.       if [type] == "syslog" {  
  25.         grok {  
  26.           match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }  
  27.           add_field => [ "received_at", "%{@timestamp}" ]  
  28.           add_field => [ "received_from", "%{host}" ]  
  29.         }  
  30.         syslog_pri { }  
  31.         date {  
  32.           match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]  
  33.         }  
  34.       }  
  35.     }  
  36.   11-nginx.conf: |  
  37.     filter {  
  38.       if [type] == "nginx-access" {  
  39.         grok {  
  40.           match => { "message" => "%{NGINXACCESS}" }  
  41.         }  
  42.       }  
  43.     }  
  44.   
  45. [root@bigserver3 elk]# kubectl create -f elk-logstash-configmap.yaml //创建  
  46. configmap/logstash-config created  
  47.   
  48. [root@bigserver3 elk]# kubectl get configmap -n elk  //查看  
  49. NAME              DATA   AGE  
  50. logstash-config   4      32m  

其实有input,output就够了。

3,配置elk-deployment.yaml

查看复制打印?

  1. [root@bigserver3 elk]# cat elk-deployment.yaml  
  2. apiVersion: apps/v1  
  3. kind: Deployment  
  4. metadata:  
  5.   name: elk  
  6.   namespace: elk  
  7.   labels:  
  8.     app: elk  
  9. spec:  
  10.   replicas: 1  
  11.   selector:  
  12.     matchLabels:  
  13.       app: elk  
  14.   template:  
  15.     metadata:  
  16.      labels:  
  17.        app: elk  
  18.     spec:  
  19.      nodeSelector:  
  20.       nodetype: elk  
  21.      containers:  
  22.      - name: elk  
  23.        image: sebp/elk  
  24.        tty: true  
  25.        ports:  
  26.        - containerPort: 5601  
  27.        - containerPort: 5044  
  28.        - containerPort: 9200  
  29.        volumeMounts:  
  30.        - name: data  
  31.          mountPath: /var/lib/elasticsearch  
  32.        - name: logstash-volume  
  33.          mountPath: /etc/logstash/conf.d  
  34.      initContainers:  
  35.      - name: fix-permissions  
  36.        image: busybox  
  37.        command: ["sh", "-c", "chmod 777 -R /var/lib/elasticsearch"]  
  38.        securityContext:  
  39.          privileged: true  
  40.        volumeMounts:  
  41.        - name: data  
  42.          mountPath: /var/lib/elasticsearch  
  43.      - name: increase-vm-max-map  
  44.        image: busybox  
  45.        command: ["sysctl", "-w", "vm.max_map_count=262144"]  
  46.        securityContext:  
  47.          privileged: true  
  48.      - name: increase-fd-ulimit  
  49.        image: busybox  
  50.        command: ["sh", "-c", "ulimit -n 65536"]  
  51.        securityContext:  
  52.          privileged: true  
  53.      volumes:  
  54.      - name: data  
  55.        hostPath:  
  56.         path: /var/lib/elasticsearch  
  57.      - name: logstash-volume  
  58.        configMap:  
  59.          name: logstash-config  
  60.          items:  
  61.          - key: 02-beats-input.conf  
  62.            path: 02-beats-input.conf  
  63.          - key: 30-output.conf  
  64.            path: 30-output.conf  
  65.          - key: 10-syslog.conf  
  66.            path: 10-syslog.conf  
  67.          - key: 11-nginx.conf  
  68.            path: 11-nginx.conf  
  69.   
  70. [root@bigserver3 elk]# kubectl create --validate -f elk-deployment.yaml  
  71. deployment.apps/elk created  //创建deployment  

解释:

a),namespace: elk,是elk是空间名,上一步创建的

b),nodeSelector:
nodetype: elk,这里的nodetype: elk是设置的label名,创建方法如下:

查看复制打印?

  1. [root@bigserver3 elk]# kubectl label nodes bigserver2 nodetype=elk  
  2. node/bigserver2 labeled  
  3.   
  4. [root@bigserver3 elk]# kubectl get nodes --show-labels |grep elk //查看  

整体的意思是,选择label为elk的节点,启动pod。如果取消该配置,在什么节点启动pod,由k8s自己决定。

如果nodeSelector配置错误,有以下二点表现:

查看复制打印?

  1. [root@bigserver3 elk]# kubectl get pod -n elk  
  2. NAME                              READY   STATUS    RESTARTS   AGE  
  3. elk-86788c944f-jpwr4              0/1     Pending   0          15m  
  4.   
  5. [root@bigserver3 elk]# kubectl describe pods/elk-86788c944f-jpwr4 -n elk  
  6. Name:           elk-86788c944f-jpwr4  
  7. Namespace:      elk  
  8. Priority:       0  
  9. Node:  
  10. Labels:         app=elk  
  11.                 pod-template-hash=86788c944f  
  12. Annotations:  
  13. Status:         Pending  
  14. IP:  
  15. IPs:  
  16. Controlled By:  ReplicaSet/elk-86788c944f  
  17. Containers:  
  18.   elk:  
  19.     Image:        sebp/elk  
  20.     Ports:        5601/TCP, 5044/TCP, 9200/TCP  
  21.     Host Ports:   0/TCP, 0/TCP, 0/TCP  
  22.     Environment:  
  23.     Mounts:  
  24.       /var/run/secrets/kubernetes.io/serviceaccount from default-token-v7xtf (ro)  
  25. Conditions:  
  26.   Type           Status  
  27.   PodScheduled   False  
  28. Volumes:  
  29.   default-token-v7xtf:  
  30.     Type:        Secret (a volume populated by a Secret)  
  31.     SecretName:  default-token-v7xtf  
  32.     Optional:    false  
  33. QoS Class:       BestEffort  
  34. Node-Selectors:  type=elk  
  35. Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s  
  36.                  node.kubernetes.io/unreachable:NoExecute for 300s  
  37. Events:  
  38.   Type     Reason            Age        From               Message  
  39.   ----     ------            ----       ----               -------  
  40.   Warning  FailedScheduling    default-scheduler  0/3 nodes are available: 3 node(s) didn't match node selector. 
  41.   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 elk max_map_count报错 k8s elk max_map_count报错

k8s的deployment的配置非常多,上面几个配置是要重点注意的。

d),将configmap转化成容器内部的配置文件,下面是转化前后对比

4,配置elk-elastic.yaml

  1.  [root@bigserver3 elk]# cat elk-elastic.yaml  
  2. apiVersion: v1  
  3. kind: Service  
  4. metadata:  
  5.   name: elk-elastic  
  6.   namespace: elk  
  7. spec:  
  8.   type: ClusterIP  
  9.   ports:  
  10.        - port: 9200  
  11.          targetPort: 9200  
  12.   selector:  
  13.     app: elk  
  14.   
  15. [root@bigserver3 elk]# kubectl create -f elk-elastic.yaml  
  16. 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

  1. [root@bigserver3 elk]# cat elk-kibana.yaml  
  2. apiVersion: v1  
  3. kind: Service  
  4. metadata:  
  5.   name: elk-kibana  
  6.   namespace: elk  
  7. spec:  
  8.   type: NodePort  
  9.   ports:  
  10.        - port: 5601  
  11.          nodePort: 30009  
  12.   selector:  
  13.     app: elk  
  14.   
  15. [root@bigserver3 elk]# kubectl create -f elk-kibana.yaml  
  16. service/elk-kibana created  

6,配置elk-logstash.yaml

  1. [root@bigserver3 elk]# cat elk-logstash.yaml  
  2. apiVersion: v1  
  3. kind: Service  
  4. metadata:  
  5.   name: elk-logstash  
  6.   namespace: elk  
  7. spec:  
  8.   type: ClusterIP  
  9.   ports:  
  10.        - port: 5044  
  11.          targetPort: 5044  
  12.   selector:  
  13.     app: elk  
  14.   
  15. [root@bigserver3 elk]# kubectl create -f elk-logstash.yaml  
  16. service/elk-logstash created  

在安装过程中,会牵扯到svc,pod,delpoyment,label的删除与重建,就不在这篇文中说了,后面会单独写一篇,不然就太长了。

三,检查elk是否安装成功

1,pod是否running

  1. [root@bigserver3 elk]# kubectl get pod,svc -n elk  
  2. NAME READY STATUS RESTARTS AGE  
  3. pod/elk-ddc4c865b-859ks 1/1 Running 0 3h23m  
  4.   
  5. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE  
  6. service/elk-elastic ClusterIP 10.1.40.47 <none> 9200/TCP 3h10m  
  7. service/elk-kibana NodePort 10.1.7.179 <none> 5601:30009/TCP 3h8m  
  8. service/elk-logstash ClusterIP 10.1.166.240 <none> 5044/TCP 3h8m  

2,k8s Dashboard,中是状态是否健康

k8s Dashboard 查看pod k8s Dashboard 查看pod

3,ssh到pod中,es,logstash进程是否启动

查看复制打印?

  1. [root@bigserver3 elk]# kubectl -n elk exec -it elk-ddc4c865b-859ks -- /bin/bash  
  2. root@elk-ddc4c865b-859ks:/# ps  
  3.  PID TTY TIME CMD  
  4.  325 pts/1 00:00:00 bash  
  5.  339 pts/1 00:00:00 ps  
  6.   
  7. root@elk-ddc4c865b-859ks:/# ps aux |grep elasticsearch  
  8.   
  9. root@elk-ddc4c865b-859ks:/# ps aux |grep logstash  

4,kibana是否可以访问

k8s kibana k8s kibana

如果以上都没有什么问题,说明安装成功了。后面会讲一讲,客户端filebeat的安装和使用。

转载

作者:海底苍鹰
地址:http://blog.51yip.com/cloud/2408.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值