K8S 部署 logstash 解析 nginx log 接入ELK_logstash-8(1)
注意:设置config.reload.interval时,一定要带上s(秒),否则会变成以毫秒间隔运行(官方文档还强调这是以秒为单位运行的,结果一开始没有设置单位,cpu瞬间爆满)logstash-xxx.conf 收集任务配置文件,可以有多个.cnf文件,统一挂载到容器的/usr/share/logstash/pipeline目录下即可。同样的pipeline.batch.delay 固定以毫秒
先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注运维)
正文
# api service
apiVersion: v1
kind: Service
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 $DOWN\_LOAD\_URLS;
IFS=',' read -r -a my_array <<< "$DOWN\_LOAD\_URLS";
for URL in "${my\_array[@]}"; do
echo 'URL:'$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
#logstash 使用elastic 做监控(非必需)
#xpack.monitoring.enabled: true
#xpack.monitoring.elasticsearch.username: logstash\_system
#xpack.monitoring.elasticsearch.password: 1q2w3e
#这里必须用 https
#xpack.monitoring.elasticsearch.hosts: "https://es-01-svc.es:9200"
#你的ca.pem 的所在路径
#xpack.monitoring.elasticsearch.ssl.verification\_mode: certificate
#xpack.monitoring.elasticsearch.ssl.certificate\_authority: "/local-certs/elasticsearch-ca.pem"
# 探嗅 es节点,设置为 false
#xpack.monitoring.elasticsearch.sniffing: false
#并行执行管道的过滤器和输出阶段的worker数量。
pipeline.workers: 2
#单个工作线程在尝试执行其筛选器和输出之前将从输入中收集的事件的最大数量。较大的批量大小通常更有效,但是要以增加的内存开销为代价。
# 4000 -> jvm 1536m 默认256
pipeline.batch.size: 512
#在创建 pipeline 事件批处理时,以ms为单位等待每个事件多长时间,然后才向 pipeline 工作者分发小批处理。
pipeline.batch.delay: 500
#pipeline.batch.size 或 pipeline.batch.delay 达到任意一项,则会提交数据给output
#当设置为true时,定期检查配置是否已更改,并在更改时重新加载配置。
config.reload.automatic: true
#Logstash以秒为单位检查配置文件的更改频率,一定要带上单位S,否则会按照单位毫秒去执行
config.reload.interval: 15s
#当设置为true时,将完全编译的配置显示为调试日志消息。还必须设置log.level:debug。
#config.debug: true
#日志级别。fatal,error,warn,info,debug,trace。
log.level: info
#日志格式。设置为json以JSON格式登录,或者直接使用Object#.inspect。
#log.format:
#日志目录位置。
path.logs: /logstash/logs
#哪里可以找到自定义插件。您可以多次指定此设置以包括多个路径。插件应该位于特定的目录层次结构中PATH/logstash/TYPE/NAME.rb,其中TYPE是输入、过滤器、输出或编解码器,而NAME是插件的名称。
#path.plugins:
jvm.options: |
## JVM configuration
-Xms1g
-Xmx1g
### 最后的话
最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
### 资料预览
给大家整理的视频资料:
![](https://img-blog.csdnimg.cn/img_convert/09a51aa2edcf08e2e3b65602c311358a.png)
给大家整理的电子书资料:
![](https://img-blog.csdnimg.cn/img_convert/66330e61eb1d6a74a48e217401eaef9c.png)
**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)**
![img](https://img-blog.csdnimg.cn/img_convert/b318f24ba2e46f609c3ad89b4758fa60.jpeg)
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
339227959)]
给大家整理的电子书资料:
[外链图片转存中...(img-3Ge86lje-1713339227959)]
**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)**
[外链图片转存中...(img-96HIZira-1713339227959)]
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
更多推荐
所有评论(0)