K8S 部署 logstash 解析 nginx log 接入ELK,2024年最新Linux运维-App的设计架构经验谈
外链图片转存中…(img-CY1cFrsI-1712667464647)]
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上
- web
- key: podtype
- labelSelector: #标签选择
matchExpressions: #正则匹配- key: k8s-app
operator: In
values:- logstash
topologyKey: kubernetes.io/hostname
namespaces:
- logstash
- es
- key: k8s-app
- weight: 100 #软亲和匹配条件1,权重100优先级
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=′,′read−r−amyarray<<<"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[@]";doecho′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: xxxvalue: 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:
- containerPort: 9600
-
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: “”
- ReadWriteOnce
---
### 配置文件
一共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运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
12667464647)]
[外链图片转存中…(img-CY1cFrsI-1712667464647)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
[外链图片转存中…(img-E1O4qh67-1712667464647)]
更多推荐
所有评论(0)