K8S 部署 logstash 解析 nginx log 接入ELK,2024年最新Linux运维-App的设计架构经验谈

metadata:
name: logstash-svc
namespace: es
annotations:
desc : logstash集群 服务访问入口
spec:
selector:
k8s-app: logstash
type: ClusterIP #type: ClusterIP【默认】 | NodePort | LoadBalancer(外部负载均衡) | ExternalName (外部DNS解析)
#这里我依然使用了固定ip,便于给负载的nginx管理upstream
clusterIP: 10.106.220.231
ports:
- port: 9600
targetPort: 9600
name: httpport
#nodePort: 32000





---


### StaefulSet


要点说明:


* 由于我的ES开启了SSL验证,因此logstah要使用部署ES时创建的 elasticsearch-ca.pem(详见[前情提要]( ));
* 要解析访问ip的归属地,需要用到geoip的地理位置数据库,这里使用的开源免费maxmind的GeoLite2-City.mmdb,[下载地址]( ) 需要注册用户,有邮箱就行;
* 为了便于自动部署,我借用jenkions做了文件存储,基于jenkins的账号验证提供初级的文件安全保证,使用initContainers在启动容器前,下载所需的证书以及ip地理位置数据,通过配置ENV给容器获取账号、密码,此外还增加禁止下载的ENV变量,以便于在特殊情况下屏蔽下载(比如jenkins 宕机了);
* 由于是把相同配置的logstash容器调度到不同的node上,会存在logstash的pipelines中配置的任务对应的日志信息在本地存储中不存在的情况,这并不会影响logstahs执行
* 配置中涉及的{jenkins\_hosts} 与 {job\_name}为部署的jenkins访问域名与对应的job名称,需要给job配置文件参数,可以指定上传后的文件名与路径{jenkins\_upload\_path},这样在build的时候就可以进行上传了。此外下载后的存储地址{path}也是可以根据需要来修改的,不过要注意在volume中挂在对应的存储目录,以上这些参数都需要根据实际情况自行配置(当然不用jenkins,使用其他存储也可以比如 nfs,每次手动通过kubectl cp 上传也是可以的)
* 使用podAntiAffinity来确保pod会调度到不同的node上;


**K8S部署yml如下**



apiVersion: apps/v1
kind: StatefulSet # Deployment | StatefulSet | DaemonSet | JobSet
metadata:
name: logstash
namespace: es
spec:
replicas: 1 #运行副本数 每台node部署1个与node数量相同
selector:
matchLabels:
k8s-app: logstash #与下方template节点中的 labels 保持一致
revisionHistoryLimit: 10 #设定保留最近的几个revision 用于回滚,默认10
updateStrategy: #更新策略 [Statefulset]
#strategy: #更新策略 [Deployment]
type: RollingUpdate # RollingUpdate (滚动更新) | OnDelete (删除时更新)
rollingUpdate:
#maxSurge: 1 #[Deployment]支持-升级过程中可以启动超过原先设置的POD数量的上限:数量 或 百分比 1 | 20%
#maxUnavailable: 1 #[Deployment]支持-升级过程中无法提供服务的POD数量的上限:数量 或 百分比 1 | 20%,最好与maxSurge保持一致,这样能确保更新过程中的服务能力不会下降
partition: 0 #[Statefulset] 灰度发布控制器,每次只更新部署的pod序号 >= partition的pod,如果有5个pod[0-4],0=更新所有,4=更新1pod,3=更新2pod
persistentVolumeClaimRetentionPolicy: # Retain | Delete
whenDeleted: Delete
whenScaled: Retain
volumeClaimTemplates: #statefulset 专属动态创建pod的存储

  • metadata:
    name: logstash-volume
    spec:
    storageClassName: “local-path” ## 基于PV的动态创建
    accessModes:

    • ReadWriteOnce
      resources:
      requests:
      storage: 10Gi
      template:
      metadata:
      labels:
      k8s-app: logstash
      annotations:
      #“cni.projectcalico.org/ipAddrs”: “[“10.244.220.10”]” #pod绑定固定ip,依赖于calico ipam插件,必须使用calico 3.24.1以上的版本才可以
      spec:
      restartPolicy: Always
      affinity:
      nodeAffinity: # node 亲和度
      preferredDuringSchedulingIgnoredDuringExecution:
      • weight: 100 #软亲和匹配条件1,权重100优先级
        preference:
        matchExpressions:
        • key: podtype
          operator: In
          values:
          • web
            podAntiAffinity:
            requiredDuringSchedulingIgnoredDuringExecution: #反硬亲和,不调度到同一个node上
      • labelSelector: #标签选择
        matchExpressions: #正则匹配
        • key: k8s-app
          operator: In
          values:
          • logstash
            topologyKey: kubernetes.io/hostname
            namespaces:
        • es

    terminationGracePeriodSeconds: 20 #容器被删除变为Terminating状态的等待时间,默认是30s,以便于做一些容器删除前的处理工作
    #imagePullSecrets: #私服认证信息
    #- name: local-registry-key #私服账号secret资源名称,需要单独创建:kubectl create secret generic… 详见:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/pull-image-private-registry/
    initContainers:

    • name: init-logstash
      image: logstash:8.12.2
      #securityContext:

      runAsUser: 0 #由于需要更改挂在目录的归属用户,需要以root运行

      command:

      • “bash”
      • “-c”

      可执行多行命令

      • echo D O W N _ L O A D _ U R L S ; I F S = ′ , ′ r e a d − r − a m y a r r a y < < < " DOWN\_LOAD\_URLS; IFS=',' read -r -a my_array <<< " DOWN_LOAD_URLS;IFS=,readramyarray<<<"DOWN_LOAD_URLS";
        for URL in " m y _ a r r a y [ @ ] " ; d o e c h o ′ U R L : ′ {my\_array[@]}"; do echo 'URL:' my_array[@]";doechoURL:URL;
        FILE=$(echo $URL | awk -F ‘/’ ‘{print $NF}’);
        SAVE_PATH=‘/local-certs’;

        if [ ! -f $SAVE\_PATH"/"$FILE ] || [ "$DOWN\_LOAD" = "true" ];then
            res\_status=$(curl -u $DOWNLOAD\_ACCESS\_USER:$DOWNLOAD\_ACCESS\_PASS -I -m 10 -o /dev/null -s -w %{http\_code} $URL);
            echo 'res\_status: ' $res\_status;
            if [ "$res\_status" != "200" ];then
              echo "===================== "$FILE"不可下载 =======================";
            else
              echo "===================== "$FILE"可下载,执行下载 =======================";
              cd $SAVE\_PATH;
              curl -u $DOWNLOAD\_ACCESS\_USER:$DOWNLOAD\_ACCESS\_PASS $URL -O;
              ls $SAVE\_PATH;
            fi
        else
                echo "===================== "$FILE"已存在 或 ENV:DOWN\_LOAD=false =======================";
        fi
        

        done

      env: #环境变量配置

      • name: DOWN_LOAD
        value: “true”

      • name: “DOWN_LOAD_URLS”
        value: “http://{jenkins_hosts}/job/{job_name}/ws/{jenkins_upload_path}/elasticsearch-ca.pem,http://{jenkins_hosts}/job/{job_name}/ws/{jenkins_upload_path}/GeoLite2-City.mmdb”

      • name: DOWNLOAD_ACCESS_USER
        value: “”

      • name: DOWNLOAD_ACCESS_PASS
        value: “”

      • name: POD_NAME
        valueFrom:
        fieldRef:
        apiVersion: v1
        fieldPath: metadata.name
        volumeMounts:

      • name: logstash-volume #挂载存储目录
        mountPath: /local-certs
        subPath: local-certs
        containers:

      • name: logstash
        image: logstash:8.12.2
        imagePullPolicy: IfNotPresent # IfNotPresent | Always | Never
        securityContext: ##开启特权,因为要调整系统内核

        runAsUser: 0 #由于需要更改挂在目录的归属用户,需要以root运行

        privileged: true

        resources:
        requests:
        memory: “600Mi” #Gi=G Mi=M 只支持整数
        cpu: “250m” #1000m=1cpu (cpu物理线程)
        limits:
        memory: “1256Mi” #Gi=G Mi=M 只支持整数
        cpu: “1000m” #1000m=1cpu (cpu物理线程)
        #securityContext: ###添加参数启用容器root权限

        privileged: true

        ports:

        • containerPort: 9600
          protocol: TCP

        command: [“/bin/sh”,“-c”]
        args: #可以设置多行命令,不过启动后初始化还是推荐使用postStart钩子函数来执行,不能有#注释符
        #将挂载的配置文件同步到默认的ES配置文件中,因为elastic的安全机制,软连接无法生效
        #将${POD_NAME}'.es.ndcto.com添加到本机hosts中,以便于与http.p12中的授信主机名适配

        • |
          cat /config/logstash.yml > /usr/share/logstash/config/logstash.yml;
          cat /config/jvm.options > /usr/share/logstash/config/jvm.options;
          /usr/local/bin/docker-entrypoint
          #sleep 3600;

        env: #环境变量配置
        #- name: xxx

        value: xxx

        • name: POD_NAME
          valueFrom:
          fieldRef:
          apiVersion: v1
          fieldPath: metadata.name
        • name: POD_IP
          valueFrom:
          fieldRef:
          fieldPath: status.podIP
          volumeMounts:
        • name: logstash-volume #logstash数据
          mountPath: /usr/share/logstash/data/
          subPath: data
        • name: logstash-volume #挂载部署目录
          mountPath: /logstash/logs
          subPath: logs
          #- name: logstash-volume #挂载部署目录

        mountPath: /usr/share/logstash/pipeline

        subPath: pipeline

        • name: logstash-pipelines #挂载配置文件
          mountPath: /usr/share/logstash/pipeline
        • name: logstash-volume #挂载存储目录
          mountPath: /local-certs
          subPath: local-certs
        • name: logstash-config #挂载配置文件
          mountPath: /config
        • name: target-logs
          mountPath: /data/logs
          readOnly: true
        • name: host-time #挂载本地时区
          mountPath: /etc/localtime
          readOnly: true
          volumes:
    • name: logstash-config #使用pvc
      configMap: #使用configMap
      name: logstash-config
      defaultMode: 420 #420-644 493-755

    • name: logstash-pipelines #使用pvc
      configMap: #使用configMap
      name: logstash-pipelines
      defaultMode: 420 #420-644 493-755

    • name: host-time
      hostPath: #挂载本地时区
      path: /etc/localtime
      type: “”

    • name: target-logs
      hostPath: #本地日志收集目录
      path: /data/logs
      type: “”





---


### 配置文件


一共3个配置文件  
 logstash.yml logstash的主程序配置  
 jvm.options logstash主程序jvn运行环境的配置  
 logstash-xxx.conf 收集任务配置文件,可以有多个.cnf文件,统一挂载到容器的/usr/share/logstash/pipeline目录下即可


### logstash.yml 和 jvm.options


注意:设置config.reload.interval时,一定要带上s(秒),否则会变成以毫秒间隔运行(官方文档还强调这是以秒为单位运行的,结果一开始没有设置单位,cpu瞬间爆满)  
 同样的pipeline.batch.delay 固定以毫秒间隔运行,也不宜设置过短,否则会频繁线程切换



apiVersion: v1
kind: ConfigMap #配置信息
metadata:
name: logstash-config #es-010配置
namespace: es
data:
logstash.yml: |
http.host: “0.0.0.0”

 #数据存放位置
#path.data: /logstash/data

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
img

12667464647)]
[外链图片转存中…(img-CY1cFrsI-1712667464647)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
[外链图片转存中…(img-E1O4qh67-1712667464647)]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值