为了将测试环境、仿真环境和生产环境的ELK合并为一个部署到K8s中管理,作一些测试验证,并尝试集成STS单点登录。
测试NFS可用性
测试应用使用的MySQL数据目录是通过NFS挂载的,每GET请求一次
http://192.168.100.157:9000/visit/add/
会新增一条记录到数据库。通过脚本每0.01秒请求一次,共请求10000次的过程中:当人为停止NFS服务时,MySQL数据目录挂载失效,导致请求接口无法访问;重新开启NFS服务后,恢复正常,并且最终记录总数一致。
NFS供应节点
1 | [root@zabbix02 elk]# cat /etc/exports |
测试节点
1 | [root@157-xxl-job testPV]# df -h |
1 | db: |
查看数据库
1 | mysql> select count(id) from visit_record; |
PV数据恢复验证
文档写入、更新
- 初始写入2个文档
1 | curl -X PUT "http://es.staging.keep.com/customer/_doc/1?pretty" -H 'Content-Type: application/json' -u elastic:elastic -d ' |
- 更新文档
1 | curl -X PUT "http://es.staging.keep.com/customer/_doc/1?pretty" -H 'Content-Type: application/json' -u elastic:elastic -d ' |
- 增加2个文档
1 | curl -X PUT "http://es.staging.keep.com/customer/_doc/3?pretty" -H 'Content-Type: application/json' -u elastic:elastic -d ' |
修改请求的容量
NFS StorageClass Provider自动为ES创建的PV目录为:
1 | [root@zabbix02 ~]# ls /testPV/ |
不删PV仅修改编排的容量需求
1 | # 原先20Gi |
重新部署ES
1 | [root@zabbix02 4cp]# kubectl apply -f es-ss.yml |
因为是statefulset.apps,提示不能直接apply,先delete再apply
1 | [root@zabbix02 4cp]# kubectl delete -f es-ss.yml |
PV目录未变化,并且从Kibana查看数据还是容量变更前的样子
说明不删除已创建的PV情况下,修改请求PV容量值resources.requests.storage
,不影响已有数据。
删PV重建ES
1 | [root@zabbix02 4cp]# sh run-es.sh down |
删除PV后,PV目录被归档
1 | [root@zabbix02 4cp]# ls /testPV/ |
重建后,生成了新的PV目录
1 | [root@zabbix02 4cp]# ls /testPV/ |
显然,之前的保存的文档不在新目录中,查看Kibana也显示没有任何索引:
尝试恢复旧数据如下:
通过移动归档的PV目录替换现在使用的PV目录,并删除es的pod以使其被重新调度:
1 | [root@zabbix02 4cp]# mv /testPV/yhelk-es-data-elasticsearch-0-pvc-cb8ea87c-5912-11ea-ac5d-005056a941c1/ /testPV/yhelk-es-data-elasticsearch-0-pvc-cb8ea87c-5912-11ea-ac5d-005056a941c1.old |
待kibana重新连接es后,显示旧文档已恢复:
数据迁移到新的集群
创建一个新ELK环境
在另一个名称空间 yhelk2 再创建一个ELK环境:
对应的PV目录:
复制迁移数据
先删除刚创建出来的ES,仅保留PVC和PV。如果删除PVC(和PV),原数据(目录)会被归档,重新部署后会重建PV。
再将对应yhelk空间的原有ELK环境的PV目录复制一份替换新ELK环境的PV目录
1 | mv /testPV/yhelk2-es-data-elasticsearch-0-pvc-a2488669-5929-11ea-ac5d-005056a941c1{,.old} |
重建yhelk2空间的ES,因对应的PV目录名称不变,将会加载该目录中的数据。在Kibana中可以看到,新、旧环境ELK中的索引、文档是相同的:
这说明两个不同名称空间的ELK集群的数据,可以通过复制数据目录的方式从一个环境迁移到另一个。可以作出合理推测:1. 如果两个ES集群的节点数一样(对应的PV目录数一样),数据可以通过直接复制的方式迁移。2. ES对供应PV的NFS文件系统是无感知的,NFS文件系统自身扩容、缩容,只要满足pod需求,数据就可以正常使用。
ES账号设置
启用了AD认证后,除了几个内置的用户和已授权的AD账号外,新创建的用户(未被AD管理的)无法使用:
1 | { |
用户组权限设置
只能设置两类权限
1 | PUT /_security/role_mapping/admins |
设置指定用户的权限
刚开始所有用户要么属于elk_admin组,要么属于elk_user组,并具有对应的两类权限。如果要进一步单独设置组内某个用户的权限,可按以下步骤进行:
- 先按传统方法添加一个包含所需权限的角色
- 在kibana手动创建一个与AD账号同名的用户,密码随意设置,并与刚刚创建的角色绑定
- 以该用户名及相应的AD密码登录Kibana即可发现权限已变更
1 | # 查看、删除admins的role_mapping |
索引名称规范
建议按
<环境名称>.<系统>[.<应用>][.<日志类型>]_<YYYY.MM.dd>
的形式取索引名称,例如:
dev.etms.webhost.error-log_2020.02.28
据以上,可以针对 项目组及个人设置ELK权限。比如设置ETMS组成员dev环境的权限:
- 创建角色
role_etms_dev
1 | PUT /_security/role/role_etms_dev |
- 创建etms组成员AD账号同名的ES账号并绑定角色
- 登录查看效果
ELK集成STS登录调试过程记录
因为ES不支持在配置文件中直接配置:rp.client_secret ,以及其它一些集成OpenID的参数设置不清晰,作了如下大量尝试:
使用配置字典的方式
OIDC realm配置到es-cm.yml
1 | apiVersion: v1 |
kb-cm.yml
1 | xpack.security.authc.providers: [oidc, basic] |
错误信息如下:
1 | "Caused by: java.lang.IllegalArgumentException: unknown setting [xpack.security.authc.realms.oidc.oidc1.op.end_session_endpoint] please check that any required plugins are installed, or check the breaking changes documentation for removed settings", |
遇到的异常主要有:
[xpack.security.authc.realms.oidc.oidc1.op.end_session_endpoint] please check that any required plugins are installed, or check the breaking changes documentation for removed settings”
Setting [xpack.security.authc.realms.oidc.oidc1.rp.client_secret] is a secure setting and must be stored inside the Elasticsearch keystore, but was found inside elasticsearch.yml
java.lang.IllegalStateException: security initialization failed”
The configuration setting [xpack.security.authc.realms.oidc.oidc1.rp.client_secret] is required”
使用环境变量+保密字典的方式
1 | apiVersion: v1 |
1 | env: |
报错同上,失败
initContainers方式
1 | spec: |
企图通过initContainer与es共享配置的方式设置rp.client_secret,initContainer正常初始化后,es pod异常退出,主要错误原因如下:
1 | [root@zabbix02 4cp-err]# kubectl logs -f -n yhelk elasticsearch-0 |
失败
直接修改es镜像的方式
直接修改es镜像,在镜像中生成elasticsearch.keystore,并完成其它配置。
1 | FROM lzzeng/es-xpack:7.5.1 |
elasticsearch.yml:
1 | cluster.name: "docker-cluster" |
重新部署,报错如下:
1 | "Caused by: org.elasticsearch.common.settings.SettingsException: found settings for the realm [oidc1] (with type [oidc]) in the secure settings (elasticsearch.keystore), but this realm does not have any settings in elasticsearch.yml. Please remove these settings from the keystore, or update their names to match one of the realms that are defined in elasticsearch.yml - [xpack.security.authc.realms.oidc.oidc1.rp.client_secret]", |
失败
postStart方式
1 | containers: |
再反复根据错误提示修改配置字典,报错信息有:
1 | "Caused by: org.elasticsearch.common.settings.SettingsException: The configuration setting [xpack.security.authc.realms.oidc.oidc1.op.jwkset_path] is required", |
1 | "Caused by: org.elasticsearch.common.settings.SettingsException: The configuration setting [xpack.security.authc.realms.oidc.oidc1.rp.client_secret] is required", |
1 | "Caused by: java.lang.IllegalStateException: OpenID Connect Realm requires that the token service be enabled (xpack.security.authc.token.enabled)", |
1 | {"type": "server", "timestamp": "2020-02-27T01:47:32,863Z", "level": "WARN", "component": "o.e.b.ElasticsearchUncaughtExceptionHandler", "cluster.name": "docker-cluster", "node.name": "elasticsearch-0", "message": "uncaught exception in thread [main]", |
1 | "Caused by: java.lang.IllegalStateException: security initialization failed", |
op.jwkset_path
The path to a file or a URL containing a JSON Web Key Set with the key material that the OpenID Connect Provider uses for signing tokens and claims responses.
当前错误原因:缺少JSON Web密钥集的文件或URL,需由STS提供 op.jwkset_path 信息,以进一步尝试。